3

有成千上万个 php __get 和 __set 的例子,不幸的是没有人真正告诉你如何使用它们。

所以我的问题是:我如何在类中以及在使用对象时实际调用 __get 和 __set 方法。

示例代码:

class User{
public $id, $usename, $password;

public function __construct($id, $username) {
         //SET AND GET USERNAME
}

public function __get($property) {
    if (property_exists($this, $property)) {
        return $this->$property;
    }
}

public function __set($property, $value) {
    if (property_exists($this, $property)) {
        $this->$property = $value;
    }

    return $this;
}
}

$user = new User(1, 'Bastest');
// echo GET THE VALUE;

我将如何在构造函数中设置值以及如何在// echo GET THE VALUE;

4

1 回答 1

7

这个特性overloading在 PHP 中被调用。如文档所述,如果您尝试访问不存在或不可访问的属性,将调用__getor方法。__set您的代码中的问题是,您正在访问的属性是存在且可访问的。这就是为什么__get/__set不会被调用的原因。

检查这个例子:

class Test {

    protected $foo;

    public $data;

    public function __get($property) {
        var_dump(__METHOD__);
        if (property_exists($this, $property)) {
            return $this->$property;
        }
    }

    public function __set($property, $value) {
        var_dump(__METHOD__);
        if (property_exists($this, $property)) {
            $this->$property = $value;
        }
    }
}

测试代码:

$a = new Test();

// property 'name' does not exists
$a->name = 'test'; // will trigger __set
$n = $a->name; // will trigger __get

// property 'foo' is protected - meaning not accessible
$a->foo = 'bar'; // will trigger __set
$a = $a->foo; // will trigger __get

// property 'data' is public
$a->data = '123'; // will not trigger __set
$d = $a->data; // will not trigger __get
于 2013-09-25T12:54:37.330 回答