我开始使用OOP在PHP
中构建一个新项目,我对对象 - 数据库关系感到困惑。
例如,我有一个User对象。如果构造函数已经执行了INSERT INTO... ?
,那么我将调用$user = new User($user_data);
或者我应该使用不同的$user->save()
方法来执行INSERT
?
答案 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)
所以我不建议在构造函数中添加插入查询。
答案 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);