1

私のチームは、遅延読み込み手法を使用して、データベースからサブオブジェクトを読み込みます。これを行うには、magic __get()メソッドを使用して、データベース呼び出しを行います。すべてのプロパティが保護されているため、__ getメソッドはオブジェクトの外部から呼び出されますが、問題は、使用せずにオブジェクトの内部から呼び出されないことです。$this->__get($name);

だから私の質問は:オブジェクト内からでも通常の連鎖演算子で__get()を強制的に呼び出すことは可能ですか?

オブジェクトアクセスをチェーンしたい場合は、現在、次のことを行う必要があります。

$this->__get('subObject')->__get('subObject')->__get('subObject') 

次のように書くことは可能ですが、それでも__get()を呼び出しますか?

$this->subObject->subObject->subObject

ありがとう、ジョーダン

4

2 に答える 2

1

ヨルダン、

__get()プロパティが存在しないか、可視性があるためにプロパティにアクセスできない場合を除いて、PHPはメソッドを呼び出しません。プロパティが呼び出し元のスコープから非表示になっている場合、プロパティにアクセスできないため、__ get()メソッドが呼び出されます。プロパティが参照され、呼び出し元のスコープで使用できる場合、__ get()は起動しません。(既存の/アクセス可能なプロパティに対して起動することを意図したものではありません。)

これを回避するには、内部プロパティの名前を変更する必要があります。それらの前に名前またはアンダースコアを付けるか、特別な名前を付けて共通の配列パラメーターに格納します。以下は多少工夫されていますが、この状況にどのように対処できるかを示す必要があります。

class MyObject {
   protected $lazyloads = array();

   protected function lazyload($relation) {
     // ...
   }

   public function __get($key) {
     if (isset($this->lazyloads[$key]) {
       return $this->lazyloads[$key];
     } else {
       return $this->lazyload($key);
     }
   }
}

参照:http ://www.php.net/manual/language.oop5.overloading.php#object.get

于 2013-03-22T15:46:30.413 に答える
0

@Robert Kまたは(たとえば):

class A
{
    protected $objects = array();

    public function __get($name)
    {
        if(isset($this->objects[$name])) {
            return $this->objects[$name];
        }
        return null; // or throw \Exception
    }
}
class B
{
    protected $objects = array();

    public function __get($name)
    {
        // for example: $this->objects[$name] is type of A
        if(isset($this->objects[$name])) {
            return $this->objects[$name];
        }
        return null; // or throw \Exception
    }
}

__get返される各オブジェクトには、オブジェクトを返すマジックメソッドが必要です。

于 2013-03-22T15:48:55.367 に答える