繁体   English   中英

将会话和数据库对象传递给PHP中的类

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

_set类

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的制造商那里获得了一个轻量级的程序。 虽然这可能不是每个人的最佳答案,但对我而言。 干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM