PHP 应用程序可能存在循环依赖问题

Posted

技术标签:

【中文标题】PHP 应用程序可能存在循环依赖问题【英文标题】:Possible circular dependency issue with PHP application 【发布时间】:2010-09-16 17:47:55 【问题描述】:

我认为我的 php 应用程序存在循环依赖问题。如果这不正确,请告诉我。情况如下:

两个类,LogManager 和 DBSession。

DBSession 用于与数据库交互,LogManager 用于记录到文件。两者都在我的应用程序中广泛使用。创建 DBSession 实例时,必须通过构造函数参数为其提供 LogManager 实例。这是因为 DBSession 有时会将信息记录到文件中,并且会使用 LogManager 实例来执行此操作。

现在,我想扩展 LogManager 以便它也可以记录到数据库表,而不是文本文件。当然,我更喜欢重用现有的类,但我很快意识到这带来了一个有趣的情况。

DBSession 已经需要一个 LogManager 实例来构建。如果我想在 LogManager 中重用 DBSession 类,它现在需要一个 DBSession 实例。我怎样才能满足这两个要求?显然,我的方法一定有问题。

你会建议我如何解决这个问题?

提前谢谢各位。

【问题讨论】:

【参考方案1】:

也许您可以应用一些模式,例如 Singleton Pattern,以确保您只有一个 LogManager 类的实例。

【讨论】:

【参考方案2】:

不要扩展 LogManager,让它成为一个聚合类型。并延迟选择要登录的位置,即:

$logManager = new LogManager();
$dbSession = new DbSession($logManager);
$logManager->add(new FileLog($filename) );
$logManager->add(new DBLog($dbSession) );

当然,FileLog 和 DBLog 共享一个公共接口。 这是观察者模式的一个应用,其中 add() 是“订阅”操作,FileLog/DBLog 是日志事件的观察者。 (这样你还可以在很多地方保存日志。)

欧文编辑:调整为php语法。

【讨论】:

$logManager = new LogManager(); $dbSession = 新的 DbSession($logManager); $logManager->add(new FileLog($filename)); $logManager->add(new DBLog($dbSession));【参考方案3】:

其中一个对象实际上并不需要另一个:您猜对了,它是 DBSession。修改该对象,以便在构造后将记录器附加到它。

【讨论】:

【参考方案4】:

如果 LogManager 对象只是偶尔写入文件,为什么还要创建 DbSession 对象呢?仅在需要时才延迟加载它。另外,在我看来,两者都应该相互独立。每个人都可以在需要时互相实例化。

【讨论】:

从未真正尝试过实现延迟加载,但感谢您的推荐。我承认它会更合适,因为 LogManager 有时只与 DBSession 一起使用。谢谢!

以上是关于PHP 应用程序可能存在循环依赖问题的主要内容,如果未能解决你的问题,请参考以下文章

[PHP] Laravel 依赖注入使用不当引起的内存溢出

Flux 架构循环依赖

猫鼬 - 可能的循环依赖?

browserify 如何处理循环依赖?

求 php 循环执行大量数据 解决办法。

discuz新的单点论坛(不依赖UCenter)