0

我最近实现了以下代码来在我的 php 代码中自动加载类:

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

该代码包含在文件中,该文件包含在需要生成网页的所有文件的顶部。因此,我开始着手从我的代码中删除 require_once 调用。这是一个例子:

require_once('classes/class_web_page.php');

正如您可能从上面收集到的那样,我网站上的各个页面(它是一个在线社区,所以有一个论坛、画廊等)都使用 web_page 类来生成页面标题、菜单等。各种代码创建一个 web_page 对象,设置各种参数以确定需要哪些菜单选项等,为页面提供一些内容,并生成 html。

一切似乎都很好,直到我对 class_web_page.php 文件进行了更改。这种变化在大多数网站上都立即显现出来……除了主页。

我刷新了我的浏览器,如果再次打开就关闭 :-) 尝试调用http://www.terragenesis.co.uk/index.php而不仅仅是http://www.terragenesis.co.uk/,甚至停止并在服务器上重新启动 apache。尽管如此,这些更改并未显示在主页上。最后,我将 require_once 行放回 index.php 中……然后马上嘿:我在 class_web_page.php 中所做的更改出现在主页上。

所以在我看来,自动加载器正在加载 class_web_page.php 的缓存副本,并且没有任何东西,甚至没有重新启动 Apache,都无法说服它获取新版本。为什么它应该为主页而不是其他页面这样做......我不知道。

有没有其他人经历过这个?我对自动加载器代码做错了吗?我该如何解决它......还是我必须将所有 require_once 语句放回原处?:-(

我的服务器有 PHP 版本 5.1.6

4

2 回答 2

1

我找到了这个问题的答案......和往常一样,我几天都没有遇到“错误”,结果证明我做了一些非常愚蠢的事情:

事实证明,在过去的某个时候,我不小心将 class_web_page.php 的副本上传到了站点主目录而不是 classes 子目录。所以它存在了两次。

因此,看起来尽管我的自动加载器告诉 php 在 classes 子目录中查找,但它会首先在与主脚本相同的目录中查找(在我的站点主页的情况下为 index.php)。所有其他网站页面脚本都在子目录(论坛、画廊等)中,因此它们“正确”使用 /classes/class_web_page.php

我现在已经删除了位于主目录中的 class_web_page.php 的副本……一切正常。

于 2013-01-29T11:25:55.387 回答
0

您确定该文件实际已加载(或它的缓存版本)吗?

于 2013-01-23T16:48:27.583 回答