对象集合类与否

时间:2012-03-26 13:16:26

标签: php object

我正在尝试决定是否为我的应用程序/数据库中的每种内容类型创建许多类,或者只是坚持使用过程代码。

版本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也有其他对象,如“数据库”,“页面”等。

2 个答案:

答案 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();

好的,这很简单,但在大多数情况下都可以使用简单的应用程序。