我开始PHP
使用 OOP 构建一个新项目,但我对对象-数据库关系感到两难。
例如,我有一个用户对象。如果构造函数已经这样做了INSERT INTO... ?
,我会调用$user = new User($user_data);
还是我应该有不同的$user->save()
方法来做INSERT
?
恕我直言,让构造函数执行插入查询听起来不是一个好主意。类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
需要时执行查询。
最好使用单独的“方法”来创建/保存用户。每次实例化用户时都会执行构造函数,即使用“user = new User()”。如果插入到您的构造函数中,则每当创建 User 对象时都将尝试创建一个新用户,这很可能不是您想要的目的。
所以我不建议向您的构造函数添加插入查询。
出于以下原因,我建议在您的课程中使用单独的 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;
}
这样做的一种常见方法是分离模型和映射器。这意味着 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);