2009-04-28 12 views
6

Buduję klasę z wieloma walidacjami wejściowymi, i zdecydowałem się umieścić je w metodzie __set (nie jestem pewien, czy to jest odpowiednia forma, ponieważ mam ograniczone Doświadczenie OOP). Wydaje się, że działa dobrze, rzucając prawidłowe błędy, gdy nieprawidłowe wartości są przekazywane spoza klasy. Jeśli jednak zmienna zostanie zmodyfikowana w klasie, metoda __set wydaje się być całkowicie ignorowana.Ignorowanie PHP metoda __set w klasie

Każdy wgląd byłby znacząco doceniane

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

ten miał mnie foxed przez co najmniej godzinę ... – Jonathan

Odpowiedz

10

Czytaj definicję __set: „__set() jest prowadzony przy wpisywaniu danych do niedostępnych członków” Niedostępność jest tutaj kluczowa. Z poziomu klasy wszyscy członkowie są dostępni, a __set jest ominięty. Overloading

+0

Niestety jestem z głosów dziś, ale to prawda. Wpadłem na ten problem, próbując emulować programy pobierające/ustawiające z innych języków. To po prostu nie działa tak samo. – zombat

6

Dokumentacja na php documentation mówi:

__get() została wykorzystana do odczytu danych z niedostępnych członków.

Tak, można zrobić coś takiego:

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

To wydaje się być trochę hackerem, ale robi dokładnie to, co chciałem; wywołania zmiennych wewnątrz metod klas nie mogą wywoływać zmiennych bezpośrednio, więc używają funkcji __set i __get. Dzięki! – thatcanadian

Powiązane problemy