【问题标题】:APC, PHP and two classes which require each otherAPC、PHP 和两个相互需要的类
【发布时间】:2012-03-13 17:20:20
【问题描述】:

我正在管理一个 PHP 应用程序,我们现在想启用 APC。问题是我们有两个相互需要的类。一个非常基本的示例如下所示:

in class_a.php

require_once('path/to/class_b.php)';

class a extends something {
    //
}

in class_b.php

require_once('path/to/class_a.php');

class b extends something2 {
    //    
}

但是,当我们启用 APC 时,会出现“[apc-error] Cannot redeclare class class_b in class_b.php”。好的,那是因为已经通过 class_a.php 中的 require_once() 加载了该类,所以如果某个第 3 个文件需要 class_b.php,APC 将引发错误。

如何解决这个“循环引用式”问题?

【问题讨论】:

  • 你有哪个版本的PHP?确保路径完全相同。如果您未指定完整路径,请确保您的 include_path 中的某处没有具有相同名称的延迟文件。
  • 尝试使用自动加载器 - 这将防止您在此类问题中回退
  • PHP 5.3 和 APC 是最新版本。所有包含路径都是绝对的并且完全相同。

标签: php opcode-cache


【解决方案1】:

解决这个问题的最好方法是摆脱循环依赖本身。我认为它实际上符合Code Smell

尝试按照this article 中的说明进行操作。它应该为您提供另一种方法。我只是希望你能_阅读_ Java ...

【讨论】:

    【解决方案2】:

    显然有一个“功能”可以让您覆盖require_once 调用并允许它们被多次包含。由于您似乎正在使用require_once,这似乎是您的问题。要禁用此检查设置 apc.include_once_override 在 php.ini 或添加

    [apc]
    apc.include_once_override = 0
    

    此设置存在重复/未找到的类等已知问题。看看这是否有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-21
      • 2015-06-16
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多