关于可重复使用代码的快速问题。
我最近一直试图将我的代码模块化。我对OO PHP并不是很好(我正努力让我全神贯注)但是即使我开始使用OOP也有很多场景,比如下面的场景,我看到了抽象代码的问题。 / p>
因此,假设我有一个在新闻文章中发表评论的用户列表。当我得到评论列表时,我所拥有的只是用户ID。在我开始尝试抽象功能之前,我会做一些像
这样的事情SELECT c.*, u.username FROM comments AS c LEFT JOIN users AS u ON c.uid = u.id WHERE c.news_id = 90
这会给我评论以及发布它的用户名。现在为了抽象出用户名的回溯(假设用户名是null,我可能想要返回fname和sname的concat)我可以做这样的事情。 (记住它的一个例子,我知道在大多数情况下用户名将是一个必需的注册字段,想象我正在建立一个基础系统来开发新的网站,其中用户名可能是数据库中的字符串以外的东西。)
function getUsername($uid) {
return /** the username from the database however i decide to get it **/
}
那必须运行至少1个mysql查询。如果我有100条评论显示,则可能是100条查询正在运行
在OOP我想我会做类似
的事情$user = new User($uid);
echo $user->getUsername();
但是这也需要一个查询来加载用户(并且可能会略微增加资源,因为用户类会获得更多关于init的信息,以便为所有可能的方法构建用户对象。
我知道我可以使用memcache或其他东西加快速度。甚至缓存结果,因此后续的getUsername()调用具有相同的uid不需要另一个查询。但是,我不能想到一个解决方案,就像以通常的方式获取用户名一样好(第一个代码片段)。
我是否在深入了解功能抽象并尝试过度使用OOP?我不这么认为,我认为这是一个非常有效的要求,如果我要使用OOP,那么实例化用户对象会有意义吗?
真的只是寻找一些指示。抽象功能总是会影响性能吗?或者我只是走错路?
答案 0 :(得分:0)
这就是模型视图控制器框架可以进入的地方。
基本上每个mysql表都有一个模型,每个模型都有其控制器功能,使用该模型和该控制器的不同页面(或视图)。
如果您不想使用MVC路由,我认为制作User
对象类没有问题:
class User {
public function __construct($ID){
$user_query = "SELECT * FROM USERS WHERE id='$id'";
//do the query
//save all info to object:
$this->username = $row['username'];
$this->fname = $row['fname'];
//...
}
public function getUserName(){
return $this->username;
}
public function getFirstName(){
return $this->fname;
}
//..etcetera
}
你可以像这样使用它:
$user = new User(1);
echo "Hello ".$user->getFirstName()." your username is: ".$user->getUserName();
答案 1 :(得分:0)
在这种特殊情况下,我会考虑使用静态方法(http://www.php.net/manual/en/language.oop5.static.php)。像这样:
class User {
/* all my normal class stuff to load a user */
public static function getUsername($uid) {
/* sql to retrieve username from db */
return $username;
}
}
$username = User::getUsername($uid);
通过这种方式,您可以避免实例化新的用户对象,并只执行必要的查询。
答案 2 :(得分:0)
虽然清理我的帐户,但我认为最好关闭一些旧问题。我发现的很明显,我有一种感觉,我一直都知道。对于其他任何想和我一样的人,发现这篇文章。基本前提是你的决定。
基本上你可以完全抽象你的方法,使它们完全独立并遇到一些非常重要的性能问题,或者在规模的另一端,你根本无法抽象,并且能够调整每一个小东西以获得最佳性能。一般意义上的表现和抽象是相反的,所以找到让你开心的中间位置。
在上面的例子中,我决定将方法设为静态,然后传入用户ID或数组。然后代码检查它是一个数组还是整数,如果它是一个整数,或者如果数组不包含所需的键,它会在生成返回用户名之前进行查询查找。