将Session和Database对象传递给PHP中的类

时间:2013-12-09 06:26:31

标签: php oop

通过我的多项研究,我遇到了在开发过程中一直使用的设置会话和数据库对象的工厂方法。我想知道的是,抛开个人偏好(虽然我会沉浸在任何人的意见中),这种通用方法是否有效,并且它是否有效(意思是,我是否正确使用它)?如果不是,您对如何改进有建议吗?

背景

我以这种方式创建了代码,以便在调用类时将数据库和会话对象传递给类。我希望能够传递相关的对象/引用,以便可以使用它们。

通话类

这个类用于调用静态函数,如下所示:

class CALL {
    public static $_db, $_session;

    public status function class1() {
        $function = new class1();
        $function->set_session(self::$_session);
        $function->set_database(self::$_db);
        return $function;
    }

    public status function class2() {
        ...
    }
    ...
 }

_set class

class _set {
    public $_db, $_session;

    public function __construct() { ... }

    public function set_database($_db) {
        $this->_db = $_db;
    }

    public function set_session($_session) {
         $this->_session = $_session;
    }
}

现在引用的类。

class class1 extends _set {
    function __construct() { ... }

    function function1() { return "foo"; }
    ...
}

因此,继续前进,将使用CALL::class1CALL::class2来调用这些类。之后,可以按照惯例访问它们,也就是:

CALL::$_db = $database->_dbObject;
CALL::$_session = $_SESSION;
$class1 = CALL::class1;
echo $class1->function1(); //prints "foo".

2 个答案:

答案 0 :(得分:1)

了解Dependency Injection。从我的观点来看,你应该永远不要在其他对象中创建像$ db或$ session这样的对象。你应该通过构造函数或setter方法注入它们。它将使您的代码更少依赖于特定的类,并且更容易替换所有依赖项几乎没有重构(实际上没有一个,如果你知道热使用接口)。

答案 1 :(得分:0)

如果有人发现这一点,我将与您分享我的解决方案。

虽然这个练习帮助我学到了很多东西,但我相信我可以花时间创建一个非常实用的工厂/容器,因为这不是我的程序不可或缺的,甚至不是唯一的,我终于屈服于不重复已经完成的事情的古老智慧。

我使用了Pimple,一个使用PHP闭包来创建函数调用的轻量级库。现在,我可以灵活地确定我想要的依赖注入,但我也只需要注入一次。即使在创建新实例时,未来的调用也会复制它们。虽然我认为,从理论上讲,我的项目是可行的,但确实有一个不幸的问题,就是要求你进入容器进行更改。使用Pimple我不需要这样做。所以我被Container类扔了,并从Symfony的制造商处获得了一个轻量级程序。虽然这可能不是每个人的最佳答案,但它适合我。干杯!