Php 这里有一个难题:uu set($value,$name)在匹配$obj->$key的setter存在时不被调用,但在它不存在时被调用

Php 这里有一个难题:uu set($value,$name)在匹配$obj->$key的setter存在时不被调用,但在它不存在时被调用,php,magic-methods,Php,Magic Methods,以下是上下文: $values = $form->getValues(); foreach($values as $key=>$value) { $obj->{$key} = $value; } 如果$key是有效的键,则不调用\u set$name,$value。如果$key不是有效的密钥,则为。以下是我的套装的外观: public function __set($name, $value) { $method = 'set' . ucfirst(

以下是上下文:

$values = $form->getValues();
foreach($values as $key=>$value) {         
$obj->{$key} = $value;
}
如果$key是有效的键,则不调用\u 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);
    }
}
在uuu set$name$value方法所属的对象中,所有属性都是私有的,并带有下划线。因此,对于键“name”,将有以下内容:

private $_name;

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

我知道它没有被调用,因为我试图在$method='set'之后插入一个异常。ucfirst$name;。当$name未引用有效的setter时,该异常被命中,但当它未引用有效的setter时,该异常未被命中。它应该每次都被击中。有人知道这里发生了什么吗?

这是故意的。从

__将数据写入不可访问的属性时,将运行set

如果您有与$key匹配的公共属性,则将设置它们,因为它们是可访问的

此外,您使用的是不正确的。应该是

if (method_exists($this, $method))

这是故意的。从

__将数据写入不可访问的属性时,将运行set

如果您有与$key匹配的公共属性,则将设置它们,因为它们是可访问的

此外,您使用的是不正确的。应该是

if (method_exists($this, $method))

这是记录在案的行为;这就是集合的实际工作方式:。

这是记录在案的行为;这就是集合的实际工作方式:。

你误解了。这些属性都是私有的,并且是${key}。二传手是“设定”的。第一个$key。没有与$key完全匹配的内容。但是谢谢你用方法捕捉到我的错误。它不能解决问题。@DanielBingham您必须澄清有效密钥的含义。@Phil,如果有匹配的setter方法。我编辑了正文和标题,现在应该更有意义了。修正方法已经修正了。你误解了。这些属性都是私有的,并且是${key}。二传手是“设定”的。第一个$key。没有与$key完全匹配的内容。但是谢谢你用方法捕捉到我的错误。它不能解决问题。@DanielBingham您必须澄清有效密钥的含义。@Phil,如果有匹配的setter方法。我编辑了正文和标题,现在应该更有意义了。fixed method_exists修复了它。+1用于使用Fluent接口并在适当的情况下引发语义正确的PHP异常。+1用于使用Fluent接口并在适当的情况下引发语义正确的PHP异常。