PHP 面试知识点整理归纳

我的未来我决定 提交于 2021-02-11 13:10:04

这里是我精选出来的内容,原文地址:https://blog.csdn.net/l269798518/article/details/82428601

 

issetempty

isset用来判断变量是否存在;empty用来判断变量是否有值

$a不存在和$a = null 两种情况在isset看来为true,其余为false(包括$a = ‘’;

$a = null, 0, false, ‘ ’, 或不存在时在empty看来为true,其余为false

 

privateprotectedpublicfinal 区别

public:权限是最大的,可以内部调用,实例调用等。

protected: 受保护类型,用于本类和继承此类的子类调用。

private: 私有类型,只有在本类中使用。

static:静态资源,可以被子类继承。

abstract:修饰抽象方法,没有方法体,由继承该类的子类来实现。

final:表示该变量、该方法已经完成,不可被覆盖。修饰类时该类不能被继承。 

(因此finalabstract不能同时出现)

 

抽象类、接口

接口通常是为了抽象一种行为,接口是一种规范,在设计上的意义是为了功能模块间的解耦,方便后面的功能扩展、维护,接口不能有具体的方法;

抽象类可以有具体的方法,也可以有抽象方法,一旦一个类有抽象方法,这个类就必须声明为抽象类,很多时候是为子类提供一些共用方法;

所以,抽象类是为了简化接口的实现,他不仅提供了公共方法的实现,让你可以快速开发,又允许你的类完全可以自己实现所有的方法,不会出现紧耦合的问题。

1 优先定义接口

2 如果有多个接口实现有公用的部分,则使用抽象类,然后集成它。

 

Trait 是什么东西

Trait为不支持多继承的php实现了多继承,使用时不是用extends继承,而是在类内部用 use 类名 表示。

 

常见 HTTP 状态码

1xx消息:这一类型的状态码,代表请求已被接受,需要继续处理。

2xx成功:这一类型的状态码,代表请求已成功被服务器接收、理解、并接受

200 OK:请求已成功,请求所希望的响应头或数据体将随此响应返回。

202 Accepted:服务器已接受请求,但尚未处理。

204 No Content:服务器成功处理了请求,没有返回任何内容

3xx重定向:这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向

301 Moved Permanently:被请求的资源已永久移动到新位置

4xx客户端错误:这类的状态码代表了客户端看起来可能发生了错误

400 Bad Request:由于明显的客户端错误(例如,格式错误的请求语法,太大的大小,无效的请求消息或欺骗性路由请求),服务器不能或不会处理该请求

401 Unauthorized:类似于403 Forbidden401语义即未认证,即用户没有必要的凭据

403 Forbidden:服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。

404 Not Found:请求失败,请求所希望得到的资源未被在服务器上发现,但允许用户的后续请求

405 Method Not Allowed:请求行中指定的请求方法不能被用于请求相应的资源。

408 Request Timeout:请求超时

5xx服务器错误:表示服务器无法完成明显有效的请求。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生

500 Internal Server Error:通用错误消息,服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。没有给出具体错误信息

502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应

503 Service Unavailable:由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是暂时的,并且将在一段时间以后恢复。

504 Gateway Timeout:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTPFTPLDAP)或者辅助服务器(例如DNS)收到响应。

 

AutoloadComposerPSR-4

Autoload机制可以使得PHP程序有可能在使用类时才自动包含类文件,而不是一开始就将所有的类文件include进来,这种机制也称为lazy loading(懒加载);通常PHP5在使用一个类时,如果发现这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载需要使用的类。php7.2废除__autoload函数,建议使用spl_autoload_register() 实现相同功能。

 

Composer:你有一个项目依赖于若干个库;其中一些库依赖于其他库;你声明你所依赖的东西;Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)。

执行 composer require 时发生了什么:composer 会找到符合 PR4 规范的第三方库的源;将其加载到 vendor 目录下;初始化顶级域名的映射并写入到指定的文件里;写好一个 autoload 函数,并且注册到 spl_autoload_register()里。

 

Composer是利用的遵循psr-4规范的类自动加载机制实现的,PSR-4规范简介:

完整的类名 必须 要有一个顶级命名空间,被称为 "vendor namespace"

完整的类名 可以 有一个或多个子命名空间;

完整的类名 必须 有一个最终的类名;

完整的类名中任意一部分中的下滑线都是没有特殊含义的;

完整的类名 可以 由任意大小写字母组成;

所有类名都 必须 是大小写敏感的。

完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为「命名空间前缀」,其必须与至少一个「文件基目录」相对应;

紧接命名空间前缀后的子命名空间 必须 与相应的「文件基目录」相匹配,其中的命名空间分隔符将作为目录分隔符。

末尾的类名 必须 与对应的以 .php 为后缀的文件同名。

自动加载器(autoloader)的实现 一定不可 抛出异常、一定不可 触发任一级别的错误信息以及 不应该 有返回值。

 

PSR-1---基础编码规范

PSR-2---编码风格规范

PSR-4---自动加载规范

PSR-7---HTTP 消息接口规范

 

Session 共享(单点登录)

利用Redis实现简单的Session共享:

用户第一次进入商城首页,给一个CSESSIONID,(不用JSESSIONID的原因),用户添加商品,各种需要记录的操作,都与这个CSESSIONID关联起来;

当使用登录操作时候,将这个用户的信息,如用户名等存入到redis中,通过K_V,将CSESSIONID加一个标志作为key,将用户信息作为value

当用户点击页面被转发到其他服务器时候,在需要验证是否同一个用户时,就可以从redis中取出value,进行验证用户信息,实现共享。 

 

异常处理

异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。

如果抛出了异常,就必须捕获它 try{} catch(Exception $e){echo $e->getMessage();}

 

InnoDB MyISAM之间的区别:

1>.InnoDB支持事务,而MyISAM不支持事务

2>.InnoDB支持行级锁,而MyISAM支持表级锁

3>.InnoDB支持MVCC(多版本并发控制), MyISAM不支持

4>.InnoDB支持外键,而MyISAM不支持

5>.InnoDB不支持全文索引,而MyISAM支持

 

InnoDB :如果要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择

MyISAM:如果数据表主要用来插入和查询记录,则MyISAM(但是不支持事务)引擎能提供较高的处理效率

Memory:如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。数据的处理速度很快但是安全性不高。

Archive:如果只有INSERTSELECT操作,可以选择ArchiveArchive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive

使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能

 

HTTP  HTTPS 区别

一句话说,httpshttp安全且是现在主流。(httpss就是指的security

HTTPSHTTP的区别主要如下:

1https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3httphttps使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443

4http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

 

Apache  Nginx 区别

nginx 相对 apache 的优点:

轻量级,同样是web 服务,比apache 占用更少的内存及资源

抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

高度模块化的设计,编写模块相对简单

apache 相对nginx 的优点:

rewrite ,比nginx rewrite 强大

超稳定,少bug nginx bug 相对较多

 

【数据库】

JOIN / INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。

LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。

RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

UNION运算符用于组合两个或多个SELECT语句的结果集。要求:

常用 MySQL 函数,如:now()md5()concat()uuid()

触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。

数据库优化手段:索引、联合索引(命中条件)

(1) 主键索引 PRIMARY KEY

(2) 唯一索引 UNIQUE

(3) 普通索引 INDEX

(5) 全文索引 FULLTEXT

分库分表(水平分表、垂直分表)

分区:目前MySQL支持范围分区(RANGE),列表分区(LIST),哈希分区(HASH)以及KEY分区四种,具体说明

使用 explain 分析 SQL 性能问题,了解各参数含义:重点理解 typerowskey

NoSQL: RedisMemcachedMongoDB

 

跨域请求 N 种解决方案

document.domain + iframe      (只有在主域相同的时候才能使用该方法)

动态创建script

location.hash + iframe

window.name + iframe

postMessageHTML5中的XMLHttpRequest Level 2中的API

CORS,背后的思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。

JSONP,包含两部分:回调函数和数据。回调函数是当响应到来时要放在当前页面被调用的函数。数据就是传入回调函数中的json数据,也就是回调函数的参数了。

web sockets,是一种浏览器的API,它的目标是在一个单独的持久连接上提供全双工、双向通信。(同源策略对web sockets不适用)

 

TCP 三次握手流程

TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.

第一次握手:建立连接时,客户端发送syn(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;(SYN:同步序列编号(Synchronize Sequence Numbers))

第二次握手:服务器收到syn,必须确认客户的SYNack=j+1,同时自己也发送一个SYN包(syn=k,SYN+ACK,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYNACK,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.

完成三次握手,客户端与服务器开始传送数据

 

JSON  JSONP

JsonJsonP虽然只差一个字母,但却根本不是一回事.

JSON是一种描述信息的格式,或者叫做数据描述格式;

jsonp是一种非官方跨域数据交互协议,如同ajax一样,它也不一定非要用json格式来传递数据.jsonp是一种跨域请求方式。主要原理是利用了script标签可以跨域请求的特点,由其src属性发送请求到服务器,服务器返回js代码,网页端接受响应,然后就直接执行了,这和通过script标签引用外部文件的原理是一样的。Jsonp只支持Get请求方式。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!