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)は、すべてのプロパティがプライベートであり、下線が引かれています。したがって、キー'name'の場合、次のようになります。

private $_name;

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

の直後に例外を挿入しようとしたので、呼び出されないことはわかってい$method = 'set' . ucfirst($name);ます。この例外は$name、有効なセッターを参照していない場合にヒットしましたが、参照していない場合はヒットしませんでした。毎回ヒットするはずだった。誰かがここで何が起こっているのか手がかりがありますか?

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 に答える