2012-04-28 31 views
0

如果我理解正確,使用__set(),您可以即時創建類變量,這將是公開的,並且可以訪問私有/受保護的屬性。如何使用魔術__set()與驗證因屬性而異? (PHP)

好像使用:

__set($name,$value) { 
    $this->data[$name] = $value; 
} 

OR:

__set($name,$value) { 
    $this->$name = $value; 
} 

...都將導致進出各種垃圾。

對於每個受保護/私有屬性,使用單獨的setters(mutators),您有單獨的驗證控件,但是您必須編寫一組setter。

有什麼方法可以利用魔法__set()並且仍然根據屬性進行驗證。

E.g.讓我們假設

class stuff { 

    private $name; // alphabet, limit 10 chars 
    private $size; // integers 1 - 10; 
    private $price; // decimals 0.000 - 999.999 

    __set($property,$value) { 
    $this->$property = $value; 
    } 

} 

$thing = new stuff(); 
$thing->name = 1234; 
$thing->size = 'b'; 
$thing->price = -40; 

你會如何驗證不良分配?

+1

意見,而不是我可以備份的任何東西,但我儘量避免使用神奇的方法。另外,如果你需要一個屬性的自定義邏輯,你也可以創建一個setter。這爲邏輯提供了一個方便的位置。 – Corbin 2012-04-28 03:33:09

+0

我在想你可以讓setter變成私有的,並讓__set()訪問它們並從中獲取返回值。這樣你可以使用$ thing-> name = 1234;同時仍然具有獨立的setter功能。 – 2012-04-28 03:36:03

+0

是的,儘管如果我這樣做了,我會讓這些安裝者公開。 (然後我再次強烈反對__set和__get,他們提供的'魔術'也使得從外部知道類的結構非常困難,沒有很多明確的文檔。) – Corbin 2012-04-28 04:38:59

回答

0

您可以構建一個數組來映射每個屬性與驗證程序,然後在__set方法上爲該屬性和值執行指定的驗證程序。

1

這取決於你。如果你堅持使用魔術方法來設置對象的屬性,那麼你需要決定是否要讓類也負責數據驗證,或者是否應該是另一個對象(或對象集)的作業。

+0

是否有意義擁有另一個對象驗證進入此對象的內容?其他物體是否應該知道這個物體的屬性? – 2012-04-28 03:38:35

+0

這是值得商榷的。有一個專門處理驗證的對象不會是一件壞事恕我直言。當您製作其他選擇時,您會強迫自己進行某些選擇(例如,選擇使用__set()) – 2012-04-28 03:42:56