php魔术方法有哪些:完整清单与调用时机
php魔术方法有哪些,官方文档一共列出17个双下划线开头的预留方法,分别是__construct、__destruct、__call、__callStatic、__get、__set、__isset、__unset、__sleep、__wakeup、__serialize、__unserialize、__toString、__invoke、__set_state、__clone、__debugInfo;除构造、析构、克隆三个方法外,其余魔术方法必须定义为public,否则PHP8.0及以上版本会抛出警告,仅在面向对象场景下生效,普通函数内无法触发魔术调用。
魔术方法分组清单
| 分组类型 | 包含方法 | 触发条件 |
|---|---|---|
| 对象生命周期 | __construct、__destruct、__clone | 实例创建、对象销毁、对象克隆时自动执行 |
| 属性访问拦截 | __get、__set、__isset、__unset | 读写未定义或受保护的成员属性时触发 |
| 方法调用拦截 | __call、__callStatic | 调用不存在的实例方法与静态方法时触发 |
| 序列化与反序列化 | __sleep、__wakeup、__serialize、__unserialize | serialize与unserialize执行前后自动调用 |
| 对象类型转换 | __toString、__invoke | 对象被当作字符串输出、对象被当作函数调用时触发 |
| 调试与导出 | __debugInfo、__set_state | var_dump打印对象、var_export导出类实例时触发 |
序列化相关魔术方法存在版本差异。
核心方法使用规则
你在编写类代码时,不要随意自定义双下划线开头的方法名,这类名称全部被PHP内核预留,强行定义会自动触发魔术逻辑,容易出现非预期的程序行为。
__construct作为构造函数,不会在unserialize反序列化对象时自动执行,这是开发反序列化功能时容易踩坑的边界条件。
__toString必须严格返回字符串类型,一旦返回其他数据类型,会抛出可恢复级别的错误,PHP7.4之后才允许在这个方法内部抛出异常。
权限与版本约束
依据PHP官方手册给出的规范,__construct、__destruct、__clone可以使用protected、private权限,其余14个魔术方法只能设置为public;PHP8.0之前,序列化类魔术方法未做权限校验,不会弹出警告,升级PHP版本后会直接产生报错提示。
__serialize与__unserialize是PHP7.4新增的方法,优先级高于旧版的__sleep与__wakeup,只要同时定义两组方法,程序只会执行新版序列化方法。
想要了解更多关于php魔术方法有哪些的文章欢迎访问:百科
