美文网首页PHP
这份PHP面试题,我只挑重点,且很详细

这份PHP面试题,我只挑重点,且很详细

作者: it阿布 | 来源:发表于2021-04-15 20:48 被阅读0次

基础篇

一.Get 和 POST 的区别
表单提交中get和post方式的区别有5点
1.get是从服务器上获取数据,post是向服务器传送数据。
2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5.get安全性非常低,post安全性较高。

二.HTTP请求:get与post方法的区别
HTTP 定义了与服务器交互的不同方法,最基本的方法是 get 和 post。事实上 get 适用于多数请求,而保留 post仅用于更新站点。
根据 HTTP 规范,get 用于信息获取,而且应该是安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。
换句话说,get 请求一般不应产生副作用。幂等的意味着对同一 URL的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。
从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。
反之亦然。post请求就不那么轻松了。post 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 post请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解);
在FORM提交的时候,如果不指定Method,则默认为get请求,Form中提交的数据将会附加在url之后,以?分开与url分开。
字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISOLatin-1)值。get请求请提交的数据放置在HTTP请求协议头中,而post提交的数据则放在实体数据中;

三.单引号和双引号的区别
在PHP中,字符串的定义可以使用单引号,也可以使用双引号。但是必须使用同一种单或双引号来定义字符串,如:‘Hello"和“Hello'为非法的字符串定义。
定义字符串时,只有一种引号被视为定义符,即单引号或双引号。于是,如果一个字符串由双引号开始,那么只有双引号被分析器解析。这样,你就可以在双引号串中包含任何其他字符,甚至单引号。

四.isset 和 empty 的区别
empty方法:
变量不存在,返回true
变量存在,值为空,返回true
变量存在,值不为空,返回false
isset方法:
变量存在,返回true
变量不存在,返回false

五.echo、print_r、print、var_dump 之间的区别
echo()函数:输出一个或多个字符串。实际上它并不是一个函数,所以不必对它使用括号,直接用echo就行。然而,如果您希望向echo()传递一个以上的参数,使用括号将会生成解析错误。echo()函数比print()速度稍快一点。echo输出多个字符串时,用逗号隔开。
print()函数:输出一个或多个字符串。同echo一样,实际上它并不是一个函数。print有返回值,而echo没有,当其执行失败时返回false,成功则返回true,速度比echo稍慢。只能打印出简单类型变量的值,如:int、string。
print_r()函数:能打印出复杂类型变量的值。利用print_r()可以打印出整个数组内容及结构,按照一定格式显示键和元素,事实上,它不仅仅用于打印,而是用于打印关于变量的易于理解的信息。
var_dump()函数:判断一个变量的类型与长度,并输出变量的数值,如果变量有值,输出的是变量的值,并返回数据类型。此函数显示关于一个或多个表达式的结构信息,包括表达式的类型和值。数组将递归展开值,通过缩进显示其结构。

六.什么是 MVC?
1)什么是MVC?
简单的说就是将网站源码分类、分层。
2)MVC三个字母的含义:
M:Model 模型,负责数据库操作。
V:View 视图,负责调用Model调取数据,再调用模板,展示出最终效果。
C:Controller 控制器,程序的入口,决定改调用哪个View,并告诉View该做什么。
如此说来,程序的执行顺序是C-V-M 或 C-M ,和MVC的名字正好相反。
3)为什么要MVC?
1.能使网站程序物理结构更合理。
当用PHP建设一个网站的时候,最笨的方法,你可能把每个页面建成一个PHP文件。如果你的网站只有 index.php,menu.php.article.php 三个页面,那你可以不用MVC,但我们做一般的网站的时候,动辄几十个页面,把所有页面放在根目录显然不是我们所能接受的,于是你需要一个合理的思想去将你的代码分类,按功能把他们分成不同的目录,且由程序智能的载入调用,这就是MVC要帮助你做的。
2.使代码更容易维护。
我们再来看单个页面,最笨的方法,就是PHP代码与HTML代码混合,这显然不够好,你在维护网站的时候不得不区分哪里是PHP,哪里是HTML, 这对于一个程序员来说,简直只灾难。于是很多人就使用Smarty,这样就可以将“数据处理”与“页面展示”分开来,这样做的确不错,也有很多人正在这么 做,但这还不是MVC,MVC要做的就是将“数据处理”再分为“逻辑处理”与“数据库操作”,这就是所说的分层。
这样当你的程序错误或想要修改的时候,就变得很轻松了,当页面显示错误的时候,你就去检查V或模板文件;当逻辑有问题的时候,你就去检查C和V;当你数据库操作错误就去检查M。其实MVC一般要把PHP的一个页面分割为4个页面,分别是C,V,M,模板。各司其职,方便管理。
3.有利于代码复用。
MVC会把一般会把一个大的功能放在一个目录下,也就是由一个C去管理。

七.传值和传引用的区别?
php传值:在函数范围内,改变变量值的大小,都不会影响到函数外边的变量值。
PHP传引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。
传值:和copy是一样的。打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立。
传引用:类似于C语言的指针了,感觉差不多。打个比方,我有一橦房子,我给你一把钥匙,我们二个都可以进入这个房子,你在房子做什么都会影响到我。
优缺点:传值会很耗时间,特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作,传送引用,函数内的任何操作等同于对传送变量的操作,传送大型变量时效率高!

八.Cookie 和 Session 的区别和关系
1.Cookie 在客户端(浏览器),Session 在服务器端。
2.Session 比 Cookie 安全性更高。
3.单个 Cookie 保存的数据不能超过 4K。
4.Session 是基于 Cookie,如果浏览器禁用了 Cookie,Session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 Session ID)。

进阶篇

一.简述 S.O.L.I.D 设计原则
SRP 单一职责原则 —个类有且只有一个更改的原因
OCP 开闭原则 能够不更改类而扩展类的行为
LSP 里氏替换原则 派生类可以替换基类使用
lSP 接口隔离原则 使用客户端特定的细粒度接口
DIP 依赖反转原则 依赖抽象而不是具体实现

二.列举一些 PHP 中的设计模式?
单例模式:保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点。
工厂模式:定义一个创建对象的接口,但是让子类去实例化具体类。工厂方法模式让类的实例化延迟到子类中。
观察者模式:观察者模式有时也被称作发布/订阅模式,该模式用于为对象实现发布/订阅功能:一旦主体对象状态发生改变,与之关联的观察者对象会收到通知,并进行相应操作。
适配器模式:适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
依赖注入模式:依赖注入(Dependency Injection)是控制反转(Inversion of Control)的一种实现方式。要实现控制反转,通常的解决方案是将创建被调用者实例的工作交由 IoC 容器来完成,然后在调用者中注入被调用者(通过构造器/方法注入实现),这样我们就实现了调用者与被调用者的解耦,该过程被称为依赖注入。
门面模式:门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面。

三.PHP7 和 PHP5 的区别,具体多了哪些新特性?
1.性能提升了两倍
2.增加了结合比较运算符 (<=>)
3.增加了标量类型声明、返回类型声明
4.try...catch 增加多条件判断,更多 Error 错误可以进行异常处理
5.增加了匿名类,现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义

四.为什么 PHP7 比 PHP5 性能提升了?
1.变量存储字节减小,减少内存占用,提升变量操作速度
2.改善数组结构,数组元素和 hash 映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率
3.改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率

五.简述一下 PHP 垃圾回收机制(GC)
PHP 5.3 版本之前都是采用引用计数的方式管理内存,PHP 所有的变量存在一个叫 zval 的变量容器中,当变量被引用的时候,引用计数会+1,变量引用计数变为0时,PHP 将在内存中销毁这个变量。但是引用计数中的循环引用,引用计数不会消减为 0,就会导致内存泄露。
在 5.3 版本之后,做了这些优化:
1.并不是每次引用计数减少时都进入回收周期,只有根缓冲区满额后在开始垃圾回收;
2.可以解决循环引用问题;
3.可以总将内存泄露保持在一个阈值以下。

六.如何解决 PHP 内存溢出问题
1.增大 PHP 脚本的内存分配
2.变量引用之后及时销毁
3.将数据分批处理

七.Redis、Memecached 这两者有什么区别?
1.Redis 支持更加丰富的数据存储类型,String、Hash、List、Set 和 Sorted Set。Memcached 仅支持简单的 key-value 结构。
2.Memcached key-value存储比 Redis 采用 hash 结构来做 key-value 存储的内存利用率更高。
3.Redis 提供了事务的功能,可以保证一系列命令的原子性
4.Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中
5.Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis 在存储小数据时比 Memcached 性能更高。

八.Redis 如何实现持久化?
RDB 持久化,将 Redis 在内存中的的状态保存到硬盘中,相当于备份数据库状态。
AOF 持久化(Append-Only-File),AOF 持久化是通过保存 Redis 服务器锁执行的写状态来记录数据库的。
相当于备份数据库接收到的命令,所有被写入 AOF 的命令都是以 Redis 的协议格式来保存的。

Web 安全防范

一.CSRF 是什么?如何防范?
CSRF(Cross-site request forgery)通常被叫做「跨站请求伪造」,可以这么理解:攻击者盗用用户身份,从而欺骗服务器,来完成攻击请求。
防范措施:
1.使用验证码
2.给每一个请求添加令牌 token 并验证

二.XSS 是什么?如何防范?
XSS(Cross Site Scripting),跨站脚本攻击,攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。
防止 XSS 攻击的方式有很多,其核心的本质是:永远不要相信用户的输入数据,始终保持对用户数据的过滤。

三.什么是 SQL 注入?如何防范?
SQL 注入就是攻击者通过一些方式欺骗服务器,结果执行了一些不该被执行的 SQL。
SQL 注入的常见场景
1.数据库里被注入了大量的垃圾数据,导致服务器运行缓慢、崩溃。
2.利用 SQL 注入暴露了应用程序的隐私数据
防范措施:
1.保持对用户数据的过滤
2.不要使用动态拼装 SQL
3.增加输入验证,比如验证码
4.对隐私数据加密,禁止明文存储

点关注 不迷路
好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以戳这里https://shimo.im/docs/rjJttdvCJpYtHpW3/ 《进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】》

相关文章

网友评论

    本文标题:这份PHP面试题,我只挑重点,且很详细

    本文链接:https://www.haomeiwen.com/subject/qlujlltx.html