在OOP中,依赖注入空实例化对象或使用静态?

时间:2010-12-23 21:25:42

标签: php oop

我正在尝试理解OOP,并在尝试使代码可行且可测试时遇到一些问题。

如果我有两个表:用户和登录,我想获取特定用户的所有登录信息,以及用户信息,如姓名,职位,等等。

$mdlLogins= new Logins();
$mdlUsers = new Users();
$mdlUsers->setMdlLogins($mdlLogins);
$mdlUsers->getAll();

class Logins
{
    function getLogins($user_id)
    {
        // db query by $user_id and fetch loop into $logins
        return $logins;
    }
}

class Users
{
    function setMdlLogins($model)
    {
        $this->mdlLogins = $model;
    }

    public function getAll()
    {
        // db query
        foreach ($user=mysql_fetch_object($result))
        {
            $this->users[] = $this->mdlLogins->getLogins($user->getID());
        }
    }
}

是吗?或者,我应该使用静态方法(跳过->setMdlLogins()并将getLogins更改为Logins::getLogins($user->getID()))?为什么不使用常规函数:get_user_logins()

如果我想创建一个包含登录的用户对象,并且每个登录在登录时显示帖子,每个帖子显示查看帖子的人数,该怎么办?是否最好使用静态方法来提取所有内容,或者创建空对象并将它们作为依赖项注入:

$mdlViews = new Views;
$mdlPosts = new Posts;
$mdlPosts->setViews($mdlViews);
$mdlLogins = new Logins;
$mdlLogins->setPosts($mdlPosts);
$mdlUsers = new Users;
$mdlUsers->setLogins($mdlLogins);
$mdlUsers->getAll();

似乎需要做很多工作......对于一个对象来说太多了,或者它只是一个对象的典型对象,但也许我应该不再担心单元测试而只是使用静态方法而不是设置如此多的模型原始模型取决于?

如何保持OOP,Unit Testable,但不要让它如此复杂?!

我对这些东西非常密集,但我真的想在1月开始我的下一个项目之前理解它,所以我不会制造噩梦。

谢谢, 汉斯

2 个答案:

答案 0 :(得分:1)

阅读本文:Static Methods and Properties.阅读整个事情,你只会在病房后了解更多信息。它对我帮助很大。

答案 1 :(得分:1)

@Babiker联系到了什么帮助,但这个问题对我来说最有用:

When to use static vs instantiated classes

这并不是特别关注我所追求的 - 如何注入不同的依赖关系 - 但它确实帮助我理解何时使用静态以及何时实例化。

@grantwparks说:

  

如果我有一组功能   与主题有关,但是   实例数据完全是   不合适,我宁愿   让他们在课堂上定义而不是   其中每个都在全局命名空间中。   我只是使用可用的机制   在PHP5到

* give them all a namespace -- avoiding any name clashes
* keep them physically located together instead of becoming scattered
     

跨项目 - 其他开发人员   可以更容易地找到已经存在的东西   可用且不太可能   重新发明轮子       *让我使用类consts而不是任何魔术值的全局定义

现在我明白为什么人们这样做了。我总是迷失方向,想知道为什么他们不只是为它创造一个常规的ole函数。

@troelskn说:

  

我建议 - 作为初学者   在oop中 - 你试图避免静电   各位成员。它会强迫   你在写作的方向   面向对象而不是程序性的   风格。

这也帮助了我,因为它明确表示,至少从@ troelskn的角度来看,静态成员比OO更具程序性,这也是我想的,但也不确定。

@Michael Aaron Safyan说:

  

使用会员数据和会员功能   允许您重用您的函数   多个不同的数据,   而你只能有一份副本   您使用时操作的数据   静态数据和函数。

更多重新执行。

@IonuţG。Stan的回答对我来说是最重要的,尤其是:

  

主要思想是解耦   您的类之外的依赖项。这个   代码更具可扩展性的方式   而且,对我来说最重要的部分,   测试。为什么它更重要   可以测试?因为我并不总是   编写库代码,所以可扩展性   并不重要,但可测试性   重构时很重要。   无论如何,可测试代码通常会产生   可扩展的代码,所以它不是真的   无论哪种情况。

所以,虽然不是完美的答案,但他们帮助我理解了这一点,我认为我开始更好地理解这一切。