1,require()和include区别?
include:如果文件不存在,导致致命错误,脚本停止;每次都要进行读取评估。
require:如果文件不存在,导致一个警告,脚本继续;只处理多次。
2,isset()和empty()区别?
isset:变量等于null或者没有初始化,返回false,否则返回true。
empty:变量未设置,或者等于0,null,空字符串返回true,否则返回false。
3,php中传值与传引用区别?
传值是将变量的值复制一份,函数内修改不影响外部。整数,浮点数,字符串,数组传递方式是传值。
传引用是将变量的引用传递过去,内存的数据只有一份,函数内修改影响外部。对象,资源是传引用。
4,魔术方法有哪些?
__construct():构造方法,在创建对象时自动调用。
__destruct():析构方法,在对象被销毁时自动调用,用于释放资源或执行清理操作。
__get($k) 和 __set($k,$v):用于获取和设置对象的属性自动调用。
__isset($k) 和 __unset($k):当对一个不可访问的属性进行isset()或unset()操作时自动调用。
__call($fun,$p) 和 __callStatic($fun,$p):调用了不存在的方法时调用,分别在实例方法和静态方法中自动调用。
__toString():将对象转换为字符串时自动调用,可以定义对象的字符串表示形式。
__clone():克隆方法,在对象被克隆时自动调用,用于执行对象的深拷贝操作。
__sleep() 和 __wakeup():用于序列化和反序列化对象时自动调用,分别在对象被序列化和反序列化时执行一些特定的操作。
__invoke 当尝试以调用函数的方式调用一个对象时,方法会被自动调用。
__set_state($p),调用var_export()导出类时,此静态方法会被调用
__serialize(),对象序列化的时候被调用(PHP7.4版本加入)
__unserialize($p),对象反序列化的时候被调用(PHP7.4版本加入)
5,array_merge和array+array的区别?
array_merge:数组key是相同且是数字,都会返回,索引会变;key相同是字符串,保留后面那个的key,value,前面的舍弃。
array+array:数组key是相同(不管什么类型)保留前一个的key,value,后面的舍弃。
6,接口,抽象类,具体类区别?
接口:关键字用interface;全部都是抽象方法,不能有具体方法;继承用implement,可以是多继承;接口不能实例化;
抽象类:用abstract修饰的类;可以有具体方法,也可以有抽象方法,可以没有抽象方法,也可以没有具体方法;继承用extends,只能单继承;抽象类不能实例化。
具体类:不能有抽象方法;可以被其他类继承,用extends;可以实例化。
7,$this和self、parent这三个关键词分别代表什么?在哪些场合下使用?
$this 当前对象,在当前类中使用,使用->调用属性和方法
self 当前类,需要使用::调用,调用静态变量或者静态方法
parent 当前对象的父类,调用父类的方法
8,单引号和双引号的区别?
双引号会解析变量、换行,而单引号不会,所以单引号的执行效率高。
9,magic_quotes_gpc()、magic_quotes_runtime()的意思是什么?
magic_quotes_gpc()是php配置文件中的,如果设置为on则会自动POST,GET,COOKIE中的字符串进行转义,在'之前加\
magic_quotes_runtime()是php中的函数,如果参数为true则会数据库中取出来的单引号、双引号、反斜线自动加上反斜杠进行转义。
10,简述 private、 protected、 public修饰符的访问权限。
private : 私有成员, 只能在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
11、类中如何定义常量、如何类中调用常量、如何在类外调用常量。
类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。
定义常量使用关键字const.
例如:const PI = 3.1415326;
无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,
访问常量的格式都是类名加作用域操作符号(双冒号)来调用。
即:类名 :: 类常量名;
12,在php中,函数和方法有什么区别和联系?
函数是单独存在的,是面向过程的部分;方法是依赖于类的,是面向对象的部分。
函数没有权限的概念,在程序的任何地方都可以调用;成员方法调用前需要实例化类,静态方法需要明确哪个类,有权限的概念,比如private只能在类内调用。
13,在PHP中,如何进行错误处理?
对于可能出现异常的代码块,可以使用try-catch进行捕获,也可以通过set_error_handle函数捕获全局的异常并进行处理,为了安全,也会通过配置或者设置(例如display_errors,error_reporting等)屏蔽一些异常。
14,请谈谈异常处理(try-catch)机制。
可以使用
try
、
catch
和
finally
块来捕获和处理在代码执行过程中抛出的异常,使程序更健壮。
try块:在try块中,你编写可能抛出异常的代码。如果try块中的代码抛出了异常,那么程序的控制流将立即跳出try块,并查找匹配的catch块。
catch块:catch块用于捕获并处理特定的异常。你可以定义多个catch块来捕获不同类型的异常。当异常被抛出时,PHP将查找与异常类型匹配的catch块,并执行相应的代码。catch块可以有多个。
finally块(可选):finally块包含无论是否发生异常都需要执行的代码。无论是否抛出异常或是否找到匹配的catch块,finally块中的代码都会被执行。这通常用于清理资源或执行必要的后续操作。
15,PHP中的继承、封装和多态是如何实现的?
继承,封装,多态是面对对象编程的三大核心特征。
继承允许子类继承父类的属性和方法(php只支持单继承),通过继承重用父类的代码,并且何以添加和覆盖父类的方法。
封装是将属性和方法隐藏在内部,隐藏内部的状态和实现细节,从而提供数据的安全性和完整性。
多态是允许使用统一的接口来处理不同的类型。多态主要是通过重写实现的。
16,解释一下PHP中的构造函数和析构函数。
构造函数是在创建类的实例的时候自动调用。他的作用是初始化对象的属性或者其他的设置操作。构造函数与类名称完全相同或者是__construct()。
析构函数是在对象销毁时,自动调用的,用于执行清理操作。是__destruct()形式。
17、什么是 CSRF 攻击?XSS 攻击?如何防范?
CSRF:跨站请求伪造,用户通过跨站请求,以合法身份做非法得事情。防范的方法包括token验证,Refer验证,验证码,输入密码等方式。
XSS:它会通过合法的操作(比如在 url 中输入、在评论框中输入),向你的页面注入脚本(可能是 JS、html 代码块)。防范的方法有数据检查,数据内容过滤,数据内容转义。
18,Trait是什么?
Trait 为了减少单继承语言的限制而准备的一种代码复用机制。
如果存在同名方法,本类同名方法会覆盖Trait中方法,Trait中方法会覆盖父类的同名方法。
引用的多个Trait都有同名方法,可以通过起别名解决,例如
class TClass {
use ATrait, BTrait { //类中引用了两个Trait,他们都有fun方法
ATrait::fun as afun; // Atrait中的fun方法起名叫afun,afun调用的就是ATrait的fun方法
BTrait::fun as bfun; // Btrait中的fun方法起名叫bfun,bfun调用的就是BTrait的fun方法
}
}
19,php-fpm的进程管理方式?
php-fpm的进程管理方式主要有三种,分别是ondemand、static、dynamic。
ondemand:有请求过来了,就拉起worker进程,如果worker在单位时间内没有请求可执行,就结束掉,这种由于请求来了才拉起worker进程,请求效率会比较低,系统资源不存在浪费的情况。
static:无论是否有请求,worker进程数总是固定的,在请求很少的情况下,worker进程也全部都在,一直占用系统资源。
dynamic:如果请求少,worker进程数会相应的减少,但是要比请求数多些,如果请求多,worker进程数会增加,但是不会超过设置的最大进程数,兼顾了系统资源利用和请求效率,比较常用的配置。
------------------------------------------推荐阅读----------------------------------------------------------------
http,tcp,nginx相关的面试题
PHP高级面试题大全(附带详细答案)
mysql面试题详解(含详细解析)
版权归原作者 geegtb 所有, 如有侵权,请联系我们删除。