为什么我应该使用PHP魔术设置器进行构造函数参数验证

时间:2012-10-25 08:26:47

标签: php oop

有类似的问题,例如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 )函数?在这个函数中必须有一组条件来确定所需的验证类型,为什么在这种情况下想要这样做呢?

这些魔术方法的示例用例是什么?当然,只有少数班级成员或没有验证时,他们才会是一个不错的选择?

非常感谢。

3 个答案:

答案 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,因此几乎没有任何工作可以支持不需要任何特定检查的成员。