1

这是上下文:

$values = $form->getValues();
foreach($values as $key=>$value) {         
$obj->{$key} = $value;
}

如果$key是有效键,__set($name, $value)则不调用。如果$key不是一个有效的密钥,它就是。这是我的套装的样子:

public function __set($name, $value) {
    $method = 'set' . ucfirst($name);
    if(method_exists($method)) {
        $this->$method($value);
    } else {
        throw new RuntimeException('Attempt to access a non-existant property with method ' . $method);
    }
}

__set($name, $value)方法所属的对象中,所有属性都是私有的并带有下划线。因此,对于键“名称”,将有以下内容:

private $_name;

public function setName($name) {
    $this->_name = $name; 
    return $this; 
}

我知道它没有被调用,因为我尝试在$method = 'set' . ucfirst($name);. 该异常在$name没有引用有效的 setter 时被命中,但在没有引用时未被命中。应该是每次都被击中。有人知道这里发生了什么吗?

4

2 回答 2

7

这是设计使然。从手册

__set() 在将数据写入不可访问的属性时运行。

如果您有public匹配的属性$key,它们将被设置,因为它们是可访问的。

另外,您的使用method_exists()不正确。它应该是

if (method_exists($this, $method))
于 2011-10-14T00:26:34.693 回答
1

这是记录在案的行为;这就是 __set() 的实际工作方式:此处的文档

于 2011-10-14T00:27:43.303 回答