我试图以某种方式坚持面向对象编程的规则。因此,我创建了一个用户类,用于处理一个用户。该用户是从db类用户加载的。
所以现在我正在创建一个userManager类,其函数类似于:findUserIdByEmail。
但是,正确的面向对象的方法是什么?
我应该直接从userManager构建一个查询到db还是应该以某种方式加载所有用户对象并在对象中找到它?
答案 0 :(得分:2)
我会构建类似getUserByEmail($email)
的东西,它返回完整的对象(有或没有相关对象)。在这种情况下,您可以使用$ User-> id访问id(或者,更好的是,为它构建一个不错的getter),还可以访问其他属性,而无需对数据库执行其他查询。如果您开始构建getUserIdByEmail
之类的功能,您很快就会开始构建getUserNameByEmail
,getUserPasswordByEmail
等方法。请参阅问题?
答案 1 :(得分:1)
我会实施
getUserByEmail($电子邮件)
哪个会调用数据库或任何其他数据存储区。基本示例减去转义/安全性
public function getUserByEmail($email)
{
$sql = "SELECT user_name AS username, user_id AS userId FROM User WHERE email_address = ". $email
$result = $this->runQuery($sql);
while($r = $result->getAssoc()){
$user = $this->createUserModel($r);
}
return $user;
}
public function createUserModel($row)
{
$user = new Default_Model_User;
$user->setUsername($row['username']);
$user->setUserId($row['userId']);
return $user;
}
然后,电子邮件方法将调用一个方法来创建保存属性的对象并将其返回。
答案 2 :(得分:1)
我将创建一个类对应于您在数据库中存储用户的表的类。我还将创建一个简单的User类,对应于存储用户的表结构。
表用户将拥有getSingleByEmail($ theEmail)方法,该方法将返回User对象,如果此类用户不存在,则为null。
class Users
{
public function getSingleByEmail($theEmail)
{
// check that email is valid
// if not throw exception
// get data from the database
// either with bare SQl or with some db wrapper
if (null !== theResult)
{
theResult = new User($theResult);
}
return theResult;
}
}
class User
{
private $id;
private email;
private $username;
public function __construct($theResult)
{
$this->id = theResult->id;
$this->email = theResult->email;
$this->username = theResult->username;
}
}
或类似的东西。