400-616-5551

您所在位置: 首页> 学习课程> PHP培训班 | 面试题整理-PHP基础篇

PHP培训班 | 面试题整理-PHP基础篇

发布百知教育 来源:学习课程 2020-02-26

1.cookie与session的区别


  • 存储位置:session存储于服务器,cookie存储于客户端

  • 安全性:session安全性比cookie高

  • 存放的形式:Session是以对象的形式保存在服务器,Cookie以字符串的形式保存在客户端

  • 用途:Cookies适合做保存用户的个人设置,爱好等,Session适合做客户的身份验证

  • session为'会话服务',在使用时需要开启服务,cookie不需要开启,可以直接用


2.禁用cookie后session还能用吗?

可以,通过URL传值或者隐藏表单传递Session ID (常用)。

Session和cookie的工作流程:你第一次访问网站时,


  1. 服务端脚本中开启了session_start();,

  2. 服务器会生成一个不重复的 SESSIONID 的文件session_id();,比如在/var/lib/php/session目录

  3. 并将返回(Response)如下的HTTP头 Set-Cookie:PHPSESSIONID=xxxxxxx

  4. 客户端接收到 Set-Cookie的头,将PHPSESSIONID写入cookie

  5. 当你第二次访问页面时,所有Cookie会附带的请求头(Request)发送给服务器端

  6. 服务器识别PHPSESSIONID这个cookie,然后去session目录查找对应session文件,

  7. 找到这个session文件后,检查是否过期,如果没有过期,去读取Session文件中的配置;如果已经过期,清空其中的配置


3.表单中get与post提交方法的区别


  1. 参数接收:


  2. get:通过url参数传递进行接收,


  3. post:是实体数据,可以通过表单提交大量信息.


4.数据库中的事务是什么


  • 事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消


5.echo(),print(),print_r()的区别


  • echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)

  • print() 只能打印出简单类型变量的值(如int,string)

  • print_r() 可以打印出复杂类型变量的值(如数组,对象)

  • echo 输出一个或者多个字符串

6.用PHP写出显示客户端IP与服务器IP的代码

# 打印客户端IP$_SERVER["REMOTE_ADDR"]# 打印服务器IP$_SERVER["SERVER_ADDR"]

7.include和require的区别是什么?

  • require:是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require。

  • include:有返回值,而require没有(可能因为如此require的速度比include快)。


注意:包含文件不存在或者语法错误的时候,require是致命的,include不是

8.Trait是什么?

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题

单个Trait使用方法:


  1. <?php


  2. trait ezcReflectionReturnInfo {


  3.    function getReturnType() { /*1*/ }


  4.    function getReturnDescription() { /*2*/ }


  5. }


  6. class ezcReflectionMethod extends ReflectionMethod {


  7.    use ezcReflectionReturnInfo;


  8.    /* ... */


  9. }


  10. class ezcReflectionFunction extends ReflectionFunction {


  11.    use ezcReflectionReturnInfo;


  12.    /* ... */


  13. }


  14. ?>


多个Trait使用方法


  1. <?php


  2. trait Hello {


  3.    public function sayHello() {


  4.        echo 'Hello ';


  5.    }


  6. }


  7. trait World {


  8.    public function sayWorld() {


  9.        echo 'World';


  10.    }


  11. }


  12. class MyHelloWorld {


  13.    use Hello, World;


  14.    public function sayExclamationMark() {


  15.        echo '!';


  16.    }


  17. }


  18. $o = new MyHelloWorld();


  19. $o->sayHello();


  20. $o->sayWorld();


  21. $o->sayExclamationMark();


  22. ?>


9.php7和php5区别

1.PHP7.0 比PHP5.6性能提升了两倍。

  1. 变量存储字节减小,减少内存占用,提升变量操作速度。

  2. 改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率。

  3. 改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率。

2.PHP7.0全面一致支持64位。

3.PHP7.0之前出现的致命错误,都改成了抛出异常。

4.增加了空结合操作符(??)。效果相当于三元运算符。

5.PHP7.0新增了函数的返回类型声明。

6.PHP7.0新增了标量类型声明。PHP7中的函数的形参类型声明可以是标量。在PHP5中只可以是类名、接口、array或者callable(PHP5.4,即可以是函数,包括匿名函数),现在也可以使用stringintfloatbool了。

7.新增加了匿名类。

PHP5.3开始有了匿名函数,现在又新增了匿名类;

8.PHP7.0之后溢移除了一些老的不再支持的SAPI(服务器端应用编程端口)和扩展。


  1. ereg


  2. mssql


  3. mysql


  4. sybase_ct


9.define 现在可以定义常量数组。

10.谈谈对mvc的认识

模型(model),视图(view),控制器(controller);由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;

11.请说明php中传值与传引用的区别。什么时候传值什么时候传引用?


  • 按值传递:函数范围内对值的任何改变在函数外部都会被忽略

  • 按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改


优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处

12.从一个标准url里取出文件的扩展名

例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出php 或.php


  1. $url='http://www.sina.com.cn/abc/de/fg.php?id=1';


  2. $pathInfo = pathinfo($url);


  3. if(strpos($pathInfo['extension'],'?')){


  4.  $tmp = explode('?',$pathInfo['extension']);


  5.  $extend =  $tmp[0];


  6. } else{


  7.  $extend =  $pathInfo['extension'];


  8. }


  9. var_dump($pathInfo,$tmp,$extend);


  10. /**


  11. * 输出:


  12. array(4) {


  13. ["dirname"]=>


  14. string(29) "http://www.sina.com.cn/abc/de"


  15. ["basename"]=>


  16. string(11) "fg.php?id=1"


  17. ["extension"]=>


  18. string(8) "php?id=1"


  19. ["filename"]=>


  20. string(2) "fg"


  21. }


  22. array(2) {


  23. [0]=>


  24. string(3) "php"


  25. [1]=>


  26. string(4) "id=1"


  27. }


  28. string(3) "php"


  29. */


13.字符串反转


  1. function strrev($str){


  2.  $len = mb_strlen($str);


  3.  $tmp=[];


  4.  for ($i=0;$i<$len;$i++){


  5.      $tmp[] = mb_substr($str,$i,1);


  6.  }


  7.  krsort($tmp);


  8.  return implode('',$tmp);


  9. }


  10. var_dump(strrev('我是一个PHP程序员!'));


  11. // 输出: string(27) "!员序程PHP个一是我"


strrev函数对英文很好用,直接可以实现字符串翻转,但是面对中文会出现乱码

14.在HTTP中,状态码401的含义是? 如果返回"找不到文件"的提示,则可用header函数,其语句为?

答:401表示未授权; header("HTTP/0 404 Not Found");

15.isset、empty和is_null的区别?


  • isset 判断变量是否已存在,如果变量存在则返回 TRUE,否则返回 FALSE。

  • empty 判断变量是否为空,如果变量是非空或非零的值,则empty() 返回 FALSE。换句话说,"" 、0 、"0"、NULL 、FALSE 、array() 、var $var; 以及没有任何属性的对象都将被认为是空的,如果变量为空,则返回TRUE。  

  • is_null 判断变量是否为NULL


16.单引号'与双引号"区别

php里的单引号把内容当成纯文本,不会经过服务器翻译。而双引号则与此相反。里面的内容会经过服务器处理(process);


  1. $foo="data";


  2. echo '$foo'; //单引号输出$foo


  3. echo "$foo"; //双引号输出data


17.如果理解OOP?

OOP(object oriented programming),即面向对象编程,其中两个最重要的概念就是类和对象,类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就是需要对类进行实例化,类在实例化之后就是对象。

OOP具有三大特点:


  • 封装性:


将一个类的使用和实现分开,只保留部分接口和方法供外部使用,所以开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程。

  • 继承性:子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。php只支持单继承,也就是说一个子类只能有一个父类。

  • 多态性:继承了来自父级类中的属性和方法,并对其中部分方法进行重写,于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。

18.接口和抽象类的区别是什么?


  • 抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。

  • 抽象类是通过关键字 abstract 来声明的

  • 抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,

  • 抽象方法没有方法体,该方法天生就是要被子类重写的。

  • 抽象方法的格式为:abstract function abstractMethod();

  • 因为php中只支持单继承,如果想实现多重继承,就要使用接口。也就是说子类可以实现多个接口。

  • 接口是通过interface关键字来声明的,接口中的成员常量和方法都是public的,方法可以不写关键字public

  • 接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。

  • 抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现

  • 子类继承抽象类使用extends,子类实现接口使用implements


19.常见HTTP状态码,分别代表什么含义


  • 200:请求成功

  • 206:部分内容 (服务器已经成功处理了部分GET请求。类似于FlashGet或者迅雷这类的HTTP 下载工具,都是使用此类响应实现断点续传,或者将一个大文档分解为多个下载段同时下载。)

  • 301:永久重定向

  • 302:临时重定向

  • 400:错误请求

  • 401:未经授权

  • 403:禁止访问

  • 404:文件未找到

  • 500:内部服务器错误

  • 502:无效网关


20.计算两个日期相隔多少年,多少月,多少天,多少小时,多少分钟,多少秒


  1. <?php


  2. /**


  3. * function:计算两个日期相隔多少年,多少月,多少天,多少小时,多少分钟,多少秒


  4. * param string $date1[格式如:2011-11-5]


  5. * param string $date2[格式如:2012-12-01]


  6. * return array array('年','月','日');


  7. */


  8. function diffDate($date1,$date2)


  9. {


  10.    $datetime1 = new \DateTime($date1);


  11.    $datetime2 = new \DateTime($date2);


  12.    $interval = $datetime1->diff($datetime2);


  13.    $time['y']         = $interval->format('%Y');


  14.    $time['m']         = $interval->format('%m');


  15.    $time['d']         = $interval->format('%d');


  16.    $time['h']         = $interval->format('%H');


  17.    $time['i']         = $interval->format('%i');


  18.    $time['s']         = $interval->format('%s');


  19.    return $time;


  20. }


  21. # 使用实例


  22. $sss = diffDate('2018-12-25 12:30:30', '2018-12-26 15:00:00');


  23. print_r($sss);


输出结果:


  1. Array


  2. (


  3.    [y] => 00


  4.    [m] => 0


  5.    [d] => 1


  6.    [h] => 02


  7.    [i] => 29


  8.    [s] => 30


  9. )


21.长连接、短连接的区别和使用

含义说明:


  • 长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于P2P通信。

  • 短连接:Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯。C/S通信。


使用时机:


  • 长连接使用场景: 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多的情况。每个TCP连接的建立都需要三次握手,每个TCP连接的断开要四次握手。如果每次操作都要建立连接然后再操作的话处理速度会降低,所以每次操作下次操作时直接发送数据 就可以了,不用再建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,频繁的socket创建也是对资源的浪费。

  • 短连接使用场景: web网站的http服务一般都用短连接。因为长连接对于服务器来说要耗费一定的资源。像web网站这么频繁的成千上万甚至上亿客户端的连接用短连接更省一些资源。试想如果都用长连接,而且同时用成千上万的用户,每个用户都占有一个 连接的话,可想而知服务器的压力有多大。所以并发量大,但是每个用户又不需频繁操作的情况下需要短连接。


22.如何防止盗链?


  • 不定期更名文件或者目录

  • 加入水印

  • 限制引用页: 原理是服务器获取用户提交信息的网站地址,然后和真正的服务端的地址相比较, 如果一致则表明是站内提交,或者为自己信任的站点提交,否则视为盗链。实现时可以使用HTTPREFERER 和htaccess 文件(需要启用modRewrite),结合正则表达式去匹配用户的每一个访问请求。

  • 文件伪装文件伪装是目前用得最多的一种反盗链技术,一般会结合服务器端动态脚本 (PHP/JSP/ASP)。实际上用户请求的文件地址,只是一个经过伪装的脚本文件,这个脚本文件会对用户的请求作认证,一般会检查 Session,Cookie 或HTTP_REFERER 作为判断是否为盗链的依据。而真实的文件实际隐藏在用户不能够访问的地方,只有用户通过验证以后才会返回给用户

  • 加密认证: 这种反盗链方式,先从客户端获取用户信息,然后根据这个信息和用户请求的文件名 字一起加密成字符串(Session ID)作为身份验证。只有当认证成功以后,服务端才会把用户需要的文件传送给客户。一般我们会把加密的Session ID 作为URL 参数的一部分传递给服务器,由于这个Session ID 和用户的信息挂钩,所以别人就算是盗取了链接,该Session ID 也无法通过身份认证,从而达到反盗链的目的。这种方式对于分布式盗链非常有效。

  • 随机附加码每次在页面里生成一个附加码,并存在数据库里,和对应的图片相关,访问图片时和此附加码对比,相同则输出图片,否则输出404图片。

23.for与foreach哪个更快?

  foreach 的效率要比 for 高很多,也许有很大的一个原因是 for 要进行很多次条件判断。所以以后能用 foreach 的地方就用 foreach ,可以提高1倍的效率。 如果循环内要调用函数,用 array_walk 最好,它的效率要比 for 高出1倍,要比 foreach 高出43%的效率。

24.strlen()与mb_strlen的作用与区别

在PHP中,strlen与mb_strlen是求字符串长度的函数.

  • strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍(在 UTF-8编码下,一个汉字占3个字节)。

  • mbstrlen函数可以较好地解决这个问题。mbstrlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用 mbstrlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mbinternal_encoding()函数得到。

需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了mbstring扩展,否则会出现未定义函 数的问题。


25.foo()与@foo()有什么分别?

  • foo(): 会执行这个函数,任何解译错误、语法错误、执行错误都会在页面上显示出来。

  • @foo(): 在执行这个函数时,会隐藏所有上述的错误讯息。

很多应用程序都使用 @mysqlconnect() 和 @mysqlquery 来隐藏 mysql 的错误讯息,我认为这是很严重的失误,因为错误不该被隐藏,你必须妥善处理它们,可能的话解决它们。

26.GD函式库用来做什么?

gd库是php处理图形的扩展库,gd库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。 在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。

27.在PHP中error_reporting这个函数有什么作用?

打开或者关闭错误报告

  • error_reporting(0):关闭错误报告

  • errorreporting(EERROR | EWARNING | EPARSE):报告 runtime 错误

  • errorreporting(EALL):报告所有错误

  • iniset("errorreporting", EALL):等同 errorreporting(E_ALL)

  • errorreporting(EALL & ~ENOTICE):报告 ENOTICE 之外的所有错误

28.构造方法、析构方法是如何定义的?

构造方法: 在实例化一个对象的同时自动执行的成员方法,作用就是初始化对象。php5之前,一个跟类名完全相同的方法是构造方法,php5之后魔术方法__construct()就是构造方法。如果类中没有定义构造方法,那么php会自动生成一个,这个自动生成的构造方法没有任何参数,没有任何操作。构造方法的格式如下:

function __construct(){}

析构方法:作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。

function __destruct(){}

因为php具有垃圾回收机制,能自动清除不再使用的对象,释放内存,一般情况下可以不手动创建析构方法。

29.文件上传应该注意哪些细节?

1.首现要在php.ini中开启文件上传; 2.在php.ini中有一个允许上传的最大值,默认是2MB。必要的时候可以更改; 3.上传表单一定要记住在form标签中写上enctype="multipart/form-data"; 4.要注意上传文件的大小、文件类型是否符合要求,上传后存放的路径是否存在。

30.PHP数据类型有哪些?

php支持8种原始数据类型。如下:

  • 四种标量类型(布尔型boolean,整型interger,浮点型float/double , 字符串string)

  • 两种复合类型(数组array , 对象object)

  • 两种特殊类型(资源resource,NULL)

31.你是如何认识ajax的?

ajax是asynchronous javascript and xml的缩写,是javascript、xml、css、DOM等多个技术的组合。 Ajax的工作原理是一个页面的指定位置可以加载另一个页面所有的输出内容,这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。Ajax的优点

  • 减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;

  • 在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。

Ajax的缺点

  • 不利于seo推广优化,因为搜索引擎无法直接访问到ajax请求的内容。



php培训班:http://www.baizhiedu.com/php2019

 

 



上一篇:Java学习篇-数组使用

下一篇:it培训班出来的学员怎么样?IT培训学校好么?

相关推荐

关闭

立即申请

www.baizhiedu.com