Вот загадка: __set ($ value, $ name) не вызывается, когда существует сеттер, соответствующий ключу $ obj -> $, но вызывается, когда его нет - PullRequest
1 голос
/ 14 октября 2011

Вот контекст:

$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), все свойства являются частными и подчеркнуты. Таким образом, для ключа 'name' было бы следующее:

private $_name;

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

Я знаю, что он не вызывается, потому что я пытался вставить исключение сразу после $method = 'set' . ucfirst($name);. Это исключение было применено, когда $name не ссылалось на действительный установщик, но не было выполнено, когда оно не было. Надо было бить каждый раз. Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

7 голосов
/ 14 октября 2011

Это по замыслу. Из руководства

__set () запускается при записи данных в недоступные свойства.

Если у вас есть public свойства, соответствующие $key, они будут установлены, потому что они доступны .

Кроме того, вы используете method_exists() неправильно. Должно быть

if (method_exists($this, $method))
1 голос
/ 14 октября 2011

Это документированное поведение;Вот как на самом деле работает __set (): документация здесь .

...