【问题标题】:Circular dependency between classes PHPPHP 类之间的循环依赖
【发布时间】:2014-11-10 05:44:01
【问题描述】:

我正在从事一个涉及执行流程分析的项目。 我为分析器创建了一个单独的类,每次我需要分析某些东西时,我都会实例化分析器类的对象并开始监控。

$profiler=new Profiler($params);
$profiler->start();
//the code to be monitored//
$profiler->end();

分析器类构造函数检查参数以确定是否要记录实例 ID。我使用了一个数据库表来存储分析参数。

void _construct($params){
 $this->checkConfig($params);
}

checkConfig 函数对数据库执行查询以获取配置。

现在,团队计划监控数据库查询(在我们的案例中,这些查询是通过查询类执行的)。我为 executeQuery 函数尝试了类似的实现:

class Query{
 public function executeQuery($queryParams){
   $profiler=new Profiler($params);
   $profiler->start();
   /*Execute query*/
   $profiler->end();
 }
}

这会产生一个有趣的循环依赖。查询类启动一个探查器,它触发一个查询,查询将再次要求探查器。

有解决这个问题的想法吗?

【问题讨论】:

  • Query 类注入分析器?无论哪种方式,您的代码中都有错误:executeQuery 方法将一个不存在的$params 变量传递给Profiler 构造函数
  • 我在为我的 DB 类实现监听器时遇到了同样的问题。当我使用 DB 查询实现并注册一个侦听器时,侦听器在侦听器中再次被触发,因此我最终陷入了无限循环。然后我在 DB 类中实现的是一个 muteListener() 函数,当设置为 true 时,它会停止调用侦听器。所以在我的听众中,在我触发数据库查询之前,我设置了muteListener(true),在查询之后设置为 ?又是假的。
  • @EliasVanOotegem params var 仅用于演示目的。 executequery 函数将传递一些真实信息来确定是否要分析当前查询。
  • @nullPointer:不管怎样,Query 类不应该同时处理查询和它自己的日志记录,这违反了 SRP。注入依赖,如果你有循环依赖,很可能你没有以正确的方式开展业务
  • @EliasVanOotegem 目标是分析系统中运行的所有查询。由于系统中运行的所有查询都由单个类处理,因此我们的目标是监控查询时间。在我看来,这并不违反 SRP 原则,因为分析是一个单独的类,我们只需要在执行查询时开始和结束分析,其余的由分析器类处理。

标签: php profiling circular-dependency


【解决方案1】:

对于遇到类似问题的任何人,这是我为解决问题而构建的解决方法。

class Query{
   public function executeQuery($queryParams){
   static $checkProfiler;
   if(!isset($checkProfiler)){
     $profiler=new Profiler($params);
     $checkProfiler=1;
   }
   $profiler->start();
   /*Execute query*/
   $profiler->end();
   unset($checkProfiler);
 }
}

start 和 end 方法检查分析器是否处于活动状态。不确定这是否是最好的方法,但它解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2021-04-23
    相关资源
    最近更新 更多