为什么要防止向对象添加不存在的属性?

在面向对象的上下文中,通常可以向实例化对象添加新属性,从而将它们用作一种数据“容器”;这样做当然是一种不好的做法,应该避免。

我们可能会争辩说,大多数开发人员都知道不要这样做,这可能是真的;但是当我们可以轻松防止它发生时,为什么还要允许它呢?

理想情况下,我们可能还想将所有对象属性声明为 private ,并且只允许使用预定义的 setter 和 getter 函数修改它们。
在大多数情况下,为此目的使用魔法方法可能是不好的。
但是,我们仍然可以使用 __set 魔法方法来防止添加新的、不存在的属性。
这可以通过在有人尝试将变量添加到我们对象的实例时抛出异常来完成:

public function __set($name, $value) {
  throw new \Exception("Adding new properties is not allowed on " . __CLASS__);
}

当然,开发人员可能也意识到我们可以这样做,因此决定将我们的对象用作他们自己目的的“容器”是不值得的。

PHP:防止向对象添加属性

我们可以使用魔术 __set 方法来防止向 PHP 对象添加新属性;此方法仅在有人尝试将不存在的属性添加到实例化对象时调用,因此不会带来性能损失。

要使用 __set 魔术方法,只需将其包含在现有类中,如下所示:

public function __set($name, $value) {
  throw new \Exception("Adding new properties is not allowed on " . __CLASS__);
}

如果我们有很多类,我们还可以创建一个特性,该特性可以轻松包含在我们想要防止添加新属性的类中:

trait no_set {
    public function __set($name, $value) {
      throw new \Exception("Adding new properties is not allowed on " . __CLASS__);
    }
}

为了将它包含在一个类中,我们使用了一个 use 语句:

class some_class_name {
  public some_method_name() {
    //Whatever ....
  }
  use lib\class_traits\no_set;
}
日期:2020-06-02 22:17:32 来源:oir作者:oir