PHP面试知识点梳理

博客分类: php 阅读次数: comments

PHP面试知识点梳理

PHP面试中常用到的知识点梳理

PHP 基础知识

变量

PHP 中的变量用一个美 元符号后面跟变量名来表示。变量名是区分大小写的。

知识点

引用变量

概念

在PHP中引用意味着用不同的名字访问同一个变量内容

定义方式

使用&符号

工作原理

php变量在赋值的时候是遵循COW原则的 即 copy on write. 所谓的cow原则即变量只有在被重新赋值的时候才会开辟内存空间 也就是说 即使我们不使用引用 一个变量被赋值后 只要我们不改变变量的值 也与使用引用一样

常量

常量一经定义,不能被修改和删除

定义方式

constdefine 区别

  1. const是语言结构,执行更快,define是函数
  2. define不能用于类常量的定义,const可以
预定义常量

__FILE__:  所在文件的路径和文件名 + __LINE__: 所在行的行号 + __DIR__: 所在目录 + __FUNCTION__: 所在函数的函数名称 + __CLASS__: 所在类的类名 + __TRAIT__: Trait 的名称 + __METHOD__: 类名+方法名 + __NAMESPACE__: 命名空间的名称

试题解答

  1. 什么是引用变量?在PHP当中,用什么符号定义引用变量?
    用不同的名字访问同一个变量内容,用 & 来定义.
    
  2. __FILE__ 表示什么意思?
      表示所在文件的路径和文件名
    

数据类型

知识点

三大数据类型

PHP字符串的定义方式及区别
定义方式

单引号双引号heredoc和nowdoc

区别
  1. 单引号不能解析变量,双引号可以
  2. 单引号不能解析转义字符,只能解析单引号和反斜线本身;双引号解析所有转义字符
  3. 单引号因为不需要解析,所以效率高于双引号
  4. 变量和变量、变量和字符串、字符串和字符串之间可以用.连接
  5. heredoc类似于双引号,nowdoc类似于单引号,它俩都用来处理大文本字串
FALSE 的七种情况

以后几种情况,在比较时都是等值的

超全局数组
NULL值的三种情况

试题解答

  1. 用PHP写出显示客户端与服务器IP的代码
    echo $_SERVER['REMOETE_ADDR];
    echo $_SERVER['SERVER_ADDR];
    
  2. PHP中字符串可以使用哪三种定义方法以及各自的区别是什么
    单引号、双引号、heredoc
    

运算

知识点

错误控制符

@: 将其放置在一个PHP表达工之前,该表达式可能产生的任何错误信息都被忽略掉

运算符优先级

优先级详情查看PHP手册

递增/递减 > ! > 算术运算符 > 大小比较 > 等式比较 > 引用 > 位运算符(^) > 位运算符(|) > 逻辑与 > 逻辑或 > 三目 > 赋值 > and > xor > or 

括号的使用,可以增加代码的可读性,推荐使用.

比较运算符

** ===== 的区别:** ===== 多了类型的判断

递增/递减运算符

+ 不影响布尔值

+ 递减NULL值没有效果

+ 递增NULL值为1

+ 递增和递减在前就运算后返回,反之就先返回,后运算

逻辑运算符

短路作用 ||和&& 与 or和and 的优先级不同

试题解答

流程控制

知识点

循环遍历

for循环

只能遍历索引数组

foreach循环

可以遍历索引数组,也可以遍历关联数组。

遍历完后,数组指针会reset到开始状态

while+list()+each()组合循环

list() 函数用于在一次操作中给一组变量赋值。 语法:list(var1,var2…)

each() 函数返回当前元素的键名和键值,并将内部指针向前移动。 该元素的键名和键值会被返回带有四个元素的数组中。两个元素(1 和 Value)包含键值,两个元素(0 和 Key)包含键名。 相关的方法: current() - 返回数组中的当前元素的值 end() - 将内部指针指向数组中的最后一个元素,并输出 next() - 将内部指针指向数组中的下一个元素,并输出 prev() - 将内部指针指向数组中的上一个元素,并输出 reset() - 将内部指针指向数组中的第一个元素,并输出

具体使用详情

可以遍历索引数组,也可以遍历关联数组。 不会进行reset()操作,即:轮循完后,指针不会归位到开头。

分支结构

if……elseif

在elseif语句中只能有一个表达式为true,即在elseif语句中只能有个语句块被执行,多个elseif从句是排斥关系。 使用elseif语句有一个基本原则,总把优先范围小的条件放在前面处理。

switch……case……

switch后面的控制表达式的数据类型只能是整形、浮点类型或者字符串。 continue作用到case时,相当于break,如果想跳出外层循环用continue2。 switch…case… 会生成跳转表,直接跳转到对应case。因此,如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用swithc语句可能会更快一些。

试题解答

  1. 请列出3种PHP数组循环操作的语句,并注明各种循环的区别
for、foreach、while+list()+each()

for只能遍历索引数组,而其它两个,还可以遍历关联数组。
  1. PHP中如何优化多个if…elseif语句
可能性较大的,往前放;如果说判断内容较复杂或者是浮点,整型的话,可以考虑用switch替换。

函数

知识点

序列

range()

调试函数

xdebug_debug_zval() //显示变量调用情况 memory_get_usage() //查看内存使用情况 var_dump()

试题解答

正则表达式

知识点

例题演示

文件及目录处理

会话控制

面向对象

网络协议

环境配置

PHP 框架相关

Laravel

DI(依赖注入),是一种设计模式 IOC(控制反转),是一种设计思想

前端相关

Html,JavaScript,jQuery,AJAX

Linux 操作

MySql 数据库

算法

架构设计

高并发架构的相关概念

什么是高并发

通常指,如果一个系统的日PV在千万以上,有可能是一个高并发系统

QPS

每秒种请求或者查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求);

吞吐量

单位时间内处理的请求数量(_通常由QPS与并发数决定)

响应时间

从请求发出到收到响应花费的时间。例如系统处理一个HTTP请求需要100ms,这个100ms就是系统的响应时间。

PV

综合流览量(Page View), 即页面浏览量或点击量,一个访客在24小时内访问的页面数量。 同一个人浏览你的网站同一页面,只记作一次PV(即:刷新没有用)

UV

独立访客(UniQue Visitor), 即一定时间范围内相同访客多次访问网站,只计算为1个访客

带宽

计算带宽大小需要关注两个指标,峰值流量和页面的平均大小

日网站的带宽

PV / 统计时间(换算到秒) * 平均页面大小(单位KB)* 8

峰值每秒请求数(QPS)=(总PV数80%)/(6小时秒数20%) 80%的访问量集中在20%的时间内(二八定律)

压力测试

测试能承受的最大并发 测试最大承受的QPS值

常用性能测试工具

QPS达到极限怎么处理

QPS达到50

小型网站,一般的服务器都可以达到

QPS达到100

假设关系型数据库的每次请求在0.01秒完成 假设单页面只有一个SQL查询,那么100QPS 意味着1秒完成100次请求,但是此时我们并不能保证数据库查询能完成100次 方案: 数据库缓存层、数据库的负截均衡

QPS达到800

假设我们使用百兆带宽,意味着网站出口的实际带宽是8M左右 假设每个页面只有10k,在这个并发条件下,百兆带宽已经吃完 方案:CDN加速、负载均衡

QPS达到1000

假设使用Memcache缓存数据库查询数据,每个页面对Memcache的请求远大于直接对DB的请求 Memcache的悲观并发数在2w左右,但有可能在之前内网带宽已经吃光,表现出不稳定 方案:静态HTML缓存

QPS达到2000

这个级别下,文件系统访问锁都成了灾难 方案:做业务分离,分布式存储

通用解决方案

流量优化

服务端优化

数据库优化

Web服务器优化