PHP常见中高面试题汇总(附答案)

PHP   2023-06-05 09:48   139   0  

一、 PHP部分

  1. PHP如何实现静态化

PHP的静态化分为:纯静态和伪静态。其中纯静态又分为:局部纯静态和全部纯静态。

PHP伪静态:利用Apache mod_rewrite实现URL重写的方法;

PHP纯静态,就是生成HTML文件的方式,我们须要开启PHP自带的缓存机制,即ob_start来开启缓存。

  1. PHP经典四大排序算法

PHP的四种基本排序算法为:冒泡排序、插入排序、选择排序和快速排序。

冒泡排序:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数来。

插入排序:假设组前面的元素是排好序的,遍历数组后面的元素,在已排好序的元素队列中找到合适的位置,插入其中。

选择排序:进行多次选择,每次选出最大元素放入指定位置。

快速排序:递归算法。先选择数组的第一个元素作为标准,然后把小于或等于它和大于它的数分别放入两个数组中,对这两个数组也进行相同的处理,最后合并这两个数组和第一个元素。

  1. PHP常见运行模式

1)CGI(通用网关接口/ Common Gateway Interface)

2)FastCGI(常驻型CGI / Long-Live CGI)lamp

3)CLI(命令行运行 / Command Line Interface)

4)Web模块模式(Apache等Web服务器运行的模式)

5)ISAPI(Internet Server Application Program Interface)

  1. 你了解设计模式吗?说下你最常用的设计模式

大概有23种设计模式,PHP常见的大概有10几种,虽然不算是基础,但是你必须要懂得。

总体来说设计模式分为三大类:

1、创建型模式共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

2、结构型模式共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

3、行为型模式共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。


0c58bc5cc25310b66169d9ab24dc3d18.png  


  1. 观察者模式是如何实现的?工厂模式是如何实现的?适配器模式是如何实现的?……

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且有所作为。即出版者+订阅者=观察者模式。

工厂模式 :将调用者和创建者分离,调用者直接向工厂类请求获取调用对象,减少代码耦合,提高系统的维护性和扩展性;

工厂模式应用场景:有多个产品类时就要用到工厂模式,比如在数据库连接中,我们可以采用多种数据库连接方法,有mysql扩展,mysqli扩展,PDO扩展等,在这种情况下我们可以一个扩展对应一个产品类,然后采用工厂模式。

适配器模式核心思想:把对某些相似的类的操作转化为一个统一的“接口”(这里是比喻的说话)–适配器,或者比喻为一个“界面”,统一或屏蔽了那些类的细节。适配器模式还构造了一种“机制”,使“适配”的类可以很容易的增减,而不用修改与适配器交互的代码,符合“减少代码间耦合”的设计原则。

  1. PHP的优化方案

  • 1.如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。

  • 2.echo 比 print 快。

  • 3.使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。

  • 4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。

  • 5.注销那些不用的变量尤其是大数组,以便释放内存。

  • 6.尽量避免使用__get,__set,__autoload。

  • 7.require_once()代价昂贵。

  • 8.在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

  • 9.如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

  • 10.函数代替正则表达式完成相同功能。

  • 11.str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

  • 12.如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

  • 13.使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

  • 14.用@屏蔽错误消息的做法非常低效。

  • 15.打开apache的mod_deflate模块。

  • 16.数据库连接当使用完毕时应关掉。

  • 17.$row[‘id’]的效率是$row[id]的7倍。

  • 18.错误消息代价昂贵。

  • 19.尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。

  • 20.在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

  • 21.递增一个全局变量要比递增一个局部变量慢2倍。

  • 22.递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

  • 23.递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

  • 24.仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

  • 25.方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

  • 26.派生类中的方法运行起来要快于在基类中定义的同样的方法。

  • 27.调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

  • 28.用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会

  1. 说下你了解的session和cookie

1、存储位置不同

cookie的数据信息存放在客户端浏览器上。

session的数据信息存放在服务器上。

2、存储容量不同

单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。

对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。

3、存储方式不同

cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。

session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。

4、隐私策略不同

cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。

session存储在服务器上,对客户端是透明对,不存在敏感信息泄漏的风险。

5、有效期上不同

开发可以通过设置cookie的属性,达到使cookie长期有效的效果。

session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。

6、服务器压力不同

cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择。

session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。

7、浏览器支持不同

假如客户端浏览器不支持cookie:

cookie是需要客户端浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效。关于WAP上的应用,常规的cookie就派不上用场了。

运用session需要使用URL地址重写的方式,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。。一切用到session程序的URL都要进行URL地址重写,否则session会话跟踪还会失效。

假如客户端支持cookie:

cookie既能够设为本浏览器窗口以及子窗口内有效,也能够设为一切窗口内有效。

session只能在本窗口以及子窗口内有效。

8、跨域支持上不同

cookie支持跨域名访问。

session不支持跨域名访问。

  1. 如何实现不基于session和cookie的用户认证。

将用户信息加密放到http的header部分,每次拿到http的时候,验证获取header的信息。

  1. 什么是CSRF攻击,XSS攻击?如何防范

CSRF(Cross-site request forgery)跨站请求伪造,黑客建立一个伪造网站或发送邮箱带了一个正常URL链接来让正常用户访问,来让正常用户让自己浏览器里的COOKIE权限来执行一些非法请求,

如转账,提权等操作,

防范方法有,验证 HTTP Referer 字段;在请求地址中添加 token 并验证;

XSS攻击

主要将XSS代码提交存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。当目标用户访问该页面获取数据时,XSS代码会从服务器解析之后加载出来,返回到浏览器做正常的HTML和JS解析执行,XSS攻击就发生了。

防范方法:通过过滤是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数

  1. 你了解RESTful API吗?说说干什么用的。

RESTful API是REST风格的API,是一套用来规范多种形式的前端和同一个后台的交互方式的协议。RESTful API由后台也就是SERVER来提供前端来调用;前端调用API向后台发起HTTP请求,后台响应请求将处理结果反馈给前端。

  1. php设计模式六大原则

单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。

接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

迪米特原则:一个对象应该对其他对象保持最少的了解。

依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

  1. 如何实现自动加载?不用composer如何实现?PSR-4是什么?

自动加载就是当我们在当前文件中实例化一个不存在的类时,调用自动加载机制引入相应的类文件。

注:自动加载有两种方式(都是php内置的),一种是通过__autoload(),另一种是通过spl_autoload_register()。

PSR是PHP Standards Recommendation的简称,制定的代码规范,简称PSR,是代码开发的事实标准。

PSR-4使代码更加规范,能够满足面向package的自动加载,它规范了如何从文件路径自动加载类,同时规范了自动加载文件的位置。

  1. 抽象类和接口分别是什么,他们区别?

抽象类:是基于类来说,其本身就是类,只是一种特殊的类,不能直接实例,可以在类里定义方法,属性。类似于模版,规范后让子类实现详细功能。

接口(Interface)—— 定义行为

抽象类(Abstract Class) —— 实现行为

具体类(class)——执行行为

接口:主要基于方法的规范,有点像抽象类里的抽象方法,只是其相对于抽象方法来说,更加独立。可让某个类通过组合多个方法来形成新的类。

抽象类与接口的相同点:

1、都是用于声明某一种事物,规范名称、参数,形成模块,未有详细的实现细节。

2、都是通过类来实现相关的细节工作

3、语法上,抽象类的抽象方法与接口一样,不能有方法体,即{}符号

4、都可以用继承,接口可以继承接口形成新的接口,抽象类可以继承抽象类从而形成新的抽象类

抽象类与接口的不同点:

1、抽象类可以有属性、普通方法、抽象方法,但接口不能有属性、普通方法、可以有常量

2、抽象类内未必有抽象方法,但接口内一定会有“抽象”方法

3、语法上有不同

4、抽象类用abstract关键字在类前声明,且有class声明为类,接口是用interface来声明,但不能用class来声明,因为接口不是类。

5、抽象类的抽象方法一定要用abstract来声明,而接口则不需要

6、抽象类是用extends关键字让子类继承父类后,在子类实现详细的抽象方法。而接口则是用implements让普通类在类里实现接口的详细方法,且接口可以一次性实现多个方法,用逗号分开各个接口就可

  1. 微服务的了解

概念:又称微服务架构,是一种架构风格,它将应用程序构建为以业务领域为模型的小型自治服务集合 。

优势:

  • 独立开发 – 所有微服务都可以根据各自的功能轻松开发

  • 独立部署 – 基于其服务,可以在任何应用程序中单独部署它们

  • 故障隔离 – 即使应用程序的一项服务不起作用,系统仍可继续运行

  • 混合技术堆栈 – 可以使用不同的语言和技术来构建同一应用程序的不同服务

  • 粒度缩放 – 单个组件可根据需要进行缩放,无需将所有组件缩放在一起

特点:

  • 解耦 – 系统内的服务很大程度上是分离的。因此,整个应用程序可以轻松构建,更改和扩展

  • 组件化 – 微服务被视为可以轻松更换和升级的独立组件

  • 业务能力 – 微服务非常简单,专注于单一功能

  • 自治 – 开发人员和团队可以彼此独立工作,从而提高速度

  • 持续交付 – 通过软件创建,测

博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。
闲言碎语
别动不动就把问题交给时间来证明,时间懒得理你这个烂摊子。
赞赏支持

如果觉得博客文章对您有帮助,异或土豪有钱任性,可以通过以下扫码向我捐助。也可以动动手指,帮我分享和传播。您的肯定,是我不懈努力的动力!感谢各位亲~