这篇文章介绍的内容是关于最全最详细的PHP面试题(带有答案),有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
一 选择题
1、请选择以下代码运行的结果:
1 2 3 4 | <?php if ( '1e3' == '1000' ) echo 'LOL' ; ?> |
A 无任何输出结果 B LOL C 不执行且报错
解析:1e3 是 科学计数法 实数的指数形式 为1乘以10的三次方,故‘1e3’=='1000’是成立的,输出echo ‘LOL’;
2、请选出以下代码运行的结果:
1 2 3 4 5 | <?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,写出一下程序的输出结果:
1 2 3 4 5 6 7 8 9 10 11 | <strong><?php $data = [ 'a' , 'b' , 'c' ]; foreach ( $data as $k => $v ){ $v = & $data [ $k ]; } ></strong> |
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,写出一下程序的输出结果:
1 2 3 4 5 6 7 8 9 10 | <strong><?php $a = 0.1; b = 0.7 ; if (a+ $b ==0.8){ echo true; } else { echo false; } ?></strong> |
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
1 2 | <strong><strong> echo $_SERVER [‘REMOTE_ADDR’]; //客户端IP echo gethostbyname (“www.baidu.com”) //服务端</strong></strong> |
1 2 3 4 5 6 7 8 9 10 | $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方式对目录进行遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $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.冒泡排序很实用要记得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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://www.phpxs.com/post/7814/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料