有类似的问题,例如this,但这是不同的 - 它是关于使用setter验证构造函数参数。
这是我的构造函数:
public function __construct( $foo, $bar ) {
try {
$this->set_foo( $foo );
$this->set_bar( $bar );
} catch( Exception $e ) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
}
这里是其中一个setter(伪代码):
public function set_foo( $foo ) {
if( $foo fails validation checks ) {
throw new InvalidArgumentException( '$foo is not valid' );
}
}
在我的班级中,有两个以上的类变量,每个都有自己的一组验证检查。我的问题也是如此(嗯,2真的):
为什么我要更改我的代码以使用PHP魔术getter / setter(here)并且具有混乱的__set( $name, $value )
函数?在这个函数中必须有一组条件来确定所需的验证类型,为什么在这种情况下想要这样做呢?
这些魔术方法的示例用例是什么?当然,只有少数班级成员或没有验证时,他们才会是一个不错的选择?
非常感谢。
答案 0 :(得分:2)
你不应该。 IMO。
魔术限制器旨在从对象外部访问(设置)私有,受保护甚至虚拟(不存在)属性。
如果您的每个属性都有不同的验证规则,我就无法理解为什么要对单个方法进行充气以便对其进行全部检查。最好将验证逻辑保存在不同的setter方法中,就像现在一样。
修改强>
如果您有一些常见的验证规则,则应将规则放入非公开方法中,以便从您的setter中重复使用它们。
答案 1 :(得分:1)
你可以简单地将其用作便利包装器:
public function __set($name, $value) {
$method = "set_$name";
$this->$method($value);
}
这允许您编写$obj->foo = 'bar'
而不是$obj->set_foo('bar')
。
值得吗?也许不吧。特别是因为您仍然需要在类中使用$this->set_foo()
。没有人说你有使用魔术制定者。
答案 2 :(得分:1)
在这种情况下,我通常会避开魔法的getter和setter,并为每个需要访问的成员设置特定的getter和setter。如果您使用正确的IDE或编辑器,则可以自动生成getter和setter,因此几乎没有任何工作可以支持不需要任何特定检查的成员。