首页 >后端开发 >php教程 >php魔法方法作弊表

php魔法方法作弊表

William Shakespeare
William Shakespeare原创
2025-03-07 11:25:09595浏览

PHP Magic Methods Cheatsheet

本文提供一份 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn