【发布时间】:2015-06-12 08:31:34
【问题描述】:
我将尽我所能解释这一点,如果部分内容没有完全理解,请原谅我。我正在构建一个用于教育目的的 PHP 库/框架。我正在使用单例模式构建它,但遇到了一些问题,并且最近似乎读到它不应该被使用,因为它不是很可测试,(虽然我不担心这是可测试的,但我想学习如何做),而应该使用依赖注入。
我想要的是一个共享变量,如果你愿意的话,它包含许多不同的类。例如 $app->database; $应用程序->视图; $应用程序->会话;等等,并且不确定我是否做对了。所有类也正在自动加载。
我有初始化主变量的 bootstrap/start.php(有这个名称吗?):
$app = new App(new Database, new Views, new Session);
在我主要使用的 App.php 类中:
public $database;
public $views;
public $session
public function __construct(Client $client, Views $views, Session $session)
{
$this->database = $database;
$this->views = $views;
$this->session = $session;
}
我的问题是:我应该像那样初始化构造函数中的所有类吗?还有一个大问题...我如何在我的 Views.php 类中使用 $database 变量而不创建一个可能会覆盖 Database 类中的某些属性的全新实例?
非常感谢您对此的一些见解。
【问题讨论】:
-
作为其中一种方式,您可以在 App 中创建静态方法,这些方法将返回您的数据库、视图实例
-
您应该寻找像
Pimple或Symfony这样的容器,并创建Client、Views,Session` 服务。这样,容器包含每个服务的 1 个实例。现在对于依赖注入,如果View服务需要Database服务,你必须在他的构造函数中注入一个Databaseobject,并在他的服务声明中注入数据库service -
@Med 感谢您的回复。我以前使用过 Symfony 容器,但想看看我是否可以从头开始自己解决一些问题。
-
我同意@Med。如果您照常进行,则将您的应用程序与数据库/视图/会话的实现紧密联系在一起(顺便说一句,您可能并不总是需要会话)。拥有一个包含您可以使用的服务、工厂等的容器会更好。您可以在您的应用程序包中有一个接口,您的所有服务都将作为一个单独的接口实现,以保证应用程序/核心/无论您称之为包的任何人都可以使用它们(例如)
标签: php oop design-patterns dependency-injection