最佳实践:PHP魔术方法__set和__get

这些是简单的示例,但是假设您的类中的属性多于两个。

什么是最佳做法?

a)使用__get和__set

class MyClass {

private $firstField;

private $secondField;

public function __get($property) {

if (property_exists($this, $property)) {

return $this->$property;

}

}

public function __set($property, $value) {

if (property_exists($this, $property)) {

$this->$property = $value;

}

}

}

$myClass = new MyClass();

$myClass->firstField = "This is a foo line";

$myClass->secondField = "This is a bar line";

echo $myClass->firstField;

echo $myClass->secondField;

/* Output:

This is a foo line

This is a bar line

*/

b)使用传统的setter和getter

class MyClass {

private $firstField;

private $secondField;

public function getFirstField() {

return $this->firstField;

}

public function setFirstField($firstField) {

$this->firstField = $firstField;

}

public function getSecondField() {

return $this->secondField;

}

public function setSecondField($secondField) {

$this->secondField = $secondField;

}

}

$myClass = new MyClass();

$myClass->setFirstField("This is a foo line");

$myClass->setSecondField("This is a bar line");

echo $myClass->getFirstField();

echo $myClass->getSecondField();

/* Output:

This is a foo line

This is a bar line

*/

本文内容:http://blog.webspecies.co.uk/2011-05-23/the-new-era-of-php-

frameworks.html

作者声称使用魔术方法不是一个好主意:

首先,那时使用PHP的魔术函数(

call等)非常流行。乍一看,它们没有什么错,但实际上它们确实很危险。它们使API不清楚,无法自动完成,最重要的是它们很慢。他们的用例是黑客PHP来做自己不想做的事情。而且有效。但不幸的事情发生了。

但我想听听有关此的更多意见。

回答:

过去我一直是您的情况。我去寻找魔术方法。

这是一个错误,问题的最后一部分说明了一切:

  • 这 (getters / setters)
  • 有 (这是一个重大的问题,实际上),以及 由IDE的重构和代码浏览(在Zend Studio的/ PhpStorm这可能与处理@propertyPHPDoc的注解,但是需要保持他们:相当痛苦)
  • 该 (phpdoc)与应该如何使用您的代码不匹配,并且查看您的类也不会带来太多答案。这很混乱。
  • 编辑后添加:具有属性的吸气剂 在该 ,getXXX()不仅返回私有属性,而且执行真实逻辑。您使用相同的命名。例如,您具有$user->getName()(返回私有属性)和$user->getToken($key)(计算出的)。当您的获取者获得的不仅仅是获取者并且需要做一些逻辑时,一切仍然是一致的。

最后,这是IMO的最大问题:

。魔术非常非常糟糕,因为您必须知道魔术如何工作才能正确使用它。这是我在团队中遇到的一个问题:每个人都必须了解魔术,而不仅仅是您。

getter和setter很难写(我讨厌他们),但是他们值得。

以上是 最佳实践:PHP魔术方法__set和__get 的全部内容, 来源链接: utcz.com/qa/400668.html

回到顶部