php - 面向对象的 PHP 最佳实践

标签 php oop

假设我有一个代表一个人的类,该类中的一个变量将是 $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/

相关文章:

Javascript 警报框未显示

Java 多态行为

javascript - 如何使用适用于 jQuery 和 AJAX 的 SortableJS 更改类别的订单 ID?

php - php session 变量不起作用

php - 防止缓存 CSS 文件

php - 如何在 PHP 中检查比今天更早的记录?

php - 使用php将excel文件导入mysql如何动态获取/添加和插入列?

php - 从父类 PHP 自动构造子类

javascript - 在 "classes"之间共享方法和属性

perl - 通过 "->"调用方法与传递类/对象作为第一个参数之间到底有什么区别?