2013-06-21 76 views
16

這個錯誤會引發錯誤:力PHP扔在未定義的屬性

class foo 
{ 
    var $bar; 

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

} 

但這不會:

class foo 
{ 
    var $bar; 

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

} 

如何強制PHP在這兩種情況下拋出錯誤?我認爲第二種情況比第一種情況更重要(因爲我花了2個小時在物業中搜索了一個錯誤的錯字)。使用__set也許property_exists

+1

如果'Bar'通過'isset' –

+0

定義你可以檢查,如果它是不是有什麼設置錯誤級別?我仍然不知道班級中沒有定義「Bar」。 –

+0

那麼,選擇駝峯或小寫(或其他約定),然後堅持下去。你可以使用像[PHP CodeSniffer('phpcs')](http://pear.php.net/package/PHP_CodeSniffer/redirected)來執行它。另外,錯誤的變量名會給你一個完全可以理解的錯誤信息,你可以用它來快速找出發生錯誤的位置。使用魔術方法'__get'和'__set'可以解決問題,但費用是多少?它會減慢代碼的速度,並且可能會導致另一組問題。 –

回答

14

你可以用魔術方法

__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'); 

它將投下錯誤

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

您可以根據PHP error levels

+0

工作,但實際上並沒有找到什麼:兩個答案都需要向類中添加代碼以編程方式檢查語法的錯誤。您需要將其添加到所有類(或從某處繼承),而不是優雅的方式。不要少:upvote,我會考慮這個 –

+0

沒有別的辦法; /你總是可以從抽象類或使用特徵繼承它,我沒有看到任何不優雅的東西。 – Robert

+0

明白了。我仍然不認爲這是「優雅」,但它是值得一試(並與PHP相關,而不是你的答案!) –

10

一個解決方案,我可以想像會(AB):

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'); 
} 

演示:http://codepad.org/T5X6QKCI

+0

+1會以同樣的方式做到這一點 – leuchtdiode

+1

你有點快:)因爲我寫了更復雜的例子,但沒有例外的錯誤 – Robert