你应该有 setter/getter 方法。它们很痛苦,但您不一定要自己编写它们。只要您提供类成员,IDE(例如 Eclipse 或 Netbeans)就可以自动为您生成这些。但是,如果您根本不想处理这个问题并且您使用的是 PHP5,那么您可以使用它的神奇方法来解决这个问题:
protected $_data=array();
public function __call($method, $args) {
switch (substr($method, 0, 3)) {
case 'get' :
$key = strtolower(substr($method,3));
$data = $this->_data[$key];
return $data;
break;
case 'set' :
$key = strtolower(substr($method,3));
$this->_data[$key] = isset($args[0]) ? $args[0] : null;
return $this;
break;
default :
die("Fatal error: Call to undefined function " . $method);
}
}
每次您使用以 set 或 get 开头的不存在的方法时,都会运行此代码。所以你现在可以像这样设置/获取(并隐式声明)变量:
$object->setName('Bob');
$object->setHairColor('green');
echo $object->getName(); //Outputs Bob
echo $object->getHairColor(); //Outputs Green
无需声明成员或 setter/getter 函数。如果将来您需要向 set/get 方法添加功能,您只需声明它,本质上就是覆盖魔术方法。
此外,由于 setter 方法返回 $this,您可以像这样 chain 他们:
$object->setName('Bob')
->setHairColor('green')
->setAddress('someplace');
这使得代码既易于编写又易于阅读。
这种方法的唯一缺点是它使你的类结构更难辨别。由于您实际上是在运行时声明成员和方法,因此您必须在执行期间转储对象以查看它包含的内容,而不是读取类。
如果您的类需要声明一个明确定义的接口(因为它是一个库和/或您希望 phpdoc 生成 API 文档),我强烈建议您在上面的代码中声明面向公众的 set/get 方法。