2012-02-24 2 views
1

좋은 습관으로 모든 오버로드 된 __get 함수는 http://us3.php.net/manual/en/language.oop5.overloading.php#object.isset에서이 예제처럼 보이고 디버깅 코드를 포함해야합니까?PHP __get 오버로드 코드 우수 사례

public function __get($name) 
{ 
    echo "Getting '$name'\n"; 
    if (array_key_exists($name, $this->data)) { 
     return $this->data[$name]; 
    } 

    /*question specific code from here on*/ 

    $trace = debug_backtrace(); 
    trigger_error(
     'Undefined property via __get(): ' . $name . 
     ' in ' . $trace[0]['file'] . 
     ' on line ' . $trace[0]['line'], 
     E_USER_NOTICE); 
    return null; 
} 

과부하 모든 클래스에 포함 된 코드가 중복 될 수 있습니다.

+0

상속 또는 정적 도우미 클래스에 대해 생각해 보셨습니까? – rcdmk

답변

0

debug_backtrace()trigger_error() 대신 예외가 발생합니다.

그래도 상황에 따라 다릅니다. 키가 존재하지 않으면 완전히 다른 작업을 수행 할 수 있습니다.

0

이러한 경우에는 "우수 사례"가 없습니다.

  1. 트리거 통지/
  2. 예외
  3. 돌아 null을 던져 (당신의 예에서와 같이) 경고 (:

    개체 예상되는 동작에 따라 (그것은 아무것도 더 작업에 따라 다름) 또는 다른 미리 정의 된 값)

0

아니요이 예제에서는 멤버 변수를 가져 와서 배열 멤버 변수에 저장합니다. 당신은 어디서나 그것을 과부화해서는 안됩니다. 이것을 부모 클래스에 넣고 상속 받도록해야합니다.

또한 오류를 유발하는 출력은 구식입니다. 새 예외 클래스를 만들고 대신 throw합니다 (예 : PropertyNotFoundException).

0

당신은 약간의 DRYer가 될 것 같은 전역 유틸리티 함수에서 사용하는 예외 처리를 래핑 할 수 있습니다. 또한 AOP 라이브러리를 사용하여이 기능을 기존 클래스에 삽입 할 수 있습니다.

1

아니요. 오버로드 된 __get 함수는이 예제처럼 보이지 않아도됩니다.

IMHO, 이러한 마법의 기능을 피하는 것이 좋습니다. 매력적이지만이 "마술"을 사용하면 유지하기 어려운 코드가됩니다. 적어도 이것은 나의 경험이었습니다.

오늘 내가 따라야 할 "원리"중 하나는 "IDE에 친숙한"클래스를 갖는 것입니다. 내 말은 : Eclipse PDT를 사용하고 $variable이 주어진 클래스에 속하는 경우 자동 완성 기능을 사용하여 사용 가능한 모든 메소드와 속성을 표시해야합니다. 이 마법 방법을 사용하면 무엇을 사용할 수 있는지 결코 알 수 없습니다.

이것은 일반적인 조언 일 뿐이며 특정 사례에는 적용되지 않을 수 있습니다.