2011-09-06 1 views
10

メンバーフィールドのコンテナである不変クラスを作成する必要があります。私はそのフィールドをコンストラクタで一度インスタンス化したい(値はコンストラクタのパラメータとして与えられるべきです)。私はフィールドを公開しても変わらないものにしたい。各フィールドの前にキーワードfinalを使用してJavaで実行できました。それはPHPでどのように行われますか?PHP:不変パブリックメンバーフィールド

+3

これはPHPでは不可能です。 – Sjoerd

+0

フィールドを公開する必要があるのはなぜですか? – Pete171

+0

@ pete171おそらく読み込み専用です – fbstj

答えて

16

のdinamyc数を持っている場合は、__set__getマジックメソッドを使用する必要がありますし、保護またはプライベートとしてそのプロパティを宣言:

class Example 
{ 
    private $value; 

    public function __construct() 
    { 
     $this->value = "test"; 
    } 

    public function __get($key) 
    { 
     if (property_exists($this, $key)) { 
      return $this->{$key}; 
     } else { 
      return null; // or throw an exception 
     } 
    } 

    public function __set($key, $value) 
    { 
     return; // or throw an exception 
    } 
} 

使用法:

$example = new Example(); 
var_dump($example->value); 
$example->value = "invalid"; 
var_dump($example->value); 

出力:

string(4) "test" 
string(4) "test" 
2

マジックメソッド__set()を使用して、誰かがプロパティを直接設定しようとしたときに例外をスローすることができます。

class ClassName { 
    public function __set($key, $value) { 
     throw new Exception('Can't modify property directly.'); 
    } 
} 

ただし、公開されているかどうかにかかわらず、プロパティの変更が防止されます。

+0

プロパティはプライベート/とにかく保護されていて、何も役に立たないものはありません。一方、 '__get()'は、私たちが望むものです。 – Mchl

+3

__set()は、アクセスできないプロパティにデータを書き込むときに実行されます。パブリックプロパティでは動作しません – jbrond

2

magic methods

ので、あなたがより良い行うことができます - あなたはフィールド

class ClassName { 
     private $fields = array(); 
     // use class : $cl = new ClassName(array('f'=>2,'field_4'=>5,''12)); 
     // echo $cl->field_4; echo $cl->f; 
     public function __construct($data= array()) 
     { 
      if (!is_array($data) || !count($data)) throw new Exception('Not enough args') 
      foreach ($data as $key=>$val) 
      { 
       if (is_numeric($key)) 
       $this->fields['field_'.$key] = $val; 
       else 
       $this->fields[$key] = $val; 
      }  
     } 
      /* in this case you can use this class like $cl = new ClassName(12,14,13,15,12); echo $cl->field_1; 
     public function __construct() 
    { 
      $ata = funcs_get_args(); 

      if (!count($data)) throw new Exception('Not enough args') 
      foreach ($data as $key=>$val) 
      { 
       if (is_numeric($key)) 
       $this->fields['field_'.$key] = $val; 
       else 
       $this->fields[$key] = $val; 
      }  
    } 
    */ 
     public function __get($var) { 
      if (isset($this->fields[$var])) 
       return $this->fields[$var]; 
      return false; 
      //or throw new Exception ('Undeclared property'); 
     } 
    } 
+4

'__set'はパブリックプロパティで呼び出されません – sanmai

関連する問題