这些是简单的示例,但是假设您的类中的属性多于两个。
什么是最佳做法?
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的魔术函数(get, call等)非常流行。乍一看,它们没有什么错,但实际上它们确实很危险。它们使API不清楚,无法自动完成,最重要的是它们很慢。他们的用例是黑客PHP来做自己不想做的事情。而且有效。但不幸的事情发生了。
但我想听听有关此的更多意见。
过去我一直是您的情况。我去寻找魔术方法。
这是一个错误,问题的最后一部分说明了一切:
@property
getXXX()
$user->getName()
$user->getToken($key)
最后,这是IMO的最大问题: 这是魔术 。魔术非常非常糟糕,因为您必须知道魔术如何工作才能正确使用它。这是我在团队中遇到的一个问题:每个人都必须了解魔术,而不仅仅是您。
getter和setter很难写(我讨厌他们),但是他们值得。