2009-04-28 6 views
6

Je construis une classe avec un certain nombre de validations d'entrée, et j'ai décidé de les placer dans une méthode __set (je ne suis pas sûr que ce soit la bonne forme car j'ai limité Expérience OOP). Cela semble fonctionner correctement, en jetant les erreurs appropriées lorsque les valeurs non valides sont transmises de l'extérieur de la classe. Cependant, si une variable est modifiée dans la classe, la méthode _ _set semble être complètement ignorée.PHP ignorant la méthode __set à l'intérieur de la classe

Toute idée serait extrêmement apprécié

//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

Cela me avait foxed pendant au moins une heure ... – Jonathan

Répondre

10

Lire la définition de __set: « __set() est exécuté lors de l'écriture des données aux membres inaccessibles. » Inaccessible est la clé ici. De l'intérieur de la classe, tous les membres sont accessibles et __set est contourné. Overloading

+0

Malheureusement, je suis de votes aujourd'hui, mais cela est exact. J'ai rencontré ce problème en essayant d'émuler des getters/setters d'autres langues. Ça ne marche tout simplement pas pareil. – zombat

6

La documentation à l'php documentation dit:

__get() est utilisé pour la lecture des données des membres inaccessibles.

Ainsi, vous pouvez faire quelque chose comme:

<?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

Cela ressemble à un peu un hack, mais il fait exactement ce que je voulais faire; Les appels de variable à l'intérieur des méthodes de classe ne peuvent pas appeler directement les variables, ils utilisent donc la fonction __set et __get. Merci! – thatcanadian

Questions connexes