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


Passing Session and Database objects to classes in PHP

通过多次研究,我发现了在开发过程中一直使用的设置会话和数据库对象的工厂方法。我想知道的是,抛开个人偏好不谈(尽管我会吸收任何人的意见),这种通用方法有效吗?它有效吗?如果不是,你对如何改进有什么建议吗?

背景

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

呼叫类别

这个类是用来调用静态函数的,比如:

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() {
        ...
    }
    ...
 }

设置类

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".

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

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

尽管这项练习帮助我学到了很多,我相信我可以花时间创建一个功能非常强大的工厂/容器,因为这不是我的计划的组成部分,甚至不是唯一的,但我最终还是屈服于古老的智慧,不重复已经做过的事情。

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