2013-06-21 13 views
16

To wygeneruje błąd:siła PHP wyrzucić błąd na niezdefiniowanej właściwości

class foo 
{ 
    var $bar; 

    public function getBar() 
    { 
     return $this->Bar; // beware of capital 'B': "Fatal: unknown property". 
    } 

} 

Ale to nie będzie:

class foo 
{ 
    var $bar; 

    public function setBar($val) 
    { 
     $this->Bar = $val; // beware of capital 'B': silently defines a new prop "Bar" 
    } 

} 

Jak mogę zmusić PHP rzucał błędy w obu przypadkach? Uważam, że drugi przypadek jest bardziej krytyczny niż pierwszy (ponieważ zajęło mi to 2 godziny, aby znaleźć literówkę w nieruchomości).

+1

Można sprawdzić, czy 'Bar' jest zdefiniowany poprzez' isset' –

+0

A co, jeśli nie? Nadal nie wiem, że 'Bar' nie jest zdefiniowany w klasie. –

+0

Cóż, wybierz CamelCase lub małe litery (lub inne konwencje), a następnie trzymać się go. Możesz użyć czegoś takiego jak [PHP CodeSniffer ('phpcs')] (http://pear.php.net/package/PHP_CodeSniffer/redirected), aby go wymusić. Błędne nazwy zmiennych dają także doskonale zrozumiały komunikat o błędzie, którego możesz użyć do szybkiego sprawdzenia, gdzie wystąpił błąd. Używanie magicznych metod '__get' i' __set' może rozwiązać problem, ale jakim kosztem? Spowoduje to zwolnienie kodu i może spowodować inny zestaw problemów. –

Odpowiedz

14

można wykorzystywać magiczne metody

__set() is run when writing data to inaccessible properties.

__get() is utilized for reading data from inaccessible properties.

class foo 
{ 
    var $bar; 

    public function setBar($val) 
    { 
     $this->Bar = $val; // beware of capital 'B': silently defines a new prop "Bar" 
    } 

    public function __set($var, $val) 
    { 
    trigger_error("Property $var doesn't exists and cannot be set.", E_USER_ERROR); 
    } 

    public function __get($var) 
    { 
    trigger_error("Property $var doesn't exists and cannot be get.", E_USER_ERROR); 
    } 

} 

$obj = new foo(); 
$obj->setBar('a'); 

It rzuci błąd

Fatal error: Property Bar doesn't exists and cannot be set. on line 13

Można ustawić poziomy błędów według PHP error levels

+0

Działa, ale nie to, czego szukam, w rzeczywistości: Obie odpowiedzi muszą dodać kod do klasy w celu programowego sprawdzenia składni pod kątem błędów. Trzeba to dodać do wszystkich klas (lub dziedziczyć gdzieś), a nie elegancko. Niemniej jednak: przegłosuj, Rozważę to: –

+0

Nie ma innej drogi;/zawsze możesz dziedziczyć to z klasy abstrakcyjnej lub używać cech Nie widzę niczego, co nie jest w niej eleganckie. – Robert

+0

Mam to. Nadal nie uważam tego za "elegancki", ale warto spróbować (i dotyczy PHP, a nie odpowiedzi!) –

10

Jednym z rozwiązań może sobie wyobrazić byłoby (ab) używając __set a może property_exists:

public function __set($var, $value) { 
    if (!property_exists($this, $var)) { 
     throw new Exception('Undefined property "'.$var.'" should be set to "'.$value.'"'); 
    } 
    throw new Exception('Trying to set protected/private property "'.$var.'" to "'.$value.'" from invalid context'); 
} 

Demo: http://codepad.org/T5X6QKCI

+0

+1 zrobiłoby to w ten sam sposób. – leuchtdiode

+1

Byłaś trochę szybsza :) bo tak napisałem bardziej skomplikowany przykład z błędami nie wyjątkami – Robert

Powiązane problemy