如果我理解正確,使用__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;
你會如何驗證不良分配?
意見,而不是我可以備份的任何東西,但我儘量避免使用神奇的方法。另外,如果你需要一個屬性的自定義邏輯,你也可以創建一個setter。這爲邏輯提供了一個方便的位置。 – Corbin 2012-04-28 03:33:09
我在想你可以讓setter變成私有的,並讓__set()訪問它們並從中獲取返回值。這樣你可以使用$ thing-> name = 1234;同時仍然具有獨立的setter功能。 – 2012-04-28 03:36:03
是的,儘管如果我這樣做了,我會讓這些安裝者公開。 (然後我再次強烈反對__set和__get,他們提供的'魔術'也使得從外部知道類的結構非常困難,沒有很多明確的文檔。) – Corbin 2012-04-28 04:38:59