0

有类似的问题,例如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"; 
   }
}

这是设置器之一(伪代码):

public function set_foo( $foo ) {
   if( $foo fails validation checks ) {
      throw new InvalidArgumentException( '$foo is not valid' );
   }
}

在我的班级中,有两个以上的类变量,每个变量都有自己的一组验证检查。我的问题也是如此(嗯,真的是 2 个):

为什么我要更改我的代码以使用 PHP 魔术 getter/setter(此处)并具有杂乱的__set( $name, $value )功能?此函数中必须有一组条件来确定所需的验证类型,那么为什么要在这种情况下这样做呢?

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

非常感谢。

4

3 回答 3

2

你不应该。国际海事组织。

魔术设置器旨在从对象外部访问(设置)私有、受保护甚至是虚拟(不存在)属性

如果您的每个属性都有不同的验证规则,我不明白为什么您应该膨胀一个方法来检查它们。最好将验证逻辑保存在不同的 setter 方法中,就像现在一样。

编辑

如果您有一些常见的验证规则,您应该将它们放入非公共方法中,以便从您的设置器中重用它们。

于 2012-10-25T08:35:22.003 回答
1

可以将其简单地用作便利包装器:

public function __set($name, $value) {
    $method = "set_$name";
    $this->$method($value);
}

这使您可以编写$obj->foo = 'bar'而不是$obj->set_foo('bar').

这值得么?也许不吧。特别是因为您仍然必须在课堂$this->set_foo() 内使用。没有人说你必须使用魔法二传手。

于 2012-10-25T08:32:48.567 回答
1

在这种情况下,我通常会避免使用神奇的 getter 和 setter,并为每个需要访问的成员设置一个特定的 getter 和 setter。如果您使用适当的 IDE 或编辑器,您可以自动生成 getter 和 setter,因此几乎不需要任何工作来支持不需要任何特定检查的成员。

于 2012-10-25T08:38:15.720 回答