2011-10-14 18 views
1

這裏的環境中稱之爲:

$values = $form->getValues(); 
foreach($values as $key=>$value) {   
$obj->{$key} = $value; 
} 

如果$key是一個有效的密鑰,__set($name, $value)未被調用。如果$key不是有效的密鑰,則是。這裏是我的設置是什麼樣子:

public function __set($name, $value) { 
    $method = 'set' . ucfirst($name); 
    if(method_exists($method)) { 
     $this->$method($value); 
    } else { 
     throw new RuntimeException('Attempt to access a non-existant property with method ' . $method); 
    } 
} 

在到該__set($name, $value)方法屬於的對象,所有的屬性是私有的,並強調。因此,對於鍵「名」會有以下幾點:

private $_name; 

public function setName($name) { 
    $this->_name = $name; 
    return $this; 
} 

我知道,那不叫,因爲我想只是$method = 'set' . ucfirst($name);之後插入一個例外。當$name沒有引用有效的setter時,該異常被觸發,但是當它沒有引用時沒有被觸發。它應該每次都被擊中。任何人都知道這裏發生了什麼?

+0

+1使用Fluent接口並在適當的位置引發語義正確的PHP異常。 – Phil

回答

7

這是設計。從manual

在將數據寫入不可訪問的屬性時運行__set()。

如果你有public性能匹配$key,他們將因爲他們是訪問設置。

此外,您使用method_exists()是不正確的。它應該是

if (method_exists($this, $method)) 
+1

+1教我今天的事情。 –

+0

你誤會了。這些屬性都是私有的,都是$ _ {key}。設置者是'設置'的。 ucfirst($鍵)。沒有什麼與$ key完全匹配。但是感謝你用method_exists來捕捉我的錯誤。它不能解決問題。 –

+0

@DanielBingham然後,你將不得不澄清你的意思是「有效的關鍵」。 – Phil