我正在尝试决定是否为我的应用程序/数据库中的每种内容类型创建许多类,或者只是坚持使用过程代码。
版本1:
为每个对象集合创建一个类:
class App{
protected $user_collection;
function getUserCollection(){
if(!isset($this->user_collection)
$this->user_collection = new UserCollection($this);
return $this->user_collection;
}
// ...
}
class UserCollection{
function __construct(App $app){
$this->app = $app;
}
function getUser($user){
return new User($this->app, $user);
}
function getUsers($options){
$users = $this->app->getDatabase()->query($options);
foreach($users as &$user)
$user = new User($this, $user);
return $users;
}
// ...
}
:
$app = new App();
echo $app->getUserCollection()->getUser('admin')->email_address;
<小时/> 版本2:
将所有方法保存在单个类中
class App{
function getUsers($options){
$users = $this->getDatabase()->query($options);
foreach($users as &$user)
$user = new User($this, $user);
return $users;
}
function getUser($user){
return new User($this, $user);
}
// ...
}
用过:
$app = new App();
echo $app->getUser('admin')->email_address;
<小时/> 版本3:
使getUsers()成为“User”类中的静态方法(该方法实例化一个新的User对象):
$app = new App();
echo User::getUser($app, 'admin')->email_address;
我应该走哪条路? “用户”对象只是一个例子,App也有其他对象,如“数据库”,“页面”等。
答案 0 :(得分:2)
我会使用您的版本1,但我会使用App的getUser()和getUsers()方法。 这消除了尴尬的getUserCollection()调用,因为相反在getUser()内部,你只需要调用$ this-&gt; user_collection。
答案 1 :(得分:1)
Personnaly,我经常使用第二种方法:
class user {
/**
* Load object from ...
*/
public function load($userId) {}
/**
* Insert or Update the current object
*/
public function save() {}
/**
* Delete the current object
*/
public function delete() {
// delete object
// Reset ID for a future save
$this->UserID = null;
}
/**
* Get a list of object
*/
public static function getList() {
// Make your search here (from DB)
// Put rows into new "SELF" object
$list = array();
foreach($rows as $row) {
$obj = new self();
$obj->populate($row);
$list[$obj->UserID] = $obj; // Associative array or not...
}
}
}
就像你可以看到的那样,我将我的“getList”函数设置为静态,只需像这样访问:
$listUsers = user::getList();
好的,这很简单,但在大多数情况下都可以使用简单的应用程序。