功能抽象

时间:2011-11-09 19:21:24

标签: php function

关于可重复使用代码的快速问题。

我最近一直试图将我的代码模块化。我对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,那么实例化用户对象会有意义吗?

真的只是寻找一些指示。抽象功能总是会影响性能吗?或者我只是走错路?

3 个答案:

答案 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或数组。然后代码检查它是一个数组还是整数,如果它是一个整数,或者如果数组不包含所需的键,它会在生成返回用户名之前进行查询查找。