0

我不喜欢拥有数百个幼稚的 Setter 和 Getter,但我希望能够为某些数据使用 Setter 和 Getter,因为我可能需要对它们进行清理等。

我有两个想法如何做到这一点:

class Test {
  private $value = "Value received from: ";
  private $value2 = "Value2 received from: ";

  function __get($property) {
    if (method_exists($this, "get".$property)) {
      return $this->getValue();
    }

    return $this->$property."__get()";
  }

  public function getValue() {
    return $this->value."getValue()";
  }
}

$obj = new Test();
echo $obj->value; // Returns: Value received from: getValue()
echo $obj->value2; // Returns: Value2 received from: __get()

class Test {
  private $value = "Value received from: ";
  private $value2 = "Value2 received from: ";

  public function __call($method, $args) {
    if (substr($method, 0, 3) == "get") {
      // Sanitizing so no functions should get through
      $property = preg_replace("/[^0-9a-zA-Z]/", "", strtolower(substr($method, 3)));

      if (isset($this->$property)) {
        return $this->$property."__call";
      }
    }
  }

  public function getValue() {
    return $this->value."getValue()";
  }
}

$obj = new Test();
echo $obj->getValue(); // Returns: Value received from: getValue()
echo $obj->getValue2(); // Returns: Value2 received from: __call

基本上唯一的区别是魔术方法__call__get. 我漏掉了,__set因为很明显我会怎么做。

真正的问题是哪个更好?表现?可读性?安全?

4

1 回答 1

2

根据PHP Manual: Overloading,魔术方法__get()用于重载属性,而__call()用于方法。由于您正在使用方法,因此您应该使用适合其设计用途的方法。所以对于可读性__call()得到我的投票。

Security而言,我认为任何重载都几乎同样安全,也就是说根本不是很多,因为它是关于创建尚未明确声明的属性和方法。

我还没有测试过它的性能方面。我认为该方法__call()会更好,因为它是为与方法一起使用而设计的,但是您可能需要进行microtime(true)一些测试以查看它是否重要。

我真的不使用__call(),因为我不需要在我的应用程序中重载方法,或者应该说我总是在我的对象类中声明方法。

于 2013-09-19T17:53:05.410 回答