前言
网上有很多关于PHP的面试题,要么排版乱七八糟,要么就是复制粘贴都不知道对错,笔者结合自身面试经验重新整理了一份,望对大家有所帮助。 欢迎评论区留言你所遇到过的难忘的面试题,持续更新.......
1、下面这段代码的运行结果是?
<?php $arr = [1, 2, 3]; foreach ($arr as &$item) { echo $item; } foreach ($arr as $item) { echo $item; }
答:
123 //注意,此时的 $arr = [0=>int(1), 1=>int(2), 2=>&int(3)]; 122 //这一次foreach循环的时候,第一次:$arr = [0=>int(1), 1=>int(2), 2=>&int(1)]; 第二次:$arr = [0=>int(1), 1=>int(2), 2=>&int(2)]; 第三次:$arr = [0=>int(1), 1=>int(2), 2=>&int(2)];
2、下面这段代码的运行结果是?
<?php $a = 1; echo ++$a; echo $a++;
答:
2 //先加再赋值 2 //先赋值再加
3、下面这段代码的运行结果是?
$x=2; echo $x==2 ? '我':$x == 1 ? '你' : '它';
答:
你 //从左到右依次执行。第一个三元表达式的结果是我,然后再第二个结果集就是你
4、下面这段代码的运行结果是?
$a = 3; $b = 5; if($a = 5 || $b = 7) { $a++; $b++; } echo $a . "," . $b;
答:
1,6 //a是1,因为“||”运算符等级高于“=”,所有a的值就是(5||$b=7)这个表达式的值,其值为false,而false加1,仍然是1;后面的表达式中,$b的赋值未运行,所以$b是6;另外 $a++ 和 ++$a 分别是先返回a,在加1和先加1,再返回a
5、下这段面代码的运行结果是?
echo count(strlen(“http://php.net”));
答:
1 //count(var)是用来统计数组或对象的元素个数的。当var是null或者空数组时,结果为0。如果var是普通变量,则返回1。正常情况下返回var中的元素或属性个数
6、使用list()函数需要注意什么?
答:list()是一个语法结构。List($array)是用来快速把数组中的元素赋给一些变量。使用时要注意,$array必须为一个索引数组,并且索引值从0开始。
7、简述php的垃圾收集机制。
答:php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量是否有别名。如果refcount为0时,就回收该变量容器。如果一个zval的refcount减1之后大于0,它就会进入垃圾缓冲区。当缓冲区达到最大值后,回收算法会循环遍历zval,判断其是否为垃圾,并进行释放处理。
8、用php实现一个双向队列。
队列是一种线性表,按照先进先出的原则进行
单向队列:只能从头进,从尾出
双向队列:头尾都可以进出
答:
class DuiLie { private $array = array();//声明空数组 public function setFirst($item){ return array_unshift($this->array,$item);//头入列 } public function delFirst(){ return array_shift($this->array);//头出列 } public function setLast($item){ return array_push($this->array,$item);//尾入列 } public function delLast(){ return array_pop($this->array,$item);//尾出列 } public function show(){ var_dump($this->array);//打印数组 } public function Del(){ unset($this->array);//清空数组 } }
9、冒泡排序,面试前一定要记住哦。
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]) { $tmp = $arr[$j]; $arr[$j] = $arr[$j + 1]; $arr[$j + 1] = $tmp; } } } return $arr; }
10、快速排序,和上面一样,面试前必须牢记。
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); }
11、请说明 PHP 中传值与传引用的区别,什么时候传值什么时候传引用?
答:
按值传递:函数范围内对值的任何改变在函数外部都会被忽略;
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。(优缺点会考到)
12、MySQL数据库中的字段类型varchar和char的主要区别是什么?
答:
1、varchar是可变长度,节省存储空间,char是固定长度。
2、效率方面char类型要快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些。
13、MySQL数据库的常用存储引擎以及它们的区别?
答:
MyISAM:不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,支持全文索引。
InnoDB:支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢,5.6之后支持全文索引。
存储引擎是基于表的,而不是数据库
14、什么是面向对象?主要特征是什么?
答:面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。
15、SESSION 与 COOKIE的区别是什么?这是重点,初、中级面试几乎必问
答:
1、数据存放位置不同:SESSION存储在服务器端,COOKIE保存在客户端。
2、安全程度不同:cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3、性能使用程度不同:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
4、数据存储大小不同:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制
5、会话机制不同
session会话机制:session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息
cookies会话机制:cookie是服务器存储在本地计算机上的小块文本,并随每个请求发送到同一服务器。 Web服务器使用HTTP标头将cookie发送到客户端。在客户端终端,浏览器解析cookie并将其保存为本地文件,该文件自动将来自同一服务器的任何请求绑定到这些cookie。
16、表单中get和post提交方式的区别
答:
1、功能不同:
get是从服务器上获取数据;
post是向服务器传送数据。(这个其实不绝对,都可以传送或者获取数据,只是一般来说是这样用)
2、过程不同:
get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到
post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程
3、获取值不同
对于get方式,服务器端用Request.QueryString获取变量的值
对于post方式,服务器端用Request.Form获取提交的数据
4、传送数据量不同
get传送的数据量较小,不能大于2KB
post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB
5、安全性不同
get安全性非常低
post安全性较高(要是不加密,post和get一样不安全)
17、下面这段代码的运行结果是?
$a = ['a','b']; if (in_array(0, $a)) { echo '在'; } else { echo '不在'; }
答:
在 //是不是很懵逼,可以自己尝试一下
18、浏览器输入url到出现页面经历了什么?
答:
1、输入地址
2、DNS解析
3、TCP连接
4、发送htpp请求
5、返回http响应
6、浏览器解析渲染页面
7、断开连接
更详细内容请参照:浏览器输入url到出现页面经历了什么
19、讲一下MySQL事务隔离级别。(这基本上是必问的一道题)
答:笔者专门写了一篇文章详细的讲述了MySQL事物隔离机制,请参考:MySQL的四种事务隔离级别
20、讲一下PHP所经历的生命周期
答:请参考PHP生命周期所经历的5个阶段
21、mysql与redis一致性如何保证?