面试过程中经常会遇到各种各样的面试题,那么我们如何才能全面解析,全面了解呢
现在我们就来一一的解析写着面试题:
1、看看面试题都有哪些知识点
php中定义字符串的有几种方法,这几种方法有什么不同
这个面试题好像学习过php的都知道,那么我们能不能延伸出其他的考点呢?
一、单引号
二、双引号
三、heredoc和newdoc 比较类似,我们归为一种
区别:单引号不解析变量
单引号不解析转义字符,只能解析单引号和反斜线本身
变量和变量、变量和字符串、字符串和字符串之间可以用.连接。
双引号解析变量 变量可以使用{ } 包含
双引号解析所有的转义字符
双引号也是可以使用.来连接
那么有了上面的分析,可以很明确的看出 使用单引号的 效率会更高一些。
还有一种就是heredoc和newdoc 这两种都是处理大字符串的。
例如:
$newStr=<<<EOT
sdafsadf
str
str
EOT;
heredoc解析变量 解析全部的转义字符
最后的结束符 EOT; 必须要顶格写
知识点的延伸
数据类型 八大数据类型
(标量、符合、特殊)
标量:字符 整形、
浮点类型
浮点类型不能在计算进行比较,精确的说是不能用于相等
例如:
$a=0.1;
$b=0.7;
if($a+$b==0.8){
echo 1;
}else{
echo 0;
}
这个输出结果 是 0 为什么会这样说?
因为电脑cpu会将数值转换为 二进制的字符 就是01010101 类似这样的值,那么在计算中,就会得到 一个小于0.8 的值,
就是0.79999999...这样的一个值,因此 在电脑中 0.1+0.7 这是不等于 0.8的。
布尔类型:
false的七种情况:
0,0.0,' ' ,'0',false, array(),null,
整形0,浮点0.0,空字串,字符串0,false,空数组,null
数组类型,超全局数据
$GLOBALS:
$_REQUEST:
$_GET:
$_POST:
$_COOKIE:
$_SESSION:
$_SERVER:
$_FILES:
$_ENV:
以上的我们不多说,我们都学过
那么我们着重的来看看 $_SERVER[] 这个全局变量
$_SERVER['REMOTE_ADDR'];获取客户端的IP地址
$_SERVER['SERVER_ADDR'];服务器的IP
$_SERVER['SERVER_NAME'];服务器名称
query_string 访问字符串?后面所有的参数
request_time 访问时间
http_referer 上一级访问的url地址
http_user_agent 访问
request_uri
script_name
php_self
path_info 这个url地址中路径的名称
request_method 访问方法
document_root 文件所在的目录
HTTP_HOST url host 域名的地址
SERVER_PORT 服务器端口
$path="/usr/local/www/weixin/a.jpg";
basename($path) //a.jpg //得到文件的名称
dirname() // /usr/local/www/weixin 这是路径
pathinfo($url) //会得到一个数组,数组包含 dirname basename extension filename 这是数组中的关联属性
例如:
http://www.xiaosongit.com/index.php/user/reg?status=ghost
这个url地址呢,
path_info 就是 user/reg 这的路径
query_string就是这个值:status=ghost
null 三种情况
直接赋值为null
未定义的变量
unset销毁的变量也是null
常量 两种定义方法:
const:const更快,是语言结构
difine:difine是函数
define不能用于类常量的定义,const可以。
常量一经定义,不能被修改,不能被删除
那么为我们预定义的常量有哪些?
__FILE__ 返回所在文件的目录与文件名
__LINE__ 返回行号
__DIR__ 返回所在的目录
__FUNCTION__ 返回函数
__CLASS__ 返回类名
__TRAIT__
__METHOD__ 返回所在类的函数方法
__NAMESPACE__ 类的命名空间
PHP_OS 系统
PHP_VERSION php版本
PHP_EOL 系统换行符
M_PI 圆周率
运算符考点
foo() 和 @foo() 之间的区别
@错误控制符 抑制错误的输出
PHP支持一个错误运算符:@ 。将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都会被忽略掉。
所有的运算符考点
运算符的优先级:
递增递减>算数运算符
大小比较>逻辑与与逻辑或
三目>赋值
括号的使用可以增加代码的可读性,推荐使用。
以下这两种逻辑运算符号是最低的:
and
or
比较运算符
==
===
等值判断 false的七种情况
整形0,浮点0.0,空字串,字符串0,false,空数组,null
递增、递减运算符不影响布尔值
递减null值是没有效果的还是null,递增null值为1
递增和递减在前就先运算后返回,在后就是先返回后运算
以上就是这样的结果
再看看这个结果: 1/1/2
好,我们再看看下面这个方法:
我们来看看这个代码:
null 递减还是null 未定义的变量本身就是null 再次递减也是null
如果未定义的变量进行了递增,那么就是 1 如果再次递增就是2 甚至3,依次类推
逻辑运算符:
短路作用
||与&&与or和and的优先级
那么看看有哪些短路的:
很明显第一个,true
第二个 返回 false 因为前边是 false 后边就不会执行了,因此是 false
$a=false || true; //true
$b=false or true; //false
这个考察点就是 赋值运算符和 逻辑与 逻辑或的 对比。
我们来分析一下这个题: 整体运算是true $a 的值是false
优先级会影响我们最后的结果
真题:
这里的输出结果就是 1 1
true再次递增还是true 不会变成2
true++ 不会变成2 还是true
false++ 还是false ++false 还是false
大于小于运算符号大于逻辑运算符号 因此 3>0 成立 ,然后 把 $a赋值成 true
$b=3>0 这里已经短路了,没有执行
因此 $b的值还是 0
然后通过 $a++ 和 $b++ 因此这样就得出 都是 1
$a=0;
$b=0;
if($a=3>0 || $b=3>0 ){
var_dump($a,$b);
echo "<br>";
$a++;
$b++;
echo $a."\n";
echo $b."\n";
}
因此这里就是 1 1
流程控制考点:
break;
continue;
请列出3中php数组循环操作的语法 ,并注明各种循环的区别
for($a=1;$a=100;$a++){
}
while(){
}
foreach(){
}
分支结构:
for循环只能遍历索引数组,foreach可以遍历索引和关联数组
联合使用list() ,each() 和 while() 循环也是可以遍历索引和关联数组的。
while list each 组合不会reset()
foreach遍历数组会首先进行reset() 操作
if...elseif
在elseif语句中只能有一个表达式为true ,即 在elseif 语句中只能有一个语句块被执行。
多个elseif从句是排斥关系。
在使用if else语句 的一个基本原则就是 要把范围小的语句放在最前面。
switch case default
switch($var)
这个$var 的格式必须是下面的这几种:
和if不同的是,switch后面的控制表达式的数据只能是 整形,浮点类型 或者字符串
其他的不行
continue; 在 switch 中 相当于 break;
调处switch 外的循环可以使用 continue 2; 跳出两层循环。
跳转表,直接跳转到对应的case
真题解答:
php中如何优化多个if...elseif 语句的情况?
1、表达式可能性越大,出现高的就向前提,减少判断的次数,提高效率。
2、如果判断的值为 整形,浮点型、或字符串,那么可以考虑使用 switch 这个方法,从而提高效率。
自定义函数及内部函数考点
真题:
变量的作用域和静态变量
如果函数体内,想要使用全局变量,那么可以使用 global 拿到内部来使用
也可以使用$GLOBALS['outer'];
静态变量 static
static关键字:
1、仅初始化一次
2、初始化时需要赋值
3、每次执行函数该值会保留
4、static修饰的变量是局部的,仅在函数内部有效
5、可以记录函数的调用次数,从而可以再某些条件下终止递归。
应证了 1/2/3条
这就是这个题的执行结果:51
本身 带光标 这行 的输出应该 是 null 但是 null 在页面中任何都不输出,因此就是 51
static 只执行一次,且执行后的结果 一直保留,再次调用就是上一次的值,累加
函数的参数及参数的引用传递
默认情况下,函数参数通过值传递
如果希望修改函数的值,必须通过引用引用传递进行。
如果是这个输出,那么结果 是 2
函数的返回值及引用返回
return
当函数体中 遇到 return 函数体后面的代码不执行。
返回调用函数代码出。
如果不写 return 那么函数自动返回 null
从函数返回一个引用,必须在函数声明和调用函数都是用引用运算符 & 才可以。
name
//请输入你的php代码 function &my(){ static $b=10; //静态变量只初始化一次 return $b; } var_dump(my()); //10 $a=&my(); //这个$a 拿到的就是 $b 的地址引用 $a=100; //那么修改$a的引用地址($b的值为100) var_dump(my()); //100
外部文件的导入
include
require
include 结构会发出一条警告 (E_WARNING)脚本会继续执行
require 会发出一个致命的错误(E_COMPILE_ERROR)导致脚本的终止
include_once()
require_once()
唯一的区别是php会检测该文件是否被包含,如果包含,就不会再次包含了。
系统内置函数
时间处理函数:
date()
strtotime();
mktime()
time()
microtime()
date_default_timezone_set("Asia/Shanghai") //中国时区
IP处理函数:
ip2long();
long2ip()
打印函数:
print()
echo() 可以打印多个变量,可以使用逗号隔开
sprintf
printf
print_r
var_dump()
var_export()
序列化和反序列化
serialize() //序列化
unserialize() 反序列化
字符串处理函数
stristr()
strpos()
strrev() //字符串翻转
数组处理函数:
array_keys() 返回数组的key
array_values() 返回数组的values
array_diff() 返回两个数组的差集
array_intersect(); 返回数组的交集
array_merge() 返回两个数组的合并
array_shift();
aray_unshift()
array_pop()
array_push();从后边放入
sort()
ksort()
shuffle() 打乱数组顺序
$var1=5; $var2=10; function foo(&$my_var){ global $var1; $var1+=2; $var2=4; $my_var+=3; return $var2; } $my_var=5; echo foo($my_var)."<br>"; echo $my_var."<br>"; echo $var1."<br>"; echo $var2."<br>"; $bar='foo'; $my_var=10; echo $bar($my_var);
这道题的输出结果就是:4 8 7 10 4
正则表达式考察
手机号的正则表达式编写
背下来不是特别灵活,希望灵活的掌握
正则表达式的组成部分
正则表达式的作用:分割,查找,匹配,替换
正则表达式 分隔符: / # 以及取反符号 ~
通用原子: \d \D \w \W \s \S
分别代表什么意思呢?
\d 0-9
\D 0-9 取反
\w a-z A-Z _ 0-9 数字 字母下划线
\W 不是数字 字母下划线
\s 空白符
\S 除了空白符
. 除了换行符的任意字符
* 0个或1个或多个
?0个或一个
+ 一个或多个
^ 以什么什么开头
$ 以什么什么结尾
{n} 恰好出现 n次
{n,} 恰好出现n或大于n次
{n,m} 出现n到m次
[] 集合
() 后向引用
[^]取反
| 或者
[-] 范围
模式修正符
i 不区分大小写
m 每一行进行匹配
e 可以做一些php的处理,
U
u 中文匹配可以用这个。
后向引用
$1 或 \\1
把前面匹配到的,放在后边使用,我们把这种模式叫做后向引用
看个例子吧
$str="<b>abc</b>";
$pattern='/<b>(.*)<\/b>/';
preg_replace($pattern,'\\1',$str); 等同于 preg_replace($pattern,'$1',$str);
这样就把<b>这样的标签去掉了。
以13或15开头的手机号验证格式:
/^13\d{9}|15\d{9}$/
正整数:
/^[1-9]\d*$/
整数 可以包含负数或整数
/^-?[1-9]\d*$/ - 可以有也可以没有
邮箱:
/[\w-]+@[\w-]+\.[\w-\.]+/
贪婪模式
.*? 取消贪婪模式
/U 取消贪婪模式
//请输入你的php代码 $str="<b>abc</b><b>bcd</b>"; $pattern='/<b>(.*?)<\/b>/'; //$pattern='/<b>(.*)<\/b>/U'; //这种方式也以 $str=preg_replace($pattern,'$1',$str); echo($str);
中文匹配的一个点:
匹配源代码中所有的图片 src
这样就能匹配到了。
匹配中文:
$pattern='/[\x{4e00}-\x{9fa5}]+/u';
这就是匹配到的中文字符
$pattern='/[\x{4e00}-\x{9fa5}]+/uU';
如果我们在后面加上一个大写U
那么:
就是如图这种效果了。
文件及目录处理
对于文件读取和写入的操作
目录操作函数和其他文件操作
fopen() 用来打开一个文件 打开需要指定一个打开模式
r r+ r是读模式 r+ 是读写模式 如果是这种模式的话,会替换掉前边的字符
w w+ 当文件不存在会创建一个
a a+ 文件指针会指向末尾,如果文件不存在就会创建一个文件。
x x+ 创建一个文件 x+ 创建并以一个读写的形式打开
b 打开一个二进制
fwrite()
fread()
fgets()
fclose()
file_get_contents()
file_put_contents()
访问远程文件必须开启 allow_url_fopen 这个函数 才能使用curl 等这样的函数。
目录相关的操作函数: basename() pathinfo() dirname()
目录读取: opendir readdir closedir rewinddir
目录删除:rmdir
mkdir
filesize() 文件大小
disk_free_space() 磁盘的剩余空间
disk_total_space() 磁盘总共空间
copy() 文件拷贝
unlink() 删除文件
filetype()
rename()
file_exists()
is_wriable()
filectime()
fileatime() 获取文件最后的访问时间
filemtime() 获取文件最后的修改时间
文件指针:ftell fseek rewind
牢记文件操作函数及文件打开模式
理解目录的操作步骤
尝试练习完成目录的复制和删除函数的编写
切记忽略掉 . 和 ..
真实题:
在一个文件中不断插入helloworld
不断的向hello.txt文件中插入 hello world 字符串,运行 一次 增加一次,运行一次 增加一次。
/* 题型:读取一个文件,然后从开头的位置插入一个hello world 请编写程序 fopen($file,"r"); 解题: 1、以读的形式打开文件 读取文件内容 关闭文件 2、拼接字符串 "hello world".$content 3、以写的形式打开文件 写入文件 关闭文件 */ $dir=dirname(__FILE__); $file=$dir."/hello.txt"; //第一种方法 /*$handle=fopen($file,"r"); $content=fread($handle,filesize($file)); fclose($handle); $handle=fopen($file,"w"); $content="hello world ".$content; fwrite($handle,$content); fclose($handle);*/ //第二种方法 /*$handle=fopen($file,"r"); $content=""; while($fc=fgets($handle,24)){ $content.=$fc; } fclose($handle); $handle=fopen($file,"w"); $content="mm ".$content; fwrite($handle,$content); fclose($handle);*/ //第三种方法 $content=file_get_contents($file); $content="uu".$content; file_put_contents($file,$content);
通过PHP函数的方式对目录进行遍历,写出程序
opendir readdir closedir
在一个目录中,2个文件 、1个目录,此目录下还有多个文件,请写出程序
$dir=dirname(__FILE__); function loopDir($dirPath,$setp=0){ $dirHandle=opendir($dirPath); while(false!==($file=readdir($dirHandle))){ if($file!="." && $file!=".."){ if(filetype($dirPath."/".$file)=="dir"){ echo str_repeat("",$setp)."dir:".$dirPath."/".$file." 文件夹<br>"; loopDir($dirPath."/".$file,$setp++); }else{ echo str_repeat(" ",$setp+1)."file:".$file."<br>"; } } } } loopDir($dir);
会话控制:
PHP的会话控制技术
COOKIE
在客户端保存片段文件
setcookie($name,$val,$exipre,$path,$domain);
$_COOKIE['']; //读取
删除 setcookie($name,'',time()-1000);
cookie放在客户端 不占用服务器资源
用户可以禁止cookie
将重要的文件不安全放在cookie中
SESSION
session基于cookie
sessionid 存储在cookie中
session的值保存在服务器上。
session_start()
//清空session
$_SESSION=[];
session_destroy() 删除session 并删除保存在cook中的sessionID
session.auto_start
session.cookie_domain
session.cookie_lifetime
session.cookie_path
session.name PHPSESSID
session.save_path
session.use_cookies
session.use_trans_sid
session.gc_maxlifetime=1440
比如禁用了cookie 那么如何传输 sessionId?
session_name()=session_id() 放在url地址?的后面
SID 这个上边这个字符串的拼接,如果开启了cookie 那么这个SID是空
类中的魔术方法:
__construct()
__destruct()
__call
__get()
__set()
__clone()
__sleep()
__wakeup()
常见的模式:工厂模式 单例模式 注册数模式 适配器模式 观察者模式 策略模式
开发环境和配置
您是否使用过版本控制软件,如果有您用的版本控制软件的名字是什么
git svn
集中式和分布式
git 分布式 git add .
git的简单命令
git add .
git commit -m "描述"
git rm 删除一个文件
git status 状态
git log
git clone
git init 初始化
allow_url_fopen 是否打开远程文件
allow_url_include date.timezone display_errors error_reporting 错误级别
safe_mode
upload_max_filesize 上传文件最大 max_file_uploads 最大文件数量 post_max_size
请简述 CGI 、fastCGI和PHP-FPM的区别
CGI:是为了联系web服务器与代码解析器的一个协议,是一个桥梁
fastCGI:是cGI的一个改良版本
PHP-FPM:是一个代码解析器的一个进程。
javascript和jquery基本语法与考点
变量的定义:
使用var来声明变量
可以在一行中声明多个变量,多个变量以 逗号 进行分割
声明变量但是不赋值,那么他的值是 undefined
数据类型:字符串 、数字 、布尔、数组、对象、null 、Undefined
javaScript变量均为对象,当声明一个变量时,就创建了一个新的对象。
创建原生对象 new Object {}
函数内部声明的变量(var)是局部变量