PHP面试常见问题总结

PHP面试常见问题总结

部分题目收集自网络

1. echo(),print(),print_r(),var_dump()的区别?

echo 和 print 只能打印出string,不能打印出结构;
print(string $arg)只有一个参数;
echo arg1,arg2 可以输出多个参数;
print_rvar_dump能打印出结构。比如:

1
2
3
$arr = array("key"=>"value");
print_r($arr);
var_dump(arr);

print_rvar_dump区别:
print_r() 只能打印一些易于理解的信息,且print_r()在打印数组时,会将把数组的指针移到最后边,使用reset() 可让指针回到开始处。 而var_dump()不但能打印复合类型的数据,还能打印资源类型的变量

2. 语句include和require的区别是什么?

在失败的时候:
include 产生一个 warning ,而 require 直接产生错误中断;
require 在运行前载入;
include 在运行时载入;
require_onceinclude_once 可以避免重复包含同一文件。

3. php中传值与传引用有啥区别?

&表示传引用;
函数中参数传引用会将参数进行改变;
一般在输出参数有多个的时候可以考虑使用引用。

1
2
3
4
5
6
$num = 10
function multiply(&$num){
$num = $num * 10;
}
multiply($num);
echo $num;

4. 下面哪项没有将john添加到users数组中?

1
2
3
4
(a) $users[] = 'john';
(b) array_add($users,'john');
(c) array_push($users,'john');
(d) $users ||= 'john';

答案为bd,php 里面无 array_add 函数,d项为语法错误的表达;

5. HTTP协议中几个状态码的含义。

1
2
3
4
5
6
7
8
200 : 请求成功,请求的数据随之返回。
301 : 永久性重定向。
302 : 暂时行重定向。
401 : 当前请求需要用户验证。
403 : 服务器拒绝执行请求,即没有权限。
404 : 请求失败,请求的数据在服务器上未发现。
500 : 服务器错误。一般服务器端程序执行错误。
503 : 服务器临时维护或过载。这个状态时临时性的。

6. 一些php魔术方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
__construct() 实例化类时自动调用。
__destruct() 类对象使用结束时自动调用。
__set() 在给未定义的属性赋值的时候调用。
__get() 调用未定义的属性时候调用。
__isset() 使用isset()或empty()函数时候会调用。
__unset() 使用unset()时候会调用。
__sleep() 使用serialize序列化时候调用。
__wakeup() 使用unserialize反序列化的时候调用。
__call() 调用一个不存在的方法的时候调用。
__callStatic()调用一个不存在的静态方法是调用。
__toString() 把对象转换成字符串的时候会调用。比如 echo。
__invoke() 当尝试把对象当方法调用时调用。
__set_state() 当使用var_export()函数时候调用。接受一个数组参数。
__clone() 当使用clone复制一个对象时候调用。

7. MySQL存储引擎 MyISAM 和 InnoDB 的区别。

1
2
3
4
5
6
7
8
a. MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.
b. MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快.
c. InnoDB不支持FULLTEXT类型的索引.
d. InnoDB中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可.
e. 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
f. DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
g. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用.
h. MyISAM支持表锁,InnoDB支持行锁。

8. 说出一些MySQL优化方法?

1
2
3
4
5
6
7
a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。
c. mysql库主从读写分离。
d. 找规律分表,减少单表中的数据量提高查询速度。
e. 添加缓存机制,比如memcached,apc等。
f. 不经常改动的页面,生成静态页面。
g. 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.

9. 说下php中empty()和isset()的区别。

isset 用于检测变量是否被设置,使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE
empty 如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE

10. for与foreach哪个更快?

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

11. PECL 和 PEAR 有什么区别?

PECL (PHP Extension Community Library) 可以看作 PEAR (PHP Extension and Application Repository) 的一个组成部分,提供了与 PEAR 类似的功能。不同的是 PEAR 的所有扩展都是用纯粹的 PHP 代码编写的,用户在下载到 PEAR 扩展以后可以直接使用将扩展的代码包含到自己的 PHP 文件中使用。而 PECL 是使用 C 语言开发的,通常用于补充一些用 PHP 难以完成的底层功能,往往需要重新编译或者在配置文件中设置后才能在用户自己的代码中使用。

最直接的表述:PEAR 是 PHP 的上层扩展,PECL 是 PHP 的底层扩展。它们都是为特定的应用提供现成的函数或者类。

12. 如何处理多服务器共享 Session ?

大致上有三种方式可以处理:

  • 数据库/文件同步 session
  • cookie 同步 session
  • 缓存 (如 redis )同步 session

13. PHP内存管理机制与垃圾回收机制?

php 的内存管理机制是:预先给出一块空间,用来存储变量,当空间不够时,再申请一块新的空间。

  • 存储变量名,存在符号表。
  • 变量值存储在内存空间。
  • 在删除变量的时候,会将变量值存储的空间释放,而变量名所在的符号表不会减小。

php 垃圾回收机制是:

  • 在5.2版本或之前版本,PHP会根据 引用计数 ( refcount )值来判断是不是垃圾,如果refcount值为0,PHP会当做垃圾释放掉,这种回收机制有缺陷,对于环状引用的变量无法回收。
  • 在5.3之后版本改进了垃圾回收机制。具体如下:
    如果发现一个 zval 容器中的 refcount 在增加,说明不是垃圾; 如果发现一个 zval 容器中的 refcount 在减少,如果减到了0,直接当做垃圾回收; 如果发现一个 zval 容器中的 refcount 在减少,并没有减到0,PHP 会把该值放到缓冲区,当做有可能是垃圾的怀疑对象; 当缓冲区达到了临界值,PHP 会自动调用一个方法去遍历每一个值,如果发现是垃圾就清理。

14. 多线程和多进程的区别为?

进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;所有由你启动的进程都是用户进程。进程是操作系统进行资源分配的单位。在 Windows 下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。

15. TCP/IP 网络协议,OSI 7 层指是什么?

TCP/IP 5层 指的是:

1
2
3
4
5
6
7
8
9
10
应用层
HTTP、FTP、SMTP、DNS、DSP、Telnet、Gopher、WAIS……
传输层
TCP、UDP、DVP……
网络层
IP、ICMP、AKP、RARP、UUCP……
接口层
Ethernet、Arpanet、PDN……
物理层
只要能传输IP数据报(Datagram),允许任何协议……

OSI 7层指的是:

1
2
3
4
5
6
7
应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层 数据格式化,代码转换,数据加密 没有协议
会话层 解除或建立与别的接点的联系 没有协议
传输层 提供端对端的接口 TCP,UDP
网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2

16. laravel 市场目前比较流行的框架

  • 简述 Laravel 的生命周期

    Laravel 采用了单一入口模式,应用的所有请求入口都是 public/index.php 文件。

    1. 注册类文件自动加载器 : Laravel通过 composer 进行依赖管理,无需开发者手动导入各种类文件,而由自动加载器自行导入。
    2. 创建服务容器:从 bootstrap/app.php 文件中取得 Laravel 应用实例 $app (服务容器)
    3. 创建 HTTP / Console 内核:传入的请求会被发送给 HTTP 内核或者 console 内核进行处理
    4. 载入服务提供者至容器:
      在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的应用,服务提供者负责引导启动框架的全部各种组件,例如数据库、队列、验证器以及路由组件。
      1. 分发请求:一旦应用完成引导和所有服务提供者都注册完成,Request 将会移交给路由进行分发。路由将分发请求给一个路由或控制器,同时运行路由指定的中间件
  • 服务提供者是什么?

    服务提供者是所有 Laravel 应用程序引导启动的中心, Laravel 的核心服务器、注册服务容器绑定、事件监听、中间件、路由注册以及我们的应用程序都是由服务提供者引导启动的。

  • IoC 容器是什么?

    IoC(Inversion of Control)译为 「控制反转」,也被叫做「依赖注入」(DI)。什么是「控制反转」?对象 A 功能依赖于对象 B,但是控制权由对象 A 来控制,控制权被颠倒,所以叫做「控制反转」,而「依赖注入」是实现 IoC 的方法,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。

    其作用简单来讲就是利用依赖关系注入的方式,把复杂的应用程序分解为互相合作的对象,从而降低解决问题的复杂度,实现应用程序代码的低耦合、高扩展。

    Laravel 中的服务容器是用于管理类的依赖和执行依赖注入的工具。

  • Facades 是什么?

    Facades(一种设计模式,通常翻译为外观模式)提供了一个”static”(静态)接口去访问注册到 IoC 容器中的类。提供了简单、易记的语法,而无需记住必须手动注入或配置的长长的类名。此外,由于对 PHP 动态方法的独特用法,也使测试起来非常容易。

  • Contract 是什么?

    Contract(契约)是 laravel 定义框架提供的核心服务的接口。Contract 和 Facades 并没有本质意义上的区别,其作用就是使接口低耦合、更简单。

  • 谈谈 Laravel 和 YII 框架的区别.

    1. 在 YII 框架中的路由是通过书写 Controller、Action 间接定义路由,而 Laravel 中是在 route 路由文件中直接定义路由入口
    2. Laravel 提供 ORM 对象关系映射,使读写数据库的操作更加简单
    3. Laravel 提供更多的 Artisan 命令和脚手架开发
    4. Laravel 的 Composer 扩展包比 Yii 框架更多,开发更加高效