我有一个用户类,我可以获得用户的姓名,出生日期等...(下)
class user {
private $id;
private $name;
private $dob;
private address;
function __construct($id) {
$this->id = $id
}
}
我只是想知道获得所有用户的最佳做法是什么。创建一个函数来为从数据库中找到的每个用户获取此类的对象? :s
答案 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);