前言

网上有很多关于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一致性如何保证?

答:请参考详解MySQL与Redis数据一致性如何保证