1. __construct()
作用:类的构造函数,在创建对象时自动调用。
使用场景:用于初始化对象的属性或执行一些准备工作。
示例:
class MyClass { public function __construct() { echo "对象已创建!"; }}$obj = new MyClass(); // 输出:对象已创建!
2. __destruct()
作用:类的析构函数,在对象被销毁时自动调用。
使用场景:用于释放资源或执行清理操作。
示例:
class MyClass { public function __destruct() { echo "对象已销毁!"; }}$obj = new MyClass();unset($obj); // 输出:对象已销毁!
3. __get($name)
作用:在访问不可访问或未定义的属性时自动调用。
使用场景:用于动态获取属性值。
示例:
class MyClass { private $data = []; public function __get($name) { return $this->data[$name] ?? null; }}$obj = new MyClass();echo $obj->name; // 输出:null
4. __set($name, $value)
作用:在给不可访问或未定义的属性赋值时自动调用。
使用场景:用于动态设置属性值。
示例:
class MyClass { private $data = []; public function __set($name, $value) { $this->data[$name] = $value; }}$obj = new MyClass();$obj->name = "PHP";echo $obj->name; // 输出:PHP
5. __isset($name)
作用:在对不可访问或未定义的属性调用
isset()
或empty()
时自动调用。使用场景:用于动态检查属性是否存在。
示例:
class MyClass { private $data = []; public function __isset($name) { return isset($this->data[$name]); }}$obj = new MyClass();var_dump(isset($obj->name)); // 输出:bool(false)
6. __unset($name)
作用:在对不可访问或未定义的属性调用
unset()
时自动调用。使用场景:用于动态删除属性。
示例:
class MyClass { private $data = []; public function __unset($name) { unset($this->data[$name]); }}$obj = new MyClass();$obj->name = "PHP";unset($obj->name);
7. __call($name, $arguments)
作用:在调用不可访问或未定义的方法时自动调用。
使用场景:用于动态处理未定义的方法调用。
示例:
class MyClass { public function __call($name, $arguments) { echo "调用了未定义的方法:$name"; }}$obj = new MyClass();$obj->undefinedMethod(); // 输出:调用了未定义的方法:undefinedMethod
8. __callStatic($name, $arguments)
作用:在静态调用不可访问或未定义的方法时自动调用。
使用场景:用于动态处理未定义的静态方法调用。
示例:
class MyClass { public static function __callStatic($name, $arguments) { echo "调用了未定义的静态方法:$name"; }}MyClass::undefinedStaticMethod(); // 输出:调用了未定义的静态方法:undefinedStaticMethod
9. __toString()
作用:在将对象当作字符串使用时自动调用。
使用场景:用于定义对象的字符串表示形式。
示例:
class MyClass { public function __toString() { return "这是一个 MyClass 对象"; }}$obj = new MyClass();echo $obj; // 输出:这是一个 MyClass 对象
10. __invoke()
作用:在将对象当作函数调用时自动调用。
使用场景:用于使对象可以像函数一样被调用。
示例:
class MyClass { public function __invoke($param) { echo "对象被调用,参数:$param"; }}$obj = new MyClass();$obj("PHP"); // 输出:对象被调用,参数:PHP
11. __sleep()
作用:在对象被序列化时自动调用,返回需要序列化的属性数组。
使用场景:用于控制序列化时保存哪些属性。
示例:
class MyClass { public $name = "PHP"; private $secret = "123"; public function __sleep() { return ['name']; // 只序列化 name 属性 }}$obj = new MyClass();echo serialize($obj); // 输出:O:7:"MyClass":1:{s:4:"name";s:3:"PHP";}
12. __wakeup()
作用:在对象被反序列化时自动调用。
使用场景:用于重新初始化对象或恢复资源。
示例:
class MyClass { public $name; public function __wakeup() { $this->name = "PHP"; }}$obj = unserialize('O:7:"MyClass":0:{}');echo $obj->name; // 输出:PHP
13. __clone()
作用:在对象被克隆时自动调用。
使用场景:用于控制克隆对象的行为。
示例:
class MyClass { public function __clone() { echo "对象已被克隆!"; }}$obj = new MyClass();$clone = clone $obj; // 输出:对象已被克隆!
14. __debugInfo()
作用:在使用
var_dump()
打印对象时自动调用,返回要显示的属性数组。使用场景:用于控制调试信息的输出。
示例:
class MyClass { private $secret = "123"; public function __debugInfo() { return ['message' => '这是一个调试信息']; }}$obj = new MyClass();var_dump($obj); // 输出:object(MyClass)#1 (1) { ["message"]=> string(18) "这是一个调试信息" }
15. __set_state($properties)
作用:在使用
var_export()
导出对象时自动调用,返回一个可用的对象表示。使用场景:用于自定义对象的导出格式。
示例:
class MyClass { public $name; public static function __set_state($properties) { $obj = new MyClass(); $obj->name = $properties['name']; return $obj; }}$obj = new MyClass();$obj->name = "PHP";eval('$newObj = ' . var_export($obj, true) . ';');echo $newObj->name; // 输出:PHP
16. __serialize()
和 __unserialize()
(PHP 7.4+)
作用:用于替代
__sleep()
和__wakeup()
,提供更灵活的序列化控制。使用场景:用于自定义序列化和反序列化逻辑。
示例:
class MyClass { private $data = []; public function __serialize() { return ['data' => $this->data]; } public function __unserialize($data) { $this->data = $data['data']; }}