【问题标题】:Does __autoload affect included files?__autoload 会影响包含的文件吗?
【发布时间】:2012-12-13 10:24:36
【问题描述】:

我有 index.php 文件,在最上面我定义了 __autoload 魔术函数。

function __autoload($className) {
   echo "autoloading $className";
   require_once('application/models/'.strtolower($className).'.php');
}

然后,我引用 __autoload 自动包含的 User 对象(User.php)。直到这一刻一切正常。 问题是 User.php 引用了 File 类

        $obj->numberOfUploads = File::countUploadsByUser($obj->ID);

此时会抛出错误

致命错误:在第 19 行的 Z:\home\project\www\application\models\user.php 中找不到类“文件”

问题是,我可以看到输出

自动加载用户

但看不到有关文件的任何内容。因此,看起来,当捕获到对 File 的引用时,根本不会调用 __autoload 函数。尝试将 __autoload 函数添加到 User.php 导致重新声明该函数时出错。

对不起,如果之前提出过这个问题,我尝试谷歌它并没有找到任何信息。

干杯

【问题讨论】:

  • 我认为您看到的输出可能是误报,正如您在加载 User 脚本时可能看到的那样。我刚刚开始学习如何使用命名空间,但我想知道这是否有助于解决这个问题? php.net/manual/en/language.namespaces.importing.php
  • 你是对的 - 只有在包含成功的情况下才会显示输出。我还没有处理命名空间,因为这是一个相对较新的功能,所以我不能说它是否有帮助。但是 Fabian Tamp 解决方案可以解决问题

标签: php autoload


【解决方案1】:

autoload in the php manual 上的 cmets 看来,很多人在定义 __autoload 两次时遇到了类似的问题。

我建议将spl_autoload_register 与匿名函数一起使用以避免多个定义冲突,如该页面的示例 1 所示:

// Or, using an anonymous function as of PHP 5.3.0
spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.class.php';
});

另外,您不需要使用require_once(可以使用require),因为如果已经找到该类,则不会再次调用处理程序。

尝试在您的index.php 文件中使用spl_autoload_register,如果这不起作用,请在您的User.php 中也添加一个。

祝你好运!

【讨论】:

  • 感谢您的回复。问题不在于重新定义功能。我试图了解 __autoload 是否可以在它包含的文件中工作。我的意思是,如果不是,那么这更有可能是一个 PHP 错误
  • 我也想过……它应该在包含的文件中工作,因为“当包含一个文件时,它包含的代码继承了该行的变量范围包含发生的位置。调用文件中该行中可用的任何变量都将在被调用文件中可用,从那时起“(请参阅include
  • this comment的那个人好像和你有类似的问题。
  • 我试过你提供的代码,它就像一个魅力。不需要将它包含在 index.php 的任何其他文件中,因为此函数完全按预期工作 - 每个加载的页面在引用未声明的类时都使用 spl_autoload。太棒了,谢谢!它仍然让我感到困惑,为什么 __autoload 不起作用
  • 太棒了!很高兴这有帮助。不是问题!我从你的问题中学到了很多:)
猜你喜欢
  • 2011-12-08
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
相关资源
最近更新 更多