如何解决这种递归依赖?

时间:2014-04-02 07:49:02

标签: php

我遇到了一个奇怪的问题。

在类Node中我需要章节的一些功能,所以我在Node.php中包含了Chapter.php文件,如下所示:

Node.php文件:

require_once('Model.php');
require_once('Chapter.php');
class Node extends Model {
...
}

Chapter.php文件:

require_once('Node.php');
class Chapter extends Node {
...
}

错误:

 Fatal error: Class 'Node' not found in Chapter.php

为什么找不到Node类?有什么方法可以解决这个问题?

2 个答案:

答案 0 :(得分:4)

以下是您的代码正在执行的操作:

  1. [Node.php第1行]加载(不超过一次)Model.php - 所以就这样做
  2. [Node.php第2行]加载(不超过一次)Chapter.php - 所以就这样做
  3. [Chapter.php第1行]加载(不超过一次)Node.php - 我们已经开始这样做了,因为它是require_once,所以没有必要再这样做了
  4. [Chapter.php第2行]创建一个扩展Node的类 - 由于我们还没有得到Node.php的第3行,所以我们没有知道的类Node
  5. 最好的解决方案是将Node中所需的任何功能从其他地方转移到Node中。课程不应该取决于孩子的功能。

答案 1 :(得分:1)

您应该考虑使用autoloader

例如,将它放在应用程序开头的某个地方

function my_autoloader($class) {
    include 'classes/' . $class . '.php';
}

spl_autoload_register('my_autoloader');

然后当你

new Chapter();

如果该类尚未加载,PHP将自动包含chapter.php。在尝试加载chapter.php时,它会意识到它需要一个名为Node的类,如果该类尚未加载,则会包含node.php等。