2012-02-03 7 views
15

Przykład:Jak uniknąć właściwości dynamicznych w PHP (podnieść błąd podczas ustawiania właściwość nierejestrowaną)

error_reporting(E_ALL | E_STRICT); 
class Test {} 
$obj = new Test(); 
$obj->undeclared = "oops"; // I want an error here !! :(
echo $obj->algo;    // oops 

Testowałem go na PHP 5.2.11 i 5.3.0.

Nie chcę właściwości dynamicznych w moich obiektach.
Czy można zmusić PHP do podniesienia BŁĘDU w takiej sytuacji?

+0

W jaki sposób '$ obj-> undeclared' powoduje problem? –

+0

klasa Test {public $ myVar; } $ obj-> my_var = TRUE;/* literówka */if ($ obj-> myVar) {/ * oh oh! * /} – Enrique

+0

Potrzebne jest dobre IDE, aby zapobiec takim literom. –

Odpowiedz

13

Użyj __set()?

<?php 
class Test { 

    public $bar; 

    public function __set($name, $value) { 
     throw new Exception('Cant set!'); 
    } 
} 

$obj = new Test; 
$obj->bar = 'foo'; 
$obj->foo = 'evil'; 
?> 
+3

Tak, to zadziała, ale muszę zmienić wszystkie moje zajęcia, aby dodać tę funkcję, to nie jest dobre. Powinno to zostać wykonane natywnie przez PHP. – Enrique

+0

Dobra sztuczka !!!!! Sprawdził, czy "dziedziczy normalnie", więc użyję tego w moich klasach bazowych !! :) –

0

Przez "Nie chcę właściwości dynamicznych w moich obiektach." Zakładam, że masz na myśli to, że nie chcesz, by twoje zmienne obiektowe nigdy nie były niezdefiniowane? W takim przypadku wystarczy utworzyć instancje wszystkich zmiennych klas. Możesz nawet zrobić je statyczne, jeśli naprawdę zależy ci na tym, aby były one stałe, a nie dynamiczne.

Jeśli spróbujesz uzyskać dostęp do zmiennej obiektowej, która nie istnieje, wówczas PHP wyświetli błąd w postaci. Odpowiedź, którą zaproponował radmen, sprawiłaby, że zamiast rzucać błąd, PHP dynamicznie tworzy niezdefiniowane zmienne obiektów dla ciebie w locie.

+0

Nie. Chcę mieć komunikat błędu/powiadomienia/ostrzeżenia, gdy próbuję ustawić właściwość, która nie jest zadeklarowana w mojej klasie (tzn. Nie chcę właściwości dynamicznych w moich obiektach, jeśli nie jest ona zadeklarowana w moim klasa wtedy nie powinna istnieć, nigdy). Jeśli tego chcę, użyję __set i __get. – Enrique

+0

Cóż, PHP robi dokładnie to, czego szukasz. Może być konieczne dodanie E_WARNING do raportu o błędach, aby był on wyświetlany. –

+1

nie, nie ma, a jeśli przeczytasz mój przykład, zobaczysz, że dodaję E_ALL, który zawiera E_WARNING (a ja też dodaję E_STRICT, ponieważ jest to jedyne nieujęte w E_ALL, przynajmniej przed 5.4) – Enrique

Powiązane problemy