使所有用户使用OOP的正确方法

时间:2009-10-11 16:58:44

标签: php oop class

我有一个用户类,我可以获得用户的姓名,出生日期等...(下)

class user {
    private $id;
    private $name;
    private $dob;
    private address;

    function __construct($id) {
         $this->id = $id
    }

}

我只是想知道获得所有用户的最佳做法是什么。创建一个函数来为从数据库中找到的每个用户获取此类的对象? :s

8 个答案:

答案 0 :(得分:4)

从纯粹的OO角度来看,用户不应该了解数据库等。

我的第一个想法是UserFactory,它将与数据库通信并知道如何从SQL结果构建User对象。 可能希望将其专门化为具有SQLUserFactory,XMLUserFactory等。

值得一读Factory模式。工厂负责创建对象。在这种情况下,您可能希望稍后区分不同类型的User对象。在这种情况下,工厂有责任决定要创建哪种对象,而不是用户。

答案 1 :(得分:2)

这看起来像是对Active Record的尝试。在PHP中有一些包含Active Record的ORM实现。我建议调查一下。

否则请查看PDO并将查询结果绑定到对象。你或许可以通过这种方式获得一些东西。

答案 2 :(得分:2)

您是说哪个班级应该负责从数据库中获取用户?

User类似乎错了,为什么一个单独的用户“知道”有关获取所有(或某些)用户的查询。

您可以拥有UserHome或UserKeeper类。并且在那里有返回用户结果集的方法。

答案 3 :(得分:0)

从数据库获取用户不是OOP问题,它是一个数据库问题,通常是一个SQL问题。除非我不理解你的意思?

答案 4 :(得分:0)

在这种情况下,对象模型有点人为,因为在用户类上放置load()或get()方法没有多大意义,因为您不希望100个用户拥有100个单独的数据库往返/选择。这是“漏洞抽象”的一个例子。实施很重要。

因此,您需要编写一个函数来运行查询,返回一堆行并将它们转换为用户对象。

或者通过传入标准或一组记录,将类似ActiveRecord的抽象(例如CodeIgniter或Kohana中使用的抽象)用于一组记录。

答案 5 :(得分:0)

假设您的用户存储在MySQL数据库中,我将在用户中创建以下静态方法。好吧,我可能会使用ORM,比如Doctrine,但是......

static function queryAll() {
  $query = "SELECT id,name,dob,address FROM user";

  if ($result = $mysqli->query($query)) {
     $all = array();
     while ($obj = $result->fetch_object()) {
       $all[$obj->id] = $obj;
     }
     $result->close();
     return $all;
  }

  return array();

}

答案 6 :(得分:0)

在我看来,数据库交互应该是独立的,并且应该放在zend框架中的模型中,并从你应该制作模型类对象的控制器进行控制,并调用fetch all函数。

这是正确的方法吗?

答案 7 :(得分:0)

class User
{
    public $id;
    public $username;
    public $password;

    public function __construct()
    {
        $this->username = "";
        $this->password = "";

    }
}

将数据库与界面的交互分开

interface UserStore 
{
    public function Create(User $user) : User;
    //public function GetById(string $id) : ?User;
    public function getByUserName(string $userName) : ?User;
} 

实现界面。

class MySqlUserStore implements UserStore
{
    public $db;

    public function __construct($db)
    {
        $this->db = $db;

    }

    public function Create( User $user) : User
    {
        $query = "INSERT INTO users (username, password) VALUES (?, ?)";
        $user->id = $this->db->insert($query, array($user->username, $user->password));
        return $user;
    }
    public function getByUserName(string $userName) : ?User
    {
        $query = "SELECT * from users where username = ?";
        $result = $this->db->select($query, array($userName));
        if(count($result) > 0) {
            $user = new User();
            $user->id = $result[0]['id'];
            $user->username = $result[0]['username'];
            $user->password = $result[0]['password'];
            return $user;
        }
        return null;

    }
} 

使用用户存储

 $userStore = new MySqlUserStore($this->db);     
 $user = $userStore->getByUserName($username);