如何使用魔术__set()进行验证因属性而异?(菲律宾比索)


How to use magic __set() with validation varying by property? (PHP)

如果我理解正确,使用 __set(),您可以动态创建类变量,这些变量将是公共的,以及访问私有/受保护的属性。

似乎使用:

__set($name,$value) {
  $this->data[$name] = $value;
}

或:

__set($name,$value) {
  $this->$name = $value;
}

。都会导致各种垃圾进出。

对于单独的 setter(突变器),每个受保护/私有属性为 1,您有单独的验证控制,但您必须编写一堆 setter。

有没有办法利用魔术__set()并根据属性进行验证。

例如,假设

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;

您将如何验证错误的作业?

这取决于

你。如果您坚持使用魔术方法来设置对象的属性,那么您需要决定是否希望该类也负责数据验证,或者这是否应该是另一个对象(或一组对象)的作业。

您可以构建一个数组来将每个属性与验证器映射,然后在 __set 方法上,为该属性和值执行分配的验证器。