2009-04-28 10 views
6

私はいくつかの入力バリデーションを持つクラスを構築していますが、それらを__setメソッドの中に配置することに決めました(これは私が限られたOOPの経験)。無効な値がクラスの外側から渡されたときに、適切なエラーがスローされ、正常に動作しているようです。しかし、クラス内で変数が変更された場合、_ _setメソッドはすべて無視されるようです。クラス内の__setメソッドを無視するPHP

任意の洞察力は非常

//RESULT::::::::::::::::::::::::::::::: 
// PASS: Testing : hello 
// PASS: Testing exception handling 
// __SET: Setting b to 123 
// PASS: Testing with valid value: 123 
// FAIL: Testing exception handling World2 



<?php 
class Test { 
     public $a; 
     private $b; 

     function __set($key, $val) { 

       switch($key) { 
         case 'b': 
           if(!is_numeric($val)) throw new Exception("Variable $b must be numeric"); 
           break; 
       } 

       echo ("__SET: Setting {$key} to {$val}<br/>"); 
       $this->$key = $val; 
     } 
     function __get($key) { return $this->$key; } 
     function bMethod() { 
       $this->b = "World2"; 
     } 

} 

$t = new Test(); 

//testing a 
try { 
     $t->a = "hello"; 
     echo "PASS: Testing $a: {$t->a}<br/>"; 
} catch(Exception $e) { 
     echo "FAIL: Testing $a"; 
} 

//testing b 
try { 
     $t->b = "world";  
     echo "FAIL: Testing $b exception handling<br/>"; 
} catch(Exception $e){ 
     echo "PASS: Testing $b exception handling<br/>"; 
} 

//testing b with valid value 
try { 
     $t->b = 123; 
     echo "PASS: Testing $b with valid value: {$t->b}<br/>"; 
} catch(Exception $e) { 
     echo "FAIL: Testing $b"; 
} 

//bypassing exception handling with method 
try { 
     $t->bMethod("world"); 
     echo "FAIL: Testing $b exception handling {$t->b}<br/>"; 
} catch(Exception $e) { 
     echo "PASS: Testing $b exception handling<br/>"; 
} 
+0

を... – Jonathan

答えて

10

をいただければ幸いです__setの定義を読む:「アクセスできないメンバーにデータを書き込む際__set()が実行されます」ここではアクセスできないが重要です。クラス内から、すべてのメンバーにアクセス可能で、__setがバイパスされます。 php documentationOverloading

+0

残念ながら、私は今日票のうち、んだけど、これは正しいです。私はこの問題に遭遇し、他の言語からゲッタ/セッタをエミュレートしようとしました。それは同じように動作しません。 – zombat

6

ドキュメントは言う:

__get()は、アクセス不能メンバーからデータを読み取るために利用されます。だから、

、あなたのような何かを行うことができます。これは、私は少なくとも1時間foxedた

<?php 
class Test { 
    private $_params = array(); 

    function __set($key, $val) { 
     ... 
     $this->_params[$key] = $val; 
    } 

    function __get($key) { 
     if (isset($this->_params[$key])) return $this->$key; 
     throw Exception("Variable not set"); 
    } 

    ... 
} 
+0

これは少しハックのように感じますが、実際には私がやりたいことを正確に行います。クラスメソッド内の変数呼び出しは変数を直接呼び出すことができないため、__set関数と__get関数を使用します。 ありがとう! – thatcanadian

関連する問題