这篇文章介绍的内容是关于最全最详细的PHP面试题(带有答案),有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
一 选择题
1、请选择以下代码运行的结果:
<?php if ('1e3' == '1000') echo 'LOL'; ?>
A 无任何输出结果 B LOL C 不执行且报错
解析:1e3 是 科学计数法 实数的指数形式 为1乘以10的三次方,故‘1e3’=='1000’是成立的,输出echo ‘LOL’;
2、请选出以下代码运行的结果:
<?php $a = "aabbzz"; $a++; echo $a; ?>
A b B aabbzz C aabcaa
解析:字符串字母相加其实就是在末尾字母加一 如:$a = “a”; a + + ; 答 应 结 果 就 是 b , a++;答应结果就是 b,a++;答应结果就是b,a=’‘aa’;结果就是ab 故a = " a a b b " ; 打 印 结 果 就 是 a a b c , 如 a = "aabb";打印结果就是 aabc ,如a="aabb";打印结果就是aabc,如a = “aabbz”;结果就是 aabca,因为Z是末尾字母故加一变为a,向前一位进一,b就变为c,故结果为C;
3,写出一下程序的输出结果:
<?php $data = ['a','b','c']; foreach($data as $k=>$v){ $v = &$data[$k]; } >
A $data = ['a','b','c']; B $data = ['b','b','c']; C $data = ['b','c','c'];
解析:这里有个考点要记得 就是&是引用;修改引用变量的值,那么空间的值也会改变,第一次循环 得到KaTeX parse error: Expected 'EOF', got '&' at position 3: v=&̲data[0]=>‘a’,
第二次循环KaTeX parse error: Expected 'EOF', got '&' at position 3: v=&̲data[1]=>‘b’,可见第一次引用的data[0] 的 值 已 经 被 改 变 , 所 以 此 时 的 data[0]的值已经被改变,所以此时的data[0]的值已经被改变,所以此时的data[0]=b,此时v 引 用 的 v引用的v引用的data[1],进入第三次循环 此时$v又变为 KaTeX parse error: Expected 'EOF', got '&' at position 3: v=&̲data[2]=>‘c’,v 又 一 次 改 变 , 引 用 的 v又一次改变,引用的v又一次改变,引用的data[1]的值也被改变为C,所以此时的$data[1]=c,这样循环结束 $data[0]=>‘b’, $data[1]=>‘c’, $data[2]=>‘c’,
4,写出一下程序的输出结果:
<?php $a= 0.1; b = 0.7 ; if(a+$b ==0.8){ echo true; }else{ echo false; } ?>
A 空; B true; C false; D、1;E、0; F:报错
解析:这里的考点有两个:1,echo false和true的值;2、浮点类型不能用于精确计算;首先浮点类型的数据不能用于计算,他会将浮点类型转为二进制,所以有一定的损耗,故它无限接近于0.8,也就是0.79999999…,所以echo 应该是个false;echo false;结果是空;echo true;结果是1;
5,用PHP写出显示客户端的IP和服务端的IP
echo $_SERVER[‘REMOTE_ADDR’];//客户端IP echo gethostbyname(“www.baidu.com”)//服务端
$a= 0; $b= 0; if($a= 3>0 || $b= 3>0){ $a++; $b++; } echo $a,$b;
A报错; B:1,1;(要是真的只有两个选项该多好肯定大家都选B)
解析:此题考查的是运算符的优先级问题,首先在此题中比较运算符>逻辑运算符>赋值,所以1,先看 3>0为true,2,因为是||运算所以后面的b = 3 > 0 形 成 短 路 作 用 , 这 时 的 b=3>0 形成短路作用,这时的b=3>0形成短路作用,这时的a=true,$b=0;
故a + + ; 为 1 ;a++;为1;a++;为1;b++;为1这里解释下布尔类型运算不影响布尔类型结果;但是b = 0 ; b=0;b=0;b++;就改变为1, echo true;结果为1,
二 解答题
7.PHP中如何优化多个if…esleif语句的情况
解析:首先尽可能将表达式可能性越大的越往前面放,其次如果我们判断的内容比较复杂且 判断的值只是字符串,整型,浮点 那么就可以用switch…case来代替
8.用PHP方式对目录进行遍历
$dir = './test'; function loopDir($dir){ $handle = opendir($dir); while(false !==($file =readdir($handle))){ if($file!='.'&&$file!='..'){ echo $file."<br>"; if(filetype($dir.'/'.$file)=='dir'){ loopDir($dir.'/'.$file); } } } } loopDir($dir);
9.请简单叙述 CGI fastCGI h和 PHP-FPM的区别
CGI 代表为了联系PHP 和websevae 的一个桥梁
fastCGI 是CGI的改良版
PHP-FPM 进程管理器
10.冒泡排序很实用要记得
function maopao($arr){ $len = count($arr); $n = count($arr)-1; for($i=0;$i<$len;$i++){ for($j=0;$j<$n;$j++){ if($arr[$j]<$arr[$j+1]){ $temp = $arr[$j+1]; $arr[$j+1] = $arr[$j]; $arr[$j] =$temp; } } } return $arr; }
function quick_sort($array) { if (count($array) <= 1) return $array; $key = $array[0]; $left_arr = array(); $right_arr = array(); for ($i=1; $i<count($array); $i++){ if ($array[$i] <= $key) $left_arr[] = $array[$i]; else $right_arr[] = $array[$i]; } $left_arr = quick_sort($left_arr); $right_arr = quick_sort($right_arr); return array_merge($left_arr, array($key), $right_arr); }
12.请说明 PHP 中传值与传引用的区别,什么时候传值什么时候传引用?
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
按引用传递则不需要复制值,对于性能提高很有好处。
13. MySQL数据库中的字段类型varchar和char的主要区别是什么?
char和varchar最大的不同就是一个是固定长度,一个是可变长度.由于是可变长度,因此存储的是实际字符串再加上一个记录字符串长度的字节。如果分配给char或varchar列的值超过 列的最大长度,则对值进行裁剪.
varchar(M)和char(M),M都表示字符数.varchar的最大长度为65535个字节,不同的编码所对应的最大可存储的字符数不同.char最多可以存放255个字符,不同的编码最大可用字节数不同.
14. SESSION 与 COOKIE的区别是什么?
SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。
Session依赖于cookie进行传递。禁用cookie后,session还可以使用,在存储session的文件中,生成sessionID,通过get传参的方式将sessionID传到要实现session共享的页面,读取sessionID,从而从session中获取数据。
15. 语句include和require的区别是什么?
require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行
include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的化,那么会提示一个错误,但是程序会继续执行下去
16. redis和memcacahe、mongoDB的区别?
都是非关系型数据库,性能都非常高,但是mongoDB和memcache、redis是不同的两种类型。后两者主要用于数据的缓存,前者主要用在查询和储存大数据方面,是最接近数据库的文档型的非关系数据库。
从数据存储位置上来分,memcache的数据存在内存中,而redis既可以存储在内存中,也可以存储的到磁盘中,达到持久化存储的功能,memcache一旦断电,数据全部丢失,redis可以利用快照和AOF把数据存到磁盘中,当恢复时又从磁盘中读取到内存中,当物理内存使用完毕后,可以把数据写入到磁盘中。
从存储数据的类型上来分,memcache和redis存储的方式都是键值对,只不过redis值的类型比较丰富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存储的是字符串。
17.静态化如何实现的?伪静态如何实现?
1、 静态化指的是页面静态化,也即生成实实在在的静态文件,也即不需要查询数据库就可以直接从文件中获取数据,指的是真静态。
实现方式主要有两种:
一种是我们在添加信息入库的时候就生成的静态文件,也称为模板替换技术。
一种是用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。
2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。实习原理是基于Apache或Nginx的rewrite机制。
主要有两种方式:
一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。
另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。
18.说一下单引号双引号?
单引号内部的变量不会执行, 双引号会执行
单引号解析速度比双引号快。
单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。
19.PHP7的新特性?重点
标量类型声明:PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。
返回值类型声明:增加了对返回类型声明的支持。类似于参数类型声明,返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。
NULL 合并运算符:由于日常使用中存在大量同时使用三元表达式和 isset()的情况,NULL 合并运算符使得变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
use 加强:从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了
匿名类:现在支持通过new class 来实例化一个匿名类
20. 常见的 PHP 安全性攻击
SQL注入:用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。
防止:
1 使用mysql_real_escape_string()过滤数据
2 手动检查每一数据是否为正确的数据类型
3 使用预处理语句并绑定变量
4 参数化SQL:是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@或?来表示参数。
XSS攻击 :跨站点脚本攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。
防止:为了防止XSS攻击,使用PHP的htmlentities()函数过滤再输出到浏览器。
CSRF:跨站点请求伪造,是指一个页面发出的请求,看起来就像是网站的信任用户,但是是伪造的
防止:一般来说,确保用户来自你的表单,并且匹配每一个你发送出去的表单。
有两点一定要记住:
1 对用户会话采用适当的安全措施,例如:给每一个会话更新id和用户使用SSL。
2 生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它。如laravel中的 _token
代码注入:代码注入是利用计算机漏洞通过处理无效数据造成的。问题出在,当你不小心执行任意代码,通常通过文件包含。写得很糟糕的代码可以允许一个远程文件包含并执行。如许多PHP函数,如require可以包含URL或文件名。
防止:
过滤用户输入
在php.ini中设置禁用allow_url_fopen和allow_url_include。这将禁用require/include/fopen的远程文件
以上就是最全最详细的PHP面试题(带有答案)的详细内容,更多请关注编程学习网其它相关文章!
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/7814/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料