我開始使用OOP在PHP
中構建一個新項目,並且我有關於對象 - 數據庫關係的困境。應該在構造函數中完成mySQL INSERT嗎?
例如,我有一個用戶對象。如果構造函數已經做INSERT INTO... ?
所以我會打電話$user = new User($user_data);
或者我應該有不同的$user->save()
方法來做INSERT
?
我開始使用OOP在PHP
中構建一個新項目,並且我有關於對象 - 數據庫關係的困境。應該在構造函數中完成mySQL INSERT嗎?
例如,我有一個用戶對象。如果構造函數已經做INSERT INTO... ?
所以我會打電話$user = new User($user_data);
或者我應該有不同的$user->save()
方法來做INSERT
?
使用單獨的'方法'來創建/保存用戶會更好。 每次你實例化一個用戶時,構造函數都會被執行,即使用「user = new User()」。 如果插入到構造函數中,每當創建User對象時都會嘗試創建一個新用戶,而這對於您打算的目的可能不需要。
所以我不建議在您的構造函數中添加插入查詢。
我會建議有以下原因
$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);
有一個構造函數執行插入查詢聽起來不像一個好主意,恕我直言。我覺得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構建查詢,檢查用戶是否存在,並在需要時執行查詢。
這取決於User類應該做什麼。僅僅是爲了插入新用戶?那麼現有的用戶呢,你會創建另一個類來檢索它的數據嗎? – koopajah 2013-02-13 13:01:52
如果要加載現有用戶並修改某些字段,會發生什麼情況? – Jon 2013-02-13 13:02:16
你應該使用不同的方法來保存用戶。因爲構造函數只應該按照OOP進行初始化... – Pratik 2013-02-13 13:04:24