2011-09-17 10 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

(1)ダイナミックプロパティは、一部の開発者にとって有用であるかもしれない、しかし、個人的に私は性質をより細かく制御を提供ゲッター&セッターメソッドと、内部変数フィールドを持つ標準のプロパティを好む... – umlcat

答えて

7

Magic methods

class User 
{ 
    public $username; 
    public $password; 

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

これもなります有効でダイナミックでないプロパティに値を割り当てることを開発者に禁じます。 – 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の答えのように、以下に展開される例)がその権限リストの一部であるかどうかを検証することです。

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); 
    } 
}