PHP面试题详解
自己从网上找了几份常考到的PHP面试题进行了整理,然后才有了这份PHP面试题,并且我把所有的题目进行了详细分析和代码分析,希望可以对大家有帮助,谢谢大家。
这份试题我也上传到了百度云,有需要的可以直接去百度云下载这份试题,希望可以帮到大家。
链接:http://pan.baidu.com/s/1i5oTN7n 密码:ykws
PHP面试题
一、选择题
1.下面哪项描述是错误的?( A )
A. 父类的构造函数与析构函数不会自动被调用
B. 成员变量需要用public,protected,private修饰,在定义变量时不再需要var关键字
C. 父类中定义的静态成员,不可以在子类中直接调用
D. 包含抽象方法的类必须为抽象类,抽象类不能被实例化
答案:A。在PHP的面向过程中,子类可以修改和调整父类定义的类成员,我们称它为重写。一旦子类修改了,就按照子类修改之后的功能执行。所以如果子类中有构造函数与析构函数就会自动执行子类的,如果子类中没有构造函数和析构函数就会自动执行父类中的构造函数和析构函数。
2.关于exit( )与die( )的说法正确的是(D)
A、当exit( )函数执行会停止执行下面的脚本,而die()无法做到
B、当die()函数执行会停止执行下面的脚本,而exit( )无法做到
C、die()函数等价于exit()函数
D、die()函数与exit()函数没有直接关系
答案:D。exit() 函数输出一条消息,并退出当前脚本。die() 函数输出一条消息,并退出当前脚本。并且die()函数是 exit() 函数的别名,两者执行的功能都一样,但是二者没有直接关系。
3.下面程序运行结果(B)
$nextWeek = time() + (7 * 24 * 60 * 60);
echo ‘Now: ‘. date(‘Y-m-d’) .”\\n”;
echo ‘Next Week: ‘. date(‘Y-m-d’, $nextWeek) .”\\n”;
?>
A、得到今天的日期(月-日)
B、得到今天的日期(年-月-日)与下周的日期(年-月-日)
C、得到现在的时间(小时-分-秒)
D、得到现在到下周的时间间隔
答案:time()输出的是当前时间戳,时间戳加上的是一周的时间戳,所以可以得到下一周的时间。date() 函数格式化本地日期和时间,并返回已格式化的日期字符串。date()函数语法为:date(时间格式,时间戳);而时间格式中Y代表年,m代表月,d代表日,如果要具体到时间可以在Y-m-d后面加上H:i:s,分别意思是H代表时,i代表分,s代表秒,这样就可以输“出年-月-日 时:分:秒”了。而在刚才的date(‘Y-m-d’, $nextWeek)中,Y-m-d中的‘-’是可以替换成其他任意字符的,这样就可以输出其他格式,例如Y/m/d对应的是年/月/日的格式。
3.以下代码执行结果为:(D)
function print_A(){
$A = “phpchina”;
echo “A值为: “.$A.”";
//return ($A);
}
$B = print_A();
echo “B值为: “.$B.”";
?>
A. A值为: phpchina B值为: phpchina
B. A值为: B值为: phpchina
C. A值为: B值为:
D. A值为: phpchina B值为:
答案:D。页面加载时函数不会立即执行,函数只有在被调用时才会执行。当B=print_A()函数时,print_A()函数被调用,输出”A值为: phpchina”,由于A函数是直接输出值,而不是把print_A中的值返回赋值给B,所以导致print_A返回的值为空赋值给B,B的值为空。最后结果为先输出A值为: phpchina,紧跟其后执行echo “B值为:”,而$B为空,没有东西。所以就连在一起得到输出结果为“A值为: phpchina B值为:”。
4.以下代码执行结果为:(C)
$A=”Hello”;
function print_A()
{
$A = “php mysql !!”;
global $A;
echo $A;
}
echo $A;
print_A();
?>
A Hello
B php mysql !!
C Hello Hello
D Hello php mysql
答案:C。这里主要考察PHP的变量作用域的问题。在这题中,一个是函数外的$A称为全局变量,而函数内的$A是局部变量。除非在函数中把$A申明为全局变量,否则两者互不影响。现在在print_A函数中用global申明了变量 $A为全局变量 ,任何变量的所有引用变量都会指向到全局变量,所以global $A后的$A不是‘Hello php mysql’而是全局的‘Hello’。在函数外中echo $A;是执行输出全局的$A,全局$A是不会被函数内的变量影响的,也就是不会被函数内的$A改变,所以输出’hello’;而后执行print_A()函数时,函数内的$A已经被global改变为全局变量,所以输出的时候也是‘Hello’,所以最终结果为’Hello Hello’。
5.修改MySQL用户root的密码的指令是?(A)
A. mysqladmin -u root password test
B. mysql -u root password test
C. mysql -u root -p test
D. mysql -u root -password test
答:答案为A。总共有三种方法可以通过命令对mysql用户进行修改密码。
方法一是:用SET PASSWORD命令;mysql -u root;mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');进行修改。
方法二:用mysqladmin,mysqladmin -u root password "newpass";如果root已经设置过密码,采用如下方法:mysqladmin -u root password oldpass "newpass";
方法三:用UPDATE直接编辑user表,mysql -u root;mysql> use mysql;mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root'。
而题中使用的是方法二进行MySQL用户root的密码修改指令。
6.设有一个数据库mydb中有一个表tb1,表中有六个字段,主键为ID,有十条记录,ID从0到9,以下代码输出结果是?(B)
$link = mysql_connect(‘localhost’, ‘user’, ‘password’)
or die(‘Could not connect: ‘.mysql_error());
$result = mysql_query(“SELECT id, name, age FROM mydb.tb1 WHERE id<’5′“)
or die(‘Could not query: ‘.mysql_error());
echo mysql_num_fields($result);
mysql_close($link);
?>?
A. 6 B. 5 C. 4 D. 3
答案:B。$link执行的部分是连接数据库,$mysql_query里面执行的是数据库查询。而表中有id为0-9十条数据,从SQL语句中的where后面的条件可以看出是从表中查询id<5的所有数据。也就是id为0到4的数据,所以一共会得到5条数据。mysql_num_fields是返回结果集中字段的数,也就是5,最后输出得到结果5。
7、下面的代码的输出是什么?(B)
$s = ’12345′;
$s[$s[1]] = ’2′;
Echo $s;
?>
A. 12345 B. 12245
C. 22345 D. 11345
E. Array
答案:B。$s是一个字符串,存在的位数对应的序号是从0开始的,和数组的顺序一样。所以$s的位数排序是0-4,$s[1]指向的是2而不是1,所以$s[1]=2,而$s[$[1]]相当于$s[2],而$s[2]指向的是3,这时候赋值2替换掉3,所以再输出$s时,$s是被2替换3后的12245。
8. PHP中,单引号和双引号所包围的字符串有什么区别?(CD )(选择两项)
A. 单引号速度快,双引号速度慢
B. 双引号速度快,单引号速度慢
C. 两者没有速度差别
D. 双引号解析其中以$开头的变量,而单引号不解析
答案:CD。PHP中的单双引号并没有解析加载速度快慢的区别,并且单双引号解析加载速度是一样的,反而是双引号解析其中以$开头的变量,而单引号不解析,所以单引号包含$的变量时是会直接原样输出的。
二、问答题
- php中如何取得get,post参数,和上传的文件数据?
答:在HTML表单中form表单的Method方法提交中可以设置为post或get两种方式提交数据,后台PHP对应获取数据的函数为$_POST[]和$_GET[]两个函数,而$_REQUEST]函数也可以获取form表单提交过来的数据,而且比$_POST和$_GET强大一些,它无论前台是通过post方式提交还是get方式提交都可以获取到对应的数据。但一般为了考虑严谨性,前端提交方式为什么后台就需要用对应的请求方式,所以很少用$_REQUEST函数。除非不知道前端是用post还是get方式提交过来才用$_REQUEST函数接收数据。
关于$_POST和$_GET具有以下区别:
1.传参方式不一样。get是把参数数据加到提交表单中action属性中的url中的,值和表单中各个name字段一一对应,从url中可以看到每个字段和值。而在后台需要使用$_GET方式获取或$_REQUEST方式获取。而post是通过HTTPPOST机制,将表单内各个字段与其内容防止在HTML的head中一起传送到action属性所指的url地址,用户看不到这个过程。后台需要使用$_POST或$_REQUEST方式获取。
2.传送数据大小不同。get传送的数据量较小,post传送的数据量较大,一般被默认不受限制,但在理论上,IIS4中最大量为80kb,IIS5中为1000k。所以get传送大小容易受到限制。
3.传送数据安全度不同。get安全性非常低,因为传送的数据可以通过浏览器地址一览无遗的看到,而post安全性较高,用户看不到整个传送过程。
针对以上解析进行示例代码解释如下:
<meta charset="utf-8"> <!-- 设置中文编码为utf8,防止乱码 --> <?php if(isset($_POST['sub'])){ //判断用户点击提交按钮后执行下去 $get = $_GET['c']; //获取url中参数 $user = $_POST['user']; //获取post传过来的用户名 echo 'GET方式:'.$get.";POST方法:".$user."<br>"; print_r($_REQUEST); //可以通过$_REQUEST获取post和get传来的全部数据 } ?> <!-- HTML表单数据 --> <form action="face.php?c=get" method="post"> 用户名:<input type="text" name="user" > <input type="submit" value="提交" name="sub"> </form>
程序运行结果为:
获取上传文件的函数为$_FILES函数。$_FILES:经由 HTTP POST 文件上传而提交至脚本的变量。而$_FILE函数获得的是一个文件数组数据,其中分别包括以下数据:
$_FILES['myFile']['name'] 客户端文件的原名称
$_FILES['myFile']['type'] 文件的 MIME类型,需要浏览器提供该信息的支持,例如"image/gif"
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认,可以在php.ini的upload_tmp_dir指定,但用 putenv() 函数设置是不起作用的
$_FILES['myFile']['error'] 和该文件上传相关的错误代码,['error'] 是在 PHP 4.2.0版本中增加的,下面是它的说明:(它们在PHP3.0以后成了常量)
UPLOAD_ERR_OK 值:0; 没有错误发生,文件上传成功
UPLOAD_ERR_INI_SIZE 值:1; 上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值
UPLOAD_ERR_FORM_SIZE 值:2;上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值
UPLOAD_ERR_PARTIAL 值:3; 文件只有部分被上传
UPLOAD_ERR_NO_FILE 值:4;没有文件被上传, 值:5; 上传文件大小为0。
注意:在Html中提交文件到PHP后台接收时,需要使用post提交方式,并且需要在form表单头加入:enctype="multipart/form-data"。
通过以上解析,进行代码实例解释为:
<meta charset="utf-8"> <!-- 设置中文编码为utf8,防止乱码 --> <?php if(isset($_POST)){ //如果存在post提交就执行 echo "<pre>"; //设置打印格式 print_r($_FILES); // 打印文件数据 echo "</pre>"; } ?> <!-- 设置文件传输,注意加enctype="multipart/form-data" --> <form action="files.php" method="post" enctype="multipart/form-data"> <input type="file" name="files" > <input type="submit" value="提交" name="sub"> </form>
程序运行结果为:
2. include和require的区别?
答:include和require都可以在php中引入文件,它们引用文件时都是函数后面跟文件名,如:require“files.php”;和include“files.php”。它们两者用途是完全一样的,但是它们最根本的区别在于错误处理的方式不一样。
require 如果文件不存在,会生成致命错误(E_COMPILE_ERROR)并停止脚本
include 如果文件不存在,只生成警告(E_WARNING),并且脚本会继续
因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。
关于require和include外,还有require_once()和include_once()两个函数,用require_once()和include_once()可以检测文件是否有重复包含,如果已经包含了则不会包含第二次,可以减少代码的重复 。
除了以上它们错误处理方式的最大区别外,还具有以下区别:
1.include有返回值,而require没有。如果include引入成功,将它赋值给$a,echo $a,会得到数字1。代表引入成功,而如果引入失败会警告,没有输出,并且程序继续执行下去。
2.require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require。 而 include一般是放在流程控制的处理部分中PHP程序网页在读到include的文件时,才将它读进来。这种方式可以把程序执行时的流程简单化。
根据以上解析,通过代码解释为:
faces.php文件内容为:
<?php echo "hello,world!"; ?>
在require.php中引入faces.php,然后运行require.php代码:
<?php $a = include "facess.php"; $a = require "faces.php"; ?>
程序运行结果为:
可以发现include引入的facess.php并不存在报错了,但是require ‘faces.php’;存在,而在错误后面输出了”hello,world!”。说明include引入的文件不存在会报错,并且依然会继续执行后面的代码。
3.echo、print_r、print、var_dump之间有什么区别?
答:echo 用于输出数值变量或者是字符串。但使用echo来输出引用变量时,如数组,仅输出数组的名字,显示为Arrary;
print_r(expression)的作用是输出一个数组,实际上参数expression的类型可为数值变量和引用变量。
print() 函数输出一个或多个字符串,功能和echo差不多,且有返回值。
var_dump(expression)函数的输出结果<变量类型,变量值,变量长度>,参数expression表示各种变量类型,作用是输出一个变量的详细信息。
它们的区别在于面对不同的数据类型使用不同的函数输出对应的内容。echo函数输出一个或多个字符串,并且没有返回值,而print()它有返回值,一般返回true,返回false的情况应该没有。在写法上,它和echo一样,并且echo的速度比print()稍快,因为echo没有返回值。而echo和print()主要针对字符串来使用,不能输出对象。而print_r()和var_dump()函数主要针对输出数组。print_r和var_dump都能输出数组和对象,但print_r对布尔型的输出不太明显;var_dump输出比较详细,一般调试时用得多。
通过以上的解析,具体的代码解释为:
<meta charset="utf8"> <!-- 设置编码为utf8 防止乱码 --> <?php echo "echo 和 print 的比较"."<br>"; $s = "abcdefg"; $c = "ddddd"; $arr = array("hello","world","!"); echo "我是echo出来的:".$s."--数组输出为:".$arr."<br>"; //会发现提示,$arr输出为Array print "我是print出来的:".$s.'---打印输出:'.$arr[0]."<br>"; echo "<h3>------分割线-------</h3><br>"; echo "print_r 和 var_dump 的比较"."<br>"; print_r($arr); echo "<br>"; var_dump($arr); ?>
程序运行结果为:
从结果可以看出使用echo来输出引用变量时,如数组,会只输出数组的名字,显示为Arrary,并且有Notice的提示。而echo和print都可以输出字符。区别只在于是否有返回值。而print_r和var_dump都可以打印数组,只是var_dump返回的数据更加详细,包括字符串的长度和字符类型,调试时用的比较多。
4.谈谈mvc的认识
答:MVC是一种设计模式,它可以降低对象之间的耦合度,分离出了业务对象层(Model模型),用户界面显示层(View视图)和业务逻辑处理层(Controller控制器),所以简称为mvc模式。在实际开发过程中,controller以及view都依赖于model,因为view和controller都得向model发送数据请求。数据通过controller输入到系统当中,并最终通过view显示出结果。具体意思为controller处理每一个外部的http请求,而view将产生http回应。
它们三者的关系为:
该图的具体解释为:模型Model – 管理大部分的业务逻辑和所有的数据库逻辑。模型提供了连接和操作数据库的抽象层。控制器Controller - 负责响应用户请求、准备数据,以及决定如何展示数据。视图View – 负责渲染数据,通过HTML方式呈现给用户。
目前的PHP框架thinkphp,codeIgniter,Yii,laravel框架都是使用MVC模式进行架构设计的。
5.常用的超全局变量(8个)
答:在PHP中常用的超全局变量主要有以下8个。
(1)$_GET ----->get传送方式
主要用于接受表单get方式传输过来的数据。
(2)$_POST ----->post传送方式
主要用于接受表单post方式传输过来的数据。
(3)$_REQUEST ----->可以接收到get和post两种方式的值
主要用于表单post或get方式传输过来的数据。
通过以上几个函数的解析,用代码进行解释:
<meta charset="utf8"> <!-- 设置utf8编码,防止编码乱 --> <?php if(isset($_POST)){ @$get = $_GET['c']; @$test = $_POST['test']; echo "get:".$get.",post:".$test."<br>"; echo "<pre>"; print_r($_REQUEST); //输出post和get传输方式数据 echo "</pre>"; } ?> <form action="server.php?c=get" method="post" enctype="multipart/data-form"> 测试:<input type="text" name="test" id=""><br> <input type="submit" value="提交"> </form>
运行结果为:
(4)$GLOBALS ----->所有的变量都放在里面
$GLOBALS引用全局作用域中可用的全部变量,一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
通过以上解析,可以通过代码解释为:
<?php $a = 1; $b = 2; function A(){ $sum = $GLOBALS['a'] + $GLOBALS['b']; echo $sum; } A(); ?>
程序运行结果为: 3
通过$GLOBALS['a'] + $GLOBALS['b'],可以获取函数外的全局变量a,b,从而得到sum = 1 + 2;最后输出得3 的结果。
(5)$_FILES ----->上传文件使用
当客户端上传文件点击提交后,PHP可以获得一个$_FILES 数组,然后通过$_FILES函数可以获取全部对应的文件数据。
通过以上解析,代码解释为
<meta charset="utf8"> <!-- 设置utf8编码,防止编码乱 --> <?php if(isset($_POST)){ echo "文件信息:"."<br>"; echo "<pre>"; print_r($_FILES); echo "</pre>"; } ?> <form action="server.php?c=get" method="post" enctype="multipart/form-data"> 文件:<input type="file" name="files" id=""> <input type="submit" value="提交"> </form>
结果为:
(6)$_SERVER ----->系统环境变量
$_SERVER是一个服务器数组,可以通过这个函数对应的键获取对应服务器数据内容。具体的数据内容可以通过print_r($_SERVER);获取一个关于服务器内容的数组。
通过以上解析,可以通过代码解释为:
<?php echo "<pre>"; print_r($_SERVER); echo "</pre>"; ?>
运行结果为:
(7)$_SESSION ----->会话控制的时候会用到
在使用$_SESSION时,需要用session_start();开启session。开启session会话控制后,可以通过$_SESSION[]对应的键存对应的变量信息,然后通过$_SESSION键输出对应的内容。
通过以上解析,可以通过代码解释为:
<?php session_start(); //开启会话控制 $_SESSION['user'] = 'hello'; //记住用户名为hello echo $_SESSION['user']; //输出用户名 ?>
代码运行结果为: hello
通过开启会话控制后,只要用session记住对应的内容,就可以对应的输出记住的信息。
(8)$_COOKIE ----->会话控制的时候会用到
在使用$_COOKIE时,需要先用setCookie("user", "111", time()+3600);记住对应内容,再用$_COOKIE进行输出cookie记住的内容。
个别情况还需要浏览器本身开启cookie才能使用cookie功能。
通过以上解析,代码解释为:
<?php setCookie("hello","111", time()+3600*24); echo $_COOKIE['hello']; ?>
程序运行结果:111
在使用$_COOKIE时,需要先用setCookie记住对应的键,才能通过$_COOKIE获取记住的值。
6.用PHP打印出前一天的时间格式是2006-5-10 22:21:21
答:关于PHP的时间主要使用到的函数是strtotime(),可以把时间格式转换成时间戳,再对时间戳进行加减,从而可以计算出给出的某个时间点对应的任意其他相隔时间点。具体的实现方法如下:
①时间格式转换为时间戳,$time = strtotime(“2006-5-10 22:21:21”);
②时间戳加减计算任意其他时间点,题目计算的是该天的前一天,所以只要减去一天的时间就是这个时间点的前一天了,即$prev = $time - 24*60*60; 24*60*60代表的是一天的时间戳。
③打印前一天的时间,即 echo date(“Y-m-d H:i:s”,$prev); 即可获得前一天的时间。具体的如果date(‘Y-m-d H:i:s’);输出的是当前时间,而如果时间格式后有时间戳,则转换成那个时间点的时间。
通过以上解析,可以得到代码解释为:
<?php date_default_timezone_set("PRC");//记住一定要用date_default_timezone_set()函数指定时间区,否则会报错。PRC指代中国共和国时区 $time = strtotime("2006-5-10 22:21:21"); $prev = $time - 24*60*60; echo date("Y-m-d H:i:s",$prev); ?>
程序运行结果为:2006-05-09 22:21:21
通过以上代码具体解析,可以看出只要涉及时间,都可以用时间戳进行时间的加减进行换算到对应的时间。
三、算法题
一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。
答:因为有1到n只猴子,所以需要用到数组创建存储n只猴子,然后因为每次数到m就踢出这只猴子,又从下一只开始数,所以需要用到循环。在循环中,可以设置一个$i=0,代表开始的第几只猴子,对应数组中的键值。只要数组中有两只以上的猴子就都需要继续循环,而当猴子小于等于一只猴子时就说明是踢出其他猴子后最后剩下的唯一一只猴子,它就是大王。在内部循环中,判断是不是被踢出的那只猴子,可以通过每次数的(i+1)序列整除m等于0代表第m只猴子被数到,然后将这只猴子从数组中踢出。如果在数的过程中没有猴子被踢出,则说明这只猴子是安全的,需要放到最后面的位置让它在下一轮中可以接着数下去。然后猴子对应的序列在末尾是接着之前最后面的n序号进行累加1下去的,所以每个数字都有可能在i+1的过程中最后被踢出,而具体的数字取决于m,i+1猴子是否被m整除就知道是否被数到。循环完后剩下的唯一一只猴子就代表是最后的大王,返回结果就可以了。
根据题目分析的算法思想,可以得到下面的代码编写,
<?php function king($n, $m){ // 创建n只猴子存储对应序列的猴子数组 $monkeys = range(1, $n); // 设置从第一只猴子开始,对应猴子数组的序列为0 $i=0; while (count($monkeys)>1) { //只要猴子的数量大于2个就都需要继续循环数下去 if(($i+1)%$m==0) { unset($monkeys[$i]); //当对应的数组序号猴子被数到被m整除就被踢出数组 } else { array_push($monkeys,$monkeys[$i]); //如果是安全的就把对应的猴子放到最后,等待下一次被数到 unset($monkeys[$i]); //删除第一个被移动到最后面位置的猴子, } $i++; //依次循环,直到猴子只有一个才停止 } return current($monkeys); //返回数组当前第一个元素,就是数组剩下的最后一个猴子 } $a = king(10, 5);//输入猴子数量和数到几淘汰 print_r($a);// 打印猴子数量 ?>
程序运行结果为: 3
这是一份我自己整理的PHP面试过程中常考到的PHP面试题,希望可以帮到大家,有什么不懂可以在下面评论,都会积极回答的,谢谢大家。
面试题word文档下载链接:http://pan.baidu.com/s/1i5oTN7n 密码:ykws
琉忆个人博客网站:shuaiqi100.com
个人公众号: