php面试题(实时更新)- 最全
尽量涵盖,这里只写关于php的,基础肯定是各种字符串操作,数组操作,然后面向对象的理解。其实这里面好多好多东西都是平时用不到的,但这就是基础,面试官问到的东西只是你知道的很少很少一部分,但这就是你们交涉的全部所以还你是得让自己尽可能知道的多。写这些东西没有应试教育的意思,虽然有的东西平时不会用,但对你绝对都是有帮助的
1 PHP是用什么语言编写的
php是用c写的
扩展:php3 php4 php5的主要区别是什么,php6的新特征有哪些?
这个问题真恶心,等我以后心情好了在回答吧
2 目前PHP的最高版本是
2013.9.12现在应该是php5.5
3 PHP的三种注释方式
天啊,我竟然知道两种,太可怕了 # 竟然也是 好吧
4 请列出PHP的8种数据类型
字符串 数组 对象 数值类型 整型 xml 浮点 布尔值 特殊的有Null和resource(说实话我只用过前五种)
5 PHP中有几种形式装载代码,并列举,以包含同目录下的Config.php文件为例?
require include require_once include_once
require一般用在文件的头部包含文件,执行php时包含这个文件使它成为php的一部分
include一般用在流程控制中,用到时再包含
区别是require遇到错误不会往下执行,而include会继续执行
require_once和include_once的作用是避免重复包含,也就是说如果不小心包含了同一个文件,用这两个函数会只包含一次
6 PHP中===表示什么意思,以及与==的区别,什么情况下==是true,===是false
这个问题也是比较常见的,不过巨简单。==是比较表达式两边的值,而===会比较数据类型,比如$a = 1;$b = "1"; ==的话就为true,但===就为false,因为数据类型不同
7 header的作用是什么,以及它的限制
sorry,这个需要先看http协议,等有功夫在回答这个问题,目前只知道这是做跳转用的
8 strstr和stristr的区别
这种字符串操作的方法但凡加了i的一般都是不区分大小写的意思。这里在普及一下strstr的做用吧,strstr默认返回从指定字符到该字符串结束的字符
9 php如何获得浏览器信息
看吧,php能做的事还是不少的,哎,我这么说会不会暴露了我的知识面比较窄的缺陷呢,哈哈
$_SERVER
[
"HTTP_USER_AGENT"
];
平时没用过这些东西
10 什么是URLRewriteing
说说我自己的理解吧,就是伪静态嘛!通过隐藏网页的访问地址以达到更好收录的的效果,可能有不对的地方,欢迎拍砖
11 如何遍历一个文件夹下所有的内容(考中几率非常高)
以前我都嫌麻烦,不去记这些东西,而且平时用的话我都是从网上搜索,但笔试的时候肯定不能让你从网上搜虽然这东西经常被考到,但我可以确定的是你写不出来对你影响不会很大,当然写出来了更好,之前我欧诺个的都是什么opendir 之类的这些傻×函数,刚才我知道了scandir这个函数,这是循环遍历文件夹的函数,非常实用奥
<?php $dir = "."; //当前目录 list_file($dir); function list_file($dir){ $list = scandir($dir); // 得到该文件下的所有文件和文件夹 foreach($list as $file){//遍历 $file_location=$dir."/".$file;//生成路径 if(is_dir($file_location) && $file!="." &&$file!=".."){ //判断是不是文件夹 echo "------------------------sign in $file_location------------------"; list_file($file_location); //继续遍历 } echo "<br/>"; } } ?>
12 二分法和冒泡排序(为什么把这俩在一起说呢,因为他俩都是经常被考到的,而且对于我们的思维逻辑很重要)
二分法 array(1,2,3,4,5,6,7)取出其中一个值的键名
先说一个网上很常见的方法
function Dichotomy($php,$k,$low=0,$max=0) { if(count($php)!= 0 and $max == 0) { $max = count($php); } if($low <= $max) { $mid = intval(($low+$max)/2); if($php[$mid] == $k) { return $mid; } else if($k < $php[$mid]) { return Dichotomy($php,$k,$low,$mid-1); } else { return Dichotomy($php,$k,$mid+1,$max); } } return -1; } $php = array("1","2","3","4","5","6"); echo Dichotomy($php,5); ?>这个方法确实可以,我也试过。但是,我觉得这种方法不好,确切的说是不准确。因为这种方法是以顺序的不间断的数组为基础的,比如上面所说的
$max = count($php);$max很明显不是最大值,而是数组的总长度,所以这里不准确。看看我写的方法吧
function dis($arr,$var) { $max = count($arr); $mid = intval($max/2); if($arr[$mid-1] == $var){ return $mid; } if($arr[$mid-1] >= $var){ $arrs = array_slice($arr,0,$mid); return dis($arrs,$var); }else{ $arrs = array_slice($arr,$mid,$mid); return dis($arrs,$var); } } $arr = array(1,2,3,4,5,6,7,9); echo $a = dis($arr,2);
这里我没有引入最大值最小的概念,只是从数组的中间开始取值判断
冒泡排序
$arr = array(1,5,2,23,64,27); foreach($arr as $key=>$val){ for($i=0;$i<count($arr);$i++){ $var = ""; if($arr[$i] < $arr[$i+1]){ $var = $arr[$i]; $arr[$i] = $arr[$i+1]; $arr[$i+1] = $var; } } } print_r($arr);
太神奇了,刚才我自己手写了一下这段程序。我竟然在没有任何思考的情况下给背下来了,真的是考的多了
这里最重要的是程序里的for循环,普通的if判断只是判断哪个值最大,但这只是比对一遍,外层在加上一个for循环的目的是将当前值跟所有值做比较
13 php常用数组和字符串函数(这对于我们来说是最最最基本和常用的,一定要深刻认识并熟练运用)
数组:这里说的都是常用的大约有20个
1 in_array 判断数组中是否存在某值或某数组
2 is_array 判断是否是数组
3 array_merge 合并数组
4 array_search 搜索某值是否存在于数组中
5 array_slice 分个数组(从数组中取出一段)
6 array_values 建立数字索引
7 array_diff 取差集
8 array_keys返回所有键名
9 array_unique 移除重复的值
10 array_splice 将数组中的值用其他值替换
11 sort asort rsort arsort ksort
12 implode
13 print_r
14 foreach
15 count
16 array_shift 将数组开头 的单元去掉
另外像array_map使用频率不是很高,但这些函数你得知道是做什么的
字符串:
1 substr(截取字符串,这是最最常用的)
2 strlen(获取字符串的长度)
3 strpos(查找字符在字符串中首次出现的位置)
4 str_replace(字符串替换)
5 explode(按照规律将字符串拆分成数组)
6 strtoupper(将所有字母变成大写)
7 strtolower
8 ucfirst(将字符串的首字母变成大写)
9 ucwords(将字符串中每个单词的首字母变成大写)
10 strrev(反转字符串,其实不是很常用)
11 substr_replace(替换字符串的子串,注意与str_replace的区别)
12 strip_tags(去除html和php标记,可以选择保留想要的标签)
13 trim(去除空格)
14 获取一个网页的内容,比如获取www.sina.com.cn的内容
主要有三种方法,掌握其中两种就可以
第一种 使用file_get-contents
第二种,使用fopen先打开一个文件,然后读里面的内容,忽略
第三种使用curl
15 说出php中给变量加密的函数
15.1 md5 单项加密,不能解密。生成32个字符的值
15.2 crypt 单项加密,不能解密。接受两个参数,不传第二个参数时生成的值刷新可变,传入第二个值salt之后,加密的结果不变。且,在不同的系统上算法可能不同
15.3 sha1 单项加密,不能解密。和md5很像,不同的是默认生成40个字符串的值,
15.4 base64_encode() 为双向加密,可以解密。使用base64decode()解密
16 原样输出用户输入的内容,使用哪一个函数?比如用户输入"export<br>export"
htmlspecicalchars 把预定义的字符转换成html实体
17 如何判断一个字符串是否是合法的日期类型如"2017-03-31",要求代码不超过5行
运用date和strtototime进行转换和比较
18 静态和非静态的区别
普通意义上认为静态可以不用实例化就直接调用了,这是和静态的不同。但这是结果,不是原因。为什么我们要使用静态,难道仅仅是为了在不实例化的情况下就调用它?那和我们实例化之后调用有什么区别。
其实静态和非静态的区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快。
静态方法始终调用同一块内存,其缺点就是不能自动进行销毁,而是实例化可以销毁。
19 require比require_once要快,因为后者要先查看是否已经包含要引用的路径
20 如果你需要得到脚本执行时的时间,$_SERVER["REQUSET_TIME"]优于time();
21 str_replace 比preg_replace要快,而strtr比str_replace还要快1/4
另外不要做无谓的替换即使没有替换,str_replace 也会为其参数分配内存。很慢!解决办法:
用 strpos 先查找(非常快),看是否需要替换,如果需要,再替换效率:- 如果需要替换:效率几乎相等,差别在 0.1% 左右。
如果不需要替换:用 strpos 快 200%。
22 $row["id"]比$row[id]速度快7倍 建议养成数组键加引号的习惯;
23 不要在循环里计算数组的长度24 Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。
25 使用ip2long将ip地址转化成整形存入数据库,可节省存储空间
26 对于比较大的字符串在存入数据库之前可以使用gzcompress先进行压缩(前提应该是不需要检索的情况下吧!!!)
27 不要随意复制变量
BAD: $description = $_POST["description"]; echo $description; GOOD: echo $_POST["description"];28 使用选择分支语句 switch case好于使用多个if,else if语句,并且代码更加容易阅读和维护。
29 在可以用file_get_contents替代file、fopen、feof、fgets 它的效果要比其他的高很多
30 用i+=1代替i=i+1
31 对global变量,应该用完就unset()掉;
33 disable_functions 函数,可以禁用某些php内置函数
34 php脚本最长执行时间 php_execuation_time = 30. 默认是30秒
35 memory_limit 设置php脚本处理内存占用的最大内存
36 upload_file_filezize 上传文件的大小限制,默认是2M
37 屏蔽php错误的方法
37.1 最简单的方法,直接在页面写入error_reporting(E_ALL^E_NOTICE^E_WARNING); 可以关闭所有notice 和 warning 级别的错误。
37.2 修改php.ini,将参数display_errors 的值修改为off
37.3 在可能出错的语句前加@,弃用此方法
38 合并两个数组有几种方式,试比较它们的异同
array_merge 合并两个数组,遇到有相同的键名,则第二个键名的值会覆盖第一个
array_merge_recursive 合并数组,遇到有相同的键名的情况,不会覆盖。而是将相同键名的值递归成一个数组
array_combine 函数通过合并两个数组来创建一个新数组,其中的一个数组是键名,另一个数组的值为键值。
39 请写一个函数来检查用户提交的数据是否为整数
function checkType1($var){ if(is_int($var)){ return true; }else{ return false; } } function checkType2($var){ if(floor($var) == $var){ return true; }else{ return false; } }40 字符 字节 汉字 英文字符等等的关系
字节是计算机中的存储单位
字符是计算机中使用的文字和符号。如 1 2 3 a b c 汉 字 ! @ # $等
字节和字符是两个层面的概念,无法直接比较或区分。不同编码里,字符和字节的对应关系不同
1字节=8个二进制位
ASCII中,一个英文字母(不区分大小写)占用一个字节的空间,一个汉字占用2个字节的空间
UTF8中,一个英文字母占用一个字节,一个汉字(含繁体字)占用三个字节
UNICODE中,一个英文字母占用2个字节,一个汉字占用2个字节
41 如何实现PHP的安全最大化?怎样避免SQL注入漏洞和XSS跨站脚本攻击漏洞?
基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交)
41.1 屏蔽错误,将display_errors 设置为off
41.2 过滤用户提交参数,这里需要注意的是不能仅仅通过浏览器端的验证,还需要经过服务器端的过滤
这里是需要注意最多的地方,因为所有用户提交的数据入口都在这里,这是过滤数据的第一步。
1 考虑是否过滤select,insert,update,delete,drop,create等直接操作数据的命令语句
2 使用addslashes 将所有特殊字符过滤
3 打开magic_quotes_gpc,开启该参数数后自动将sql语句转换,将 " 转换成 "
41.3 可以考虑设置统一入口,只允许用户通过指定的入口访问,不能访问未经许可的文件等内容
41.4 可以考虑对于安全性要求高的文件进行来源验证,比如要想执行b.php必须先执行a.php,可以在b.php中判断来自a.php的referer,避免用户直接执行b.php
42 $a++和++$a的区别
前者是先执行表达式,在自增
后者是先自增,在执行表达式
43 合并两个数组的方式,并比较它们的一同
这是一个非常基本也比较考验基础的问题,正因为基础,被考中的几率也非常大
array_merge 简单的合并数组
array_merge_recursive 合并两个数组,如果数组中有完全一样的数据,将它们递归合并
array_combine 合并两个数组,前者的值作为新数组的键
44 请写一个函数来检查用户提交的数据是否为整数(不区分数据类型,可以为二进制、八进制、十进制、十六进制数字)
45 PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换
46 PHP处理上传文件信息数组中的文件类型$_FILES["type"]由客户端浏览器提供,有可能是黑客伪造的信息,请写一个函数来确保用户上传的图像文件类型真实可靠
47 PHP通过对数据的URL编码来实现与Javascript的数据交互,但是对于部分特殊字符的编解码与Javascript的规则不尽相同,请具体说明这种差异,并针对UTF-8字符集的数据,写出PHP的编解码函数和Javascript的编解码函数,确保PHP编码数据可以被Javascript正确解码 、Javascript编码的数据可以被PHP正确解码
48
unset销毁的不是实际存在于内存中的对象,销毁的是指向内存中对象的变量 所以说 $a = 123; $b = $a; unset($a); echo $b; 输出结果123;很明显这种情况,销毁$b对$a没有任何影响,因为$b和$a引用的完全是两个内存中的地址 $a = 123; $b = &$a; unset($a); echo $b; 这种情况,$a和$b指向同一个内存地址,因为unset销毁的是指向内存对象的变量,所以销毁一个对另一个不会产生影响,所以结果扔是123 这是牵扯到php的垃圾回收机制(目前还不太懂) $a = 123; $b = &$a; $a = 456; echo $b; 这时$b的值是456,因为$a $b两个变量指向的是同一块内存地址
49 HTTP常见状态值、作用
200请求成功
401 未授权
403 禁止
404 未找到
500 服务器内部错误
502 网关不可用
503 服务器不可用
504 服务器请求超时
50 tcp/ip、http、udp和ajax之间的关系
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”
“IP”代表网际协议,TCP和UDP使用该协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。
TCP提供有保证的数据传输,而UDP不提供。这意味着TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。
AJAX指代了浏览器端通过javascript发起http请求的一系列技术。主要目的是解决之前web网页无法实现网页局部刷新的问题。因此说,AJAX的核心就是通过javascrit程序调用而发起的一次http请求。
高级面试题
1 isset和empty的区别
isset 检测变量是否设置
当变量不存在或者存在但值为null的情况下,返回false;否则返回true
empty 检测变量值是否为空
当变量不存在或者存在,但值为null,"",0,"0",false,array(),var $var或者任务没有属性的对象时,返回true.
否则返回false
2 将字符串abcdef 翻转的函数
<?php $var = "abcdef"; $len = strlen($var); $res = ""; for($i=$len-1;$i>=0;$i--){ $res .= $var[$i]; } echo $res; ?>
3 多维数据$a1,$a2,$a1与$a2比较,得出$a1中的元素在$a2中的不同部分.
4 将一个多维数组转化成一维数组
<?php function splitArray($array){ static $res = array(); foreach($array as $Key=>$val){ if(is_array($val)){ splitArray($val); }else{ array_push($res,$val); } } return $res; } $array = array(1,2,array(2,array(array(3),array(4),5),6)); $res = splitArray($array); print_r($res); ?>
5 如何安全的发送短信,(即如何防止恶意刷短信)
基本解题思路:定义input.php和send.php,前者允许用户输入手机号,然后提交到后者处理发送行为。
先执行input.php在执行send.php没有任何问题,但考虑到程序开发中的时序性,我们应该设想多种用户可能进行的操作或是恶意操作。比如
input->send 按照逻辑顺序,先执行input.php在执行send.php
input 只执行input.php,不执行第二步
send 只执行send.php,不执行第一步
send->input 先执行send.php,在执行input.php
因为目前只有两个执行文件,所以组合出四种执行方法,即所有用户有可能进行的操作。
因为目前没有进行任何安全防范,所以用户可以循环执行input.php->send.php,从而不断的给用户发短信。
这肯定是错误的,那如何安全防范呢?我们可以在input.php中添加一个验证码,让用户每次都输入验证码通过时才能继续执行send.php,我们将验证码放入到session中,
在send.php中验证,用户输入的验证码和session中的验证码是否相同,如果相同,就发送短信。
那么问题来了,如果用户直接不经过input.php,而直接执行send.php的话呢?因为这时候没有执行input.php,所以也就没有生成验证码的session,而在send.php中,用户也
不输入任何内容,这样就成了‘’==‘’又绕过了一层过滤。这时候大家肯定会想到除了用户输入的验证码和存放在session中的验证码要相等之外还要判断验证码都不能为空。
6 多服务器之间Session共享
6.1 通过cookie共享达到session共享的目的。如何实现呢?我们知道,不同的站点下面的cookie是无法直接通过$_COOKIE来同步共享的。但我们可以攻错curl的cookie共享
来达到共享的目的,做法就是通过curl的参数设置来控制,在点击打开链接这篇文章中我有详细介绍。我们通过获取以登录站点的cookie信息来达到在其他站点也登录目的。
6.2 服务器之间Session数据同步的方式
6.3 利用Mysql数据库共享Session数据的方式
6.4 利用NFS共享Session数据的方式
7 将1234567890转换成1,234,567,890 每3位用逗号隔开的形式
<?php $var = "1234567890"; $len = strlen($var); $res = strrev($var); $a = ""; for($i=0;$i<$len;$i++){ if(($i%3 == 0) && ($i != 0)){ $a.=","; } $a.=$res{$i}; } $a = strrev($a); echo $a; ?>8 一组随机数学的数列,对其重新进行排序,要求实现:奇数位保持奇数,偶数位保持偶数.
我是高级程序员的分割线
以下是期望月薪达到15k的phper们必备的知识点。虽然我们是程序员,但因为我们是做web的,所以需要掌握的知识点比较多。虽然工作中大多数php程序员工作中80%的时间是在做和php有关的工作,但面试的时候大约只有30%是关于php的知识,其他的像数据库、web服务器、缓存引用、对linux的使用也非常重要,下面是我长时间在面试中积累的经验教训,非常客观,希望对大家有所帮助。
1 对php常用设计模式的理解、应用场景使用及其优势(考中几率非常大,这其实是在考差面试者对面向对象的理解和使用情况的掌握程度)
2 对高内聚 低耦合的理解(考中几率不是很大,但作为理解面向对象的重要一步,仍然非常重要)
3 php基本的操作字符串的函数,操作数组的函数和处理时间的函数(必考,基础知识不解释)
4 php的运行原理,包括如何和web服务器通信解析,但不是说如何编译等的问题这个就变态了(考中几率不是很大,不知道面试官问这个的目的是什么,应该是为了装逼吧,但了解了总是好的嘛)
5 魔术方法(考中几率极大,同时也是个基础题,目的在于考差面试者对平时基础的掌握程度)
6 php编码规范(竟然有个面试官问我这个问题,看来他们项目真的是很大啊,虽然我平时也非常注意命名规范之类的东西,但还真不知php有专门指定的编码规范)
7 终极杀招:说说你对面向对象的理解(无语,要死)
8说说关于memcache和redis的区别,应用场景,一致性hash问题(必考,每一个面试官不问这个问题)
9 说说对于hash的理解(属于基础不加分项,必须掌握)
10 关于队列的原理和使用场景(基础不加分项,必须掌握)
11对正则使用的考差(必考,基础,基础,基础)
12 说说你对http协议的掌握程度(考中几率50%以上)
13 关于session cookie,session共享问题(额,大神的话可能不会问你,但这是基础,不会的话,今天的面试基本就pass了)
14 apache和nginx的区别(考中几率不大,甚至可以说很小,为了考差你对web服务区的掌握程度和使用配置情况)
15 app接口开发安全问题(现在php作为app接口开发的后方支持语言,这个问题必须开始重视起来了)
关于mysql的问题实在太多,好像有点说不过来,我说几个方面的问题
16 说说你对索引的理解(必考)
17 常用的优化数据库的方法(必考)
18 常用的linux命令掌握情况以及shell脚本的掌握情况(加分项)
剩下的说一下下脚料的但也很重要的东西
19 svn和git的区别
20 bug调试工具,如何xdebug。貌似需要掌握断点
21 测试用例
22 传值和传引用的区别及一些具体的操作(在笔试中考中的几率非常非常大)
吐血制作,绝对超值
- 上一篇: PHP面试基础题之一
- 下一篇: php笔试面试题大全