1

我开始PHP使用 OOP 构建一个新项目,但我对对象-数据库关系感到两难。

例如,我有一个用户对象。如果构造函数已经这样做了INSERT INTO... ?,我会调用$user = new User($user_data);

还是我应该有不同的$user->save()方法来做INSERT

4

5 回答 5

1

恕我直言,让构造函数执行插入查询听起来不是一个好主意。类User,我觉得应该看成一个模型,一个收集数据的对象,可以发送到服务层。这就是实际insert可以执行的地方。

只需将User类视为一种类型。假设现有用户登录:

$login = new User(array('username' => $_POST['username'],
                        'pass' => $_POST['passwd']));

然后,在User课堂上:

class User
{
    const SALT = 'fo0bar';
    private $_hash = null;
    private $_name = null;

    public function __construct (array $request, $login = false)
    {
        //this isn't the best hash in the world, of course...
        $this->_hash = sha1($request['username'].SALT.$request['pass']);
        $this->_name = $request['username'];
    }
    public function getHash()
    {
        return $this->_hash;
    }
    public function getName()
    {
        return $this->_name;
    }
}

就构造函数而言,仅此而已。如果需要,只需添加更多数据,以及一些 getter 和 setter。然后可以将此对象传递给具有所有数据库方法并保存所需连接的对象,它可以使用哈希和名称获取器构建查询,检查用户是否存在并在INSERT需要时执行查询。

于 2013-02-13T13:22:13.703 回答
0

最好使用单独的“方法”来创建/保存用户。每次实例化用户时都会执行构造函数,即使用“user = new User()”。如果插入到您的构造函数中,则每当创建 User 对象时都将尝试创建一个新用户,这很可能不是您想要的目的。

于 2013-02-13T13:03:52.217 回答
0
  • 有时您可能需要创建一个空实例
  • php 不支持重载:重载将允许您创建一个构造函数来创建和清空实例。
  • 您不想为每个对象实例插入一条空记录。

所以我不建议向您的构造函数添加插入查询。

于 2013-02-13T13:09:01.247 回答
0

出于以下原因,我建议在您的课程中使用单独的 save() 函数

  • 您有机会在保存对象数据之前对其进行操作/修改
  • 检索数据时,您无疑会调用$user->getAll(). 因此,在初始化您的用户对象时,在这种情况下 - 我们不想存储任何数据。

尝试做这样的事情

protected $_data;

public function __construct(array $data) {
    $this->_data = $data;
}

public function save() {
    //TODO: Save $data 

    return $this;
}

public function getAll() {
    //TODO: Get from database and populate $this->_data

    return $this->_data;
}
于 2013-02-13T13:11:49.683 回答
0

这样做的一种常见方法是分离模型和映射器。这意味着 User 是一个空的数据存储(模型)-并且您有一个与对象交互的映射器。典型的 CRUD 操作:

<?php
$model = new User();
$model->setName('Name');

$mapper->create($model);

$user = $mapper->find('Name');

$user->setName('NewName');
$mapper->update($user);

$model->delete($user);
于 2013-02-13T13:12:00.137 回答