2013-03-22 3 views
1

우리 팀은 lazyloading 기술을 사용하여 데이터베이스에서 하위 개체를로드합니다. 이를 위해 우리는 magic __get() 메서드를 사용하고 데이터베이스 호출을합니다. 우리의 모든 속성은 보호되어 있으므로 __get 메서드는 개체 외부에서 호출되지만 문제는 사용하지 않고 개체 내에서 호출되지 않는다는 것입니다. $this->__get($name);보호 속성에 -> 연산자를 사용하여 __get()을 호출 하시겠습니까?

제 질문은 다음과 같습니다. __get() 객체 내에서도 일반 체인 연산자로 호출 할 수 있습니까? 그것은) (__get 전화를 계속 한

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

는 다음을 작성하는 것이 가능하지만 : 나는 체인 개체에 액세스하려면

내가 현재 할 필요가?

$this->subObject->subObject->subObject 

감사합니다, 요르단

답변

1

요르단,

속성이 접근 할 수없는-중 하나가 존재하지 않기 때문에, 또는 때문에 가시성의 경우를 제외하고 PHP는 __get() 메소드를 호출하지 않습니다. 속성이 호출 범위에서 숨겨지면 속성에 액세스 할 수 없기 때문에 __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

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이 있어야합니다.

관련 문제