2011-12-17 4 views
0

私は可変オーバーロードのために__get__setメソッドを使用しています。 Iは、例えば、変数に別のオブジェクトを割り当てるいくつかの場合においてPHPのオーバーロード - 回避注意:非オブジェクトのプロパティを取得しようとしています

$object->name->another = $another_object; 

$objectは、__get__set方法を有しています。私はそれが設定されています前に$object->name->anotherにアクセスしようとすると、私はエラーを取得する

お知らせ:非オブジェクト

のプロパティを取得しようとするが、この使用してオーバーロードを中心にとにかくありますか?その変数をチェックする必要はありません。

ありがとうございます!

+0

'isset'を使用すると何が問題になりますか? –

答えて

1

ない$objectいますが、問題のエラーを回避するために相互作用するかどう__get()/__set()でオーバーロードを持つように$object->name必要があります。たとえば

$object->name->another = 'something'; 
^^^^^^^^^^^^^ 

あなたは空のstdClassオブジェクトを返す$object::__get()作ることができ、PHPうこの場合、パブリックメンバーを自動的に割り当てます。

+0

Hmm ..返すべきキーを具体的に定義する必要がありますか?空の標準クラス?これを動的に行う方法はありますか? – dzm

+0

エラーを防ぐために、すべてのキーを返すことができます。PHPは自動的に次の不足しているメンバーを追加します。 – hakre

0

「名前」のオーバーロードされたクラスが返されていることを確認してください。 PHPはプロパティをフェッチし、結果のオブジェクトに2番目のプロパティを設定しようとします。

<?php 
class Bob { 
    public function __get($name) { 
     return new Jim(); 
    } 
} 
class Jim extends Bob { 
    public function __get($name) { 
     return 12; 
    } 
} 

$b = new Bob(); 
echo $b->someJim->apples; 
2

これは、あなたの質問に答えていないが、それは重要な側面に対処します。

それはあなたがその通知を上げるためにあなたの魔法__get__set方法を許すべきではないことは注目に値します。 「ベストプラクティス」は、この目的のために特別に設計された新しい(ish)SPL Exceptionタイプの1つをスローすることです。たとえば、次のように

public function __get($name) 
{  
    if (isset($this->vals[$name])) { 
    return $this->vals[$name]; 
    } else { 
    $msg = "Invalid property: '$name' does not exist"; 
    throw new OutOfBoundsException($msg); 
    } 
} 

そして__setのために...

public function __set($name, $val) 
{  
    if (isset($this->vals[$name])) { 
    $this->vals[$name] = $val; 
    } else { 
    $msg = "Invalid property: '$name' does not exist"; 
    throw new OutOfBoundsException($msg); 
    } 
} 

は、ここで新しいSPL例外の種類の対象にa link to a helpful articleです。

+0

これで、$ object-> name-> anotherの代わりに$ object-> name ['another']を使用しますか? – dzm

+0

いいえ、これはあなたのクラスの保護された$ valsプロパティにあなたの魔法のプロパティを格納してアクセスする実装例です。あなたが '$ object-> name'に割り当てるエンティティは、' $ another'プロパティを持つ実際のオブジェクトでなければなりません。 – rdlowrey

関連する問題