假设我有一个代表一个人的类,该类中的一个变量将是 $name。
以前,在我的脚本中,我会创建一个对象的实例,然后使用以下方法设置名称:
$object->name = "x";
但是,有人告诉我这不是最佳做法?我应该有一个函数 set_name() 或类似这样的函数:
function set_name($name)
{
$this->name=$name;
}
这是正确的吗?
如果在这个例子中我想在数据库中插入一个新的“人”记录,我如何将关于这个人的所有信息即 $name、$age、$address、$phone 等传递给类以便插入它,我应该怎么做:
function set($data)
{
$this->name= $data['name'];
$this->age = $data['age'];
etc
etc
}
然后向它发送一个数组?这是最佳做法吗?或者有人可以推荐最佳做法吗?
最佳答案
你应该有 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');
这使得代码易于编写和阅读。
这种方法的唯一缺点是它使您的类结构更难辨别。由于您实质上是在运行时声明成员和方法,因此您必须在执行期间转储对象以查看它包含的内容,而不是读取类。 如果您的类需要声明一个明确定义的接口(interface)(因为它是一个库和/或您希望 phpdoc 生成 API 文档),我强烈建议您在上面的代码中声明面向公众的 set/get 方法。
关于php - 面向对象的 PHP 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2407807/