如果我理解正确,使用__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