2012-04-28 68 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