首页  >  文章  >  后端开发  >  PHP 的 `__get` 和 `__set` 魔术方法什么时候被实际调用?

PHP 的 `__get` 和 `__set` 魔术方法什么时候被实际调用?

Patricia Arquette
Patricia Arquette原创
2024-11-15 12:53:02276浏览

When are PHP's `__get` and `__set` magic methods actually invoked?

PHP 魔术方法:揭开用于属性重载的 __get 和 __set

在 PHP 中,__get 和 __set 魔术方法提供了另一种处理方法超越传统 getter 和 setter 的属性访问和修改。这些方法使开发人员能够在未显式定义请求的属性时拦截和自定义属性访问的行为。

但是,一个常见的误解是 __get 和 __set 方法用于重载 get 和 set 关键字。这并不完全准确。

属性重载和魔术方法

虽然 __get 和 __set 方法可用于某种形式的属性重载,但它们与典型的重载不同其他语言中的方法。 PHP 通过公共、受保护和私有属性声明显式处理属性访问。如果未在给定范围内声明属性,PHP 将生成错误。

当 PHP 尝试访问未显式声明的属性时,魔法方法就会发挥作用。在这种情况下,__get 和 __set 方法提供了一种动态处理属性访问的方法。

使用 __get 和 __set

来说明 __get 和 __set 方法的用法,考虑以下示例:

class foo {
    public $bar;  // Public property
    public function __get($name) {
        echo "Get:$name";
        return $this->$name;  // Custom behavior for accessing inaccessible properties
    }
    public function __set($name, $value) {
        echo "Set:$name to $value";
        $this->$name = $value;  // Custom behavior for setting inaccessible properties
    }
}

在此场景中,__get 和 __set 方法旨在在访问或修改 $bar 属性时提供自定义行为。例如,调用 echo $foo->bar;会触发 __get 方法,而 $foo->bar = 'test';将涉及 __set 方法。

调试和常见陷阱

但是,如原始问题中所述,如果该属性已经公开声明(如本例所示) ,PHP 运行时将直接访问该属性。因此,__get 和 __set 方法不会被调用。

这种行为在 PHP 手册的属性重载部分得到了确认,其中指出 __set 和 __get 方法仅在向不可访问的属性写入或读取数据时才会被调用,不是公共属性。

一般来说,魔术方法不应被视为正确的 getter 和 setter 函数或直接方法调用的替代品。它们的主要目的是处理无效的属性访问并在这种情况下提供替代行为。此外,值得注意的是,与直接属性访问相比,魔术方法可能会导致性能损失。

为了解决原始问题中遇到的问题,可以定义显式的 getter 和 setter 方法,这将直接处理属性访问和修改。这种方法更加高效,并且可以更好地控制属性访问语义。

以上是PHP 的 `__get` 和 `__set` 魔术方法什么时候被实际调用?的详细内容。更多信息请关注PHP中文网其他相关文章!

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