[英]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::class1
或CALL::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.