mySQL INSERT应该在构造函数中完成吗?

时间:2013-02-13 13:00:19

标签: php mysql oop

我开始使用OOP在PHP中构建一个新项目,我对对象 - 数据库关系感到困惑。

例如,我有一个User对象。如果构造函数已经执行了INSERT INTO... ?,那么我将调用$user = new User($user_data);

或者我应该使用不同的$user->save()方法来执行INSERT

5 个答案:

答案 0 :(得分: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。然后,可以将此对象传递给具有所有db方法并保存所需连接的对象,它可以使用哈希和名称getter构建查询,检查用户是否存在并执行INSERT查询如果需要的话。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  • 有时您可能需要创建一个空实例
  • php不支持重载:重载将允许您创建一个创建和清空实例的构造函数。
  • 您不希望为每个对象实例插入空记录。

所以我不建议在构造函数中添加插入查询。

答案 3 :(得分: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;
}

答案 4 :(得分: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);