本文提供一份 PHP 魔术方法的速查表,方便快速参考。
无论您是经验丰富的 PHP 开发者还是 PHP 开发新手,如果您使用过 PHP 的面向对象编程,那么您肯定已经使用过至少几种 PHP 魔术方法。如果您尚未听说过 PHP 魔术方法,让我来介绍一下:
PHP 提供了许多魔术方法,例如 __destruct()
、__callStatic()
、__set()
、__unset()
、__wakeup()
、__invoke()
、__clone()
、__get()
、__call()
等。 避免在这些方法中编写过多代码,为清晰性和维护性考虑,最好为成员的获取和设置定义明确的方法,或定义类方法。__serialize()
和 __unserialize()
方法需要使用虚拟属性。
示例:
<?php class Student { private $name; private $email; private $phone; private $db_connection_link; public function __construct($name, $email, $phone) { $this->name = $name; $this->email = $email; $this->phone = $phone; } public function __serialize() { return ['name' => $this->name, 'email' => $this->email, 'mobile' => $this->phone]; } public function __wakeup($data) { $this->name = $data['name']; $this->email = $data['email']; $this->phone = $data['mobile']; $this->db_connection_link = your_db_connection_function(); } } ?>
需要注意的是,只有当同时定义了 __wakeup()
方法时,才会调用 __serialize()
和 __unserialize()
方法。
__invoke()
方法
__invoke()
魔术方法是在尝试将对象像函数一样调用时调用的特殊方法。让我们先看看它是如何工作的,然后再看看这个魔术方法的用途。
<?php class Student { private $name; private $email; public function __construct($name, $email) { $this->name = $name; $this->email = $email; } public function __invoke() { echo 'Student 对象被当作函数调用!'; } } $objStudent = new Student('John', 'john@tutsplus.com'); $objStudent(); ?>
如您所见,$objStudent
对象被视为函数,由于我们已定义了 __invoke()
方法,它将被调用,而不是返回错误。__invoke()
方法的主要用途是,如果您想将对象视为可调用的,则可以实现此方法。
__clone()
方法
如果您想复制现有对象,可以使用 clone
关键字。但在克隆之后,如果您想修改克隆对象的属性,可以在您的类中定义 __clone()
魔术方法。
<?php Class Student_School {} class Student { private $name; private $email; private $object_student_school; public function __construct() { $this->object_student_school = new Student_School(); } public function __clone() { $this->object_student_school = clone $this->object_student_school; } } $objStudentOne = new Student(); $objStudentTwo = clone $objStudentOne; ?>
上述方法的问题在于它在克隆时创建对象的浅拷贝,因此克隆对象的内部对象不会被克隆。
在上述示例中,如果您没有定义 __clone()
方法,克隆对象 $objStudentTwo
将仍然指向 $objStudentOne
对象引用的同一个 Student_School
对象。因此,通过实现 __clone()
方法,我们确保 Student_School
对象与主对象一起被克隆。
__debugInfo()
方法
__debugInfo()
魔术方法在尝试使用 var_dump()
函数转储对象时被调用。如果您没有在类中定义此方法,它将转储所有公共、私有和受保护的属性。因此,如果您想限制转储时显示的信息,可以使用此方法。
<?php class Student { private $name; private $email; private $phone; private $db_connection_link; public function __construct($name, $email, $phone) { $this->name = $name; $this->email = $email; $this->phone = $phone; } public function __serialize() { return ['name' => $this->name, 'email' => $this->email, 'mobile' => $this->phone]; } public function __wakeup($data) { $this->name = $data['name']; $this->email = $data['email']; $this->phone = $data['mobile']; $this->db_connection_link = your_db_connection_function(); } } ?>
此方法应返回键值对数组,这些键值对将在 var_dump()
函数在对象上调用时显示。如您所见,您可以完全控制在使用 var_dump()
函数转储对象时想要显示的内容。
__set_state()
方法
__set_state()
方法是一个静态方法,与 var_export()
函数一起使用。var_export()
函数输出关于变量的结构化信息。当您使用此函数导出类时,需要在类中定义 __set_state()
方法。
<?php class Student { private $name; private $email; public function __construct($name, $email) { $this->name = $name; $this->email = $email; } public function __invoke() { echo 'Student 对象被当作函数调用!'; } } $objStudent = new Student('John', 'john@tutsplus.com'); $objStudent(); ?>
如您所见,导出的字符串是有效的 PHP 代码,您可以使用它来恢复原始对象。
总结
本文介绍了 PHP 中所有可用的魔术方法。对于每种方法,我都提供了一个简短但有意义的示例,这应该有助于您理解其用途。我希望您可以将本文用作日常 PHP 开发中的快速参考或速查表。
本文已更新,并包含来自 Monty Shokeen 的贡献。Monty 是一位全栈开发者,他也喜欢编写教程和学习新的 JavaScript 库。
以上是php魔法方法作弊表的详细内容。更多信息请关注PHP中文网其他相关文章!