2011-02-09 3 views
0

작업에서 우리는 관련 데이터/객체를 가져 오는이 메서드가 아주 멋진 것을 발견했습니다.이 PHP 예제에서 사용하는 기술을 인식하고 이름을 지정하는 데 도움이됩니다.

class Country { 

private $language; //$language will be an object of class Language 
private $regions; //$regions will be an ARRAY of Region objects 

//in the constructor i don't load regions or language 

//magic method 
    public function __get($name) { 

     $fn_name = 'get_' . $name; 

     if (method_exists($this, $fn_name)) { 
      return $this->$fn_name(); 
     } else { 
      if (property_exists($this, $name)) 
       return $this->$name; 
     } 

     return $this->$name; 
    } 

    public function get_language() { 

     if (is_object($this->language)) return $this->language; 

     $this->language = new Language($params); //example 

     return $this->language; 
    } 

    public function get_regions() { 

     if (is_array($this->regions)) return $this->regions; 

     $this->regions = array(); 

     $this->regions[] = new Region('fake'); 
     $this->regions[] = new Region('fake2'); 

     return $this->regions; 
    } 
} 

그래서 아이디어는 다음과 같습니다 :

오른쪽 예에, 나는 내부의 관련 개체를 사용해,이 클래스가

내가 나라의 인스턴스를 원하는,하지만 난 이제 언어와 지역을 필요 없어요 .

다른 경우에는 속성이 필요하므로 마법 메서드가 처음으로 해당 속성을 검색합니다.

$country = new Country(); 

echo "language is". $country->language->name; 

echo "this country has ". sizeof($country->regions)." regions"; 

주문형 방법 이름을 가진 (즉, 너무 관련 개체의 중첩 루프를 피할 수)? 지연 등록 정보? 주문형 속성? 내가 그들을 필요로 다른 경우

+3

'지연로드'는 위키피디아 힌트의 일반적인 이름은 – Mchl

답변

3

는 [...] 나 처음에만 그들을 검색합니다.

을 초기화하는 것이 적절한 표현입니다. 이를 지연 초기화이라고합니다.

http://en.wikipedia.org/wiki/Lazy_initialization

그래서 속성로 항 및 마법 방법이 속성의 과적이라고 그들

를 검색한다.

http://php.net/__get

편집 : 나는 둘의 조합에 대한 용어가 생각하지 않습니다

. 둘 다 결합하여 "오버로드를 통한 속성의 지연 초기화" "과 같은 것을 얻을 수 있습니다.

+0

입니다. – apelliciari

관련 문제