2011-09-17 4 views
4

동적 속성을 허용하지 않는 PHP 클래스는 어떻게 만듭니 까? 구조에PHP의 값 객체

class User 
{ 
    public $username; 
    public $password; 
} 

$user = new User; 
$user->username = "bill.gates"; 

// This is a dynamic property and I need setting it to be considered illegal. 
$user->something = 123; 
+0

이 또한 것이다 개발자가 유효하고 동적이지 않은 속성에 값을 할당하는 것을 금지합니다. 맞습니까? – umlcat

답변

7

Magic methods :

class User 
{ 
    public $username; 
    public $password; 

    public function __set($key, $value) { 
    throw new Exception('illegal'); // or just trigger_error() 
    } 
} 
+0

... 속성을보다 효율적으로 관리를 제공 게터 및 세터 방법으로, 내부 변수 필드 표준 속성을 선호하는 일부 개발자들에게 유용 할 수 있지만,

class User { public $username; public $password; private $non_dynamic_props = array('username','password'); public function __set($key, $value) { if($this->check_legal_assignment($key)) $this->$$key = $value; else throw new Exception('illegal'); // or just trigger_error() } private function check_legal_assignment($prop){ return in_array($prop, $this->non_dynamic_props); } } 
leon

+4

@leon : 아니요, '__set'은 [액세스 할 수없는 속성에 쓰려고 할 때만] 호출됩니다 (http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading. 회원). 기존의 표시 속성은 트리거하지 않습니다. – Jon

+0

@leon : 아니요, "액세스 할 수없는 속성에 데이터를 쓸 때"__set()'이 실행됩니다. " 속성에 액세스 할 수없는 경우에도 쉽게 확인할 수있는 함수 호출을 던질 수 있습니다. –

0

당신은 constraining php dynamic properties를 확인할 수 있습니다. 아이디어는 존재하는 속성을 지정하고 배열에서 수정할 수 있으며 업데이트되는 속성 (Alix의 답변, 아래에 확장 된 예제와 같이)이 해당 권한 목록에 포함되는지 여부를 확인하는 것입니다.

(+1) 동적 특성이 개인적으로