编程学习网 > PHP技术 > 一份带上答案与详细解析的PHP面试题,你值得拥有
2021
05-15

一份带上答案与详细解析的PHP面试题,你值得拥有

这篇文章介绍的内容是关于最全最详细的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”)//服务端


6,以下表达式的结果是:


$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;
}


11.快速排序


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面试题(带有答案)的详细内容,更多请关注编程学习网其它相关文章!



扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取