2010-06-21 4 views
6

PHP에는 _get 및 _set 함수가 내장되어 있습니다. 각 변수에 대한 자체 get 및 set 함수를 작성하는 것이 좋습니까, 아니면 if의 톤을 사용하여 내장 함수를 사용하는 것이 더 낫습니까? 각 방법의 장단점은 무엇입니까?PHP의 _get & _set 또는 각 변수에 대한 고유 한 get 및 set 함수?

+0

공개 필드가 아닌 '__get'과'__set'을 사용해야하는 이유를 설명하면 도움이 될 것입니다. 나중에 언제나'__get'과'__set'로 변경할 수 있습니다. –

+0

데이터가 합법적인지, 데이터 중 일부가 데이터베이스에 저장되기 전에 다시 포맷되어야 하는지를 확인할 수 있기를 원합니다. –

답변

4

__get__set은 일반적으로 어려운 문제를 해결하기 위해 설계 기준으로 사용되는 마법 방법입니다.

예를 들어 OOP를 깊은 상속 (> 2)으로 사용하는 사이트를 분석해야하는 프로젝트에서 중요한 기본 클래스 중 하나에 name이라는 공용 속성이 있다고 생각했습니다. 그러나 getter와 setter (getName, setName)는 해당 속성을 가져오고 설정하는 목적으로 액세스했습니다. getName이라는 많은 클래스가 있고 name 속성에 직접 액세스 한 클래스가 많습니다. 훌륭하지 않은 디자인.

마법 메서드를 사용하면 속성 이름을 _name으로 변경하고 비공개로 설정하여 getters 및 setters를 통해 속성에 대한 모든 요청을 강제로 수행 할 수있었습니다.

변수와 같은 속성을 처리하는 경우 getter 및 setter가 필요하지 않습니다. 이 경우 속성을 공개로 설정하십시오.

경우에 따라 유효성 검사/위생 처리가 진행되므로 getter 및 setter를 사용하고 불필요하게 마술 메서드로 인한 오버 헤드가 발생하지 않도록 메서드로 직접 코딩해야합니다.

+0

$ instance -> name이 완료된 곳이 매우 많았을 것으로 추측합니다. 권리? 필자는 개인적으로 getName()/setName()을 대신 사용하여 $ name을 보호하도록 클래스를 변경하는 것이 더 좋을 것이라고 생각하기 때문입니다. 나는 당신이 당신의 __get과 __set 메소드를 호출하여 E_NOTICE 나 E_DEPRECATED를 호출 할 수 있다고 가정한다. 그런 식으로는 계속 작동하지만 setter/getters를 통해 어디에서 일하지 않았는지 알려준다. 그게 나 일 뿐이야. – GordonM

2

나는 복잡한 get 또는 set 논리가있는 경우 별도의 get 또는 set 메서드를 추가하는 규칙을 따르는 경향이 있습니다. 당신이 무언가를 간단하게한다면, 많은 수의 커스텀 get/set 메쏘드를 반복 할 때 __get이나 __set을 사용할 수 있습니다.

3

다음은이 문제를 처리하는 방법입니다.

final public function __set($key, $value) { 
    $method = 'set' . ucfirst($key); 
    if (method_exists($this, $method)) { 
     $this->data[$key] = $this->$method($value); 
    } else { 
     $this->data[$key] = $value; 
    } 
    } 


    final public function __get($key) { 
    $method = 'get' . ucfirst($key); 
    if (method_exists($this, $method)) { 
     return $this->$method($this->data[$key]); 
    } else { 
     return $this->data[$key]; 
    } 
    } 

속성에 대한 사용자 지정 처리기가 있으면 getProperty라는 가정하에 호출됩니다. 그렇지 않으면 기본 get/set 매직 메소드가 사용됩니다.