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、__unserializeserialize与unserialize执行前后自动调用
对象类型转换__toString、__invoke对象被当作字符串输出、对象被当作函数调用时触发
调试与导出__debugInfo、__set_statevar_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魔术方法有哪些的文章欢迎访问:百科