PHP面试题

1,PHP SPL(PHP标准库)

SPL是用于解决典型问题(standard problems)的一组接口与类的集合。
目前在使用中,SPL更多地被看作是一种使object(对象)模仿array(数组)行为的interfaces和classes。
spl数据结构:双向链表,堆栈,队列。
spl常用的迭代器:
SPL函数的使用:使用spl_autoload_register装载类, __autoload装载类,自定义__autoload函数装载类

2,file_get_contents():将整个文件读入一个字符串.
3,array_diff():比较两个数组的键值,并返回差集
4,apache 和 nginx 区别:

nginx 相对 apache 的优点:轻量级,同样起web 服务,比apache 占用更少的内存及资源抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能高度模块化的设计,编写模块相对简单社区活跃,各种高性能模块出品迅速啊。
apache 相对nginx 的优点:
rewrite ,比nginx 的rewrite 强大模块超多,基本想到的都可以找到少bug ,nginx 的bug 相对较多超稳定。

最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程。


5,PHP 有多线程么?--没有。但是可以通过其他方式实现,函数popen()打开进程, pclose($file)关闭。


6,怎样理解 PHP 对于静态页面文件,是放在 ngnix 端,还是 Server 端?

ngnix 处理静态页面性能比 apache 要快三倍以上,所以直接放在 ngnix


PHP 魔术方法有哪些,作用是什么
__construct()
构造函数是目前为止最经常使用的函数。在创建对象时,可以在构造函数中做 一些初始化工作。可以为构造函数定义任意多个参数,只要在实例化时传入对应个数的参数 即可。构造函数中出现的任何异常都会阻止对象的创建。

__desctruct()
析构函数通常在对象被销毁时调用,析构函数不接收任何参数。经常在析构函数 中执行一些清理工作,比如关闭数据库连接等。

__get()
在我们尝试访问一个不存在的属性时会被调用。它接收一个参数,该参数表 示访问属性的名字,并且将该属性的值返回。

__set()
魔术方法在我们尝试修改一个不可访问的属性时会被调用,它接收两个参数,一个表 示属性的名字,一个表示属性的值。

__isset()
魔术方法在对一个不可访问的属性调用 isset()方法时会被调用,它接收一个参数, 表示属性的名字。它应该返回一个布尔值,用来表示该属性是否存在。

__unset()
魔术方法在调用 unset()函数销毁一个不能访问的属性时会被调用,它接收一个参数, 表述属性的名字。

__toString()
在我们将对象当作字符串一样使用时会被调用,它不接收任何参数。该方法允许 我们定义对象的表现形式。

__clone()
魔术方法__clone()可以解决上面的问题。当对一个对象使用 clone 关键字时,该魔 术方法会被调用。

__sleep()
魔术方法__sleep()在对一个对象序列化时(调用 serialize())会被调用。它不 接收任何参数,而且应该返回一个包含所有应该被序列化的属性的数组。在该魔 术方法中,也可以执行一些其他操作。 有一点要注意的是,不要再该函数中进行任何的析构操作,因为这可能会影响正 在运行的对象。

__wakeup()
魔术方法__wakeup()在对存储的对象反序列化时会被调用。它不接收任何参数,也没有任何 返回值。可以用它来处理在序列化时丢失的数据库连接或资源。

__call()
魔术方法__call()在调用不存在或不可访问的方法时会被调用。它接收两个参数,一个是调用 的方法的名字,一个是包含函数参数的数组。我们可以使用这种方法调用子对象中得同名函 数。

callStatic()
静态访问的时候会访问它

魔术方法__call()在调用不存在或不可访问的方法时会被调用。它接收两个参数,一个是调用 的方法的名字,一个是包含函数参数的数组。我们可以使用这种方法调用子对象中得同名函 数。


用过哪些数组函数?
array_values($arr); 获得数组的值

array_keys($arr); 获得数组的键名

array_flip($arr);//数组中的值与键名互换(如果有重复前面的会被后面的覆盖)

array_search('PHP',$arr); //检索给定的值,加 true 则是严格类型检查

array_reverse($arr); //将数组中的元素翻转(前后顺序)

in_array("apple",$arr); //在数组中检索apple

array_key_exists("apple", $arr); // 检索给定的键名是否存在数组中

array_count_values($arr); // 统计数组中所有值出现的次数

array_unique($arr); 移除数组中重复的值


说一下快速排序的最好和最坏时间复杂度 (nlogn n 的平方) 。
快速排序是对冒泡排序的优化说以最好时间复杂度为 nlogn,最坏为 n 的平方 。
简述快速排序的原理 面试前最好先熟悉一下常用算法和数据结构,另外不可忽略了时间复 杂度。

二分查找的原理和时间复杂度? (logn) 时间复杂度第一次回答错了。


数据库中的索引有哪些,数据库引擎区别(MyIsam 和 InnoDB)

  1. InnoDB 不支持 FULL TEXT(全文索引) 类型的索引。

  2. InnoDB 中不保存表的具体行数,也就是说,执行 select count() from table 时,InnoDB 要扫一遍整个
    表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。注意的是,当 count(
    )语句包含
    where 条件时,两种表的操作是一样的。

  3. 对于 AUTO_INCREMENT 类型的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中,可以和其他字段一起建立联合索引。InnoDB表自增id 清空表后id数会继续接着往下自增,mysql重启之后会归1,而MyISAM却不会。

  4. DELETE FROM table 时,InnoDB 不会重新建立表,而是一行一行的删除。

  5. LOAD TABLE FROM MASTER 操作对 InnoDB 是不起作用的,解决方法是首先把 InnoDB 表改成 MyISAM
    表,导入数据后再改成 InnoDB 表,但是对于使用的额外的 InnoDB 特性(例如外键)的表不适用。


队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求和相应的时间


时序攻击
在 php 中比较字符串相等时如果使用双等 == 可能会有时序攻击的危险.
比如比较

"abscdd" == $request->code

那么两个字符串是从第一位开始逐一进行比较的,发现不同就立即返回 false,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就可以按位破解。

而使用 hash_equals 比较两个字符串,无论字符串是否相等,函数的时间消耗是恒定的,这样可以有效的防止时序攻击。

hash_equals('abscdd',$request->code)

你可能感兴趣的:(PHP面试题)