この質問が何度か聞かれたことは知っていますが、回避策の本当の答えはありません。たぶん私の特定のケースのためのものがあります。
__get()
他のオブジェクトを遅延ロードするためにmagicメソッドを使用するマッパークラスを構築しています。これは次のようになります。
public function __get ( $index )
{
if ( isset ($this->vars[$index]) )
{
return $this->vars[$index];
}
// $index = 'role';
$obj = $this->createNewObject ( $index );
return $obj;
}
私のコードでは、次のことを行います。
$user = createObject('user');
$user->role->rolename;
これは今のところ機能します。オブジェクトには「User
role」というプロパティがないため、マジック__get()
メソッドを使用してそのオブジェクトを作成し、「role」オブジェクトからそのプロパティを返します。
しかし、'rolename'を変更しようとすると:
$user = createUser();
$user->role->rolename = 'Test';
次に、次のエラーが発生します。
注意:オーバーロードされたプロパティを間接的に変更しても効果はありません
これがまだPHPのバグなのか、それとも「期待される動作」なのかはわかりませんが、いずれにせよ、私が望むようには機能しません。これは本当に私にとってのショーストッパーです...一体どうやって遅延ロードされたオブジェクトのプロパティを変更できるのでしょうか??
編集:
実際の問題は、複数のオブジェクトを含む配列を返す場合にのみ発生するようです。
問題を再現するサンプルコードを追加しました。
PHP環境でこれを実際に実行する必要があります。実際には「エラー」が表示されます。しかし、ここでは本当に興味深いことが起こっています。
オブジェクトのプロパティを変更しようとすると、「cantchangeoverloadedproperty」という通知が表示されます。しかし、その後プロパティをエコーすると、実際に値が変更されたことがわかります...本当に奇妙です...