PHP __autoload 无法重新声明

3

我开始使用PHP的__autoload函数,现在我遇到了一些奇怪的致命错误:无法重新声明类xxx。

这很奇怪,因为这些错误发生在我甚至没有使用autoload函数加载的类上。而且我还使用require_once来包含这些文件。

我对此非常困惑。有人知道在使用autoload时出现这种错误的原因吗?


3
你能贴一些示例代码吗? - Oliver Charlesworth
我遇到了一个错误:“致命错误:无法重新声明randomstring()(之前在/var/www/vhosts/businessgame.be/httpdocs/new/functions/function.random.php:24中声明),在/var/www/vhosts/businessgame.be/httpdocs/new/functions/function.random.php的第34行上重复声明。”奇怪的是,当我手动包含一个文件Bank.php时,这个错误就不会发生,但是这个文件并没有包含该函数,甚至根本没有使用它:P。如果您一脸茫然,请举手 ^ ^ - KingIsulgard
5个回答

6
require_once/include_once只在尝试包含文件时查看文件名,而不是类名。因此,你可以在Foo.php和B.php中都有类Foo,然后你会得到错误信息。
我不确定__autoload会给你带来什么问题,除非__autoload需要Foo.php,因为它需要类Foo,而你手动需要了B.php,重新定义了类Foo
顺便说一下,使用spl_autoload_register代替__autoload

文件名是正确的。只是它声称已经加载了一个类,但实际上并没有。当我跟踪被加载的类时,我注意到没有重复。 - KingIsulgard
感谢关于spl_autoload_register的提示!帮助了我。 - jsims281

4

我曾经遇到同样的情况...我所做的仅仅是更改了 and(某种代码或参数),现在它能够正常工作了。

include('xxx.php');

为了

require_once('xxx.php');

1
我不会假装给出最佳答案,只是我的想法。
__autoload() 在 PHP 7.2 中已被弃用,并可能被删除。
我发现了这种上传/包含文件的方法。
//initialize a function which will upload files
function upload(){//you can call the function as you like
  //your path to files goes here
}

spl_autoload_register('upload')//specify the function, where you include your files(in this case it's upload function   

0
我以前遇到过这个问题,但不确定是什么原因导致的。首先确保你使用的是require_once/include_once而不是普通版本。我认为问题与使用class_exists有关,而没有告诉它跳过自动加载(class_exists($name, false))- 你是否这样做了?

但是自动加载仅在类不存在时才会被调用?我已经跟踪了自动加载类包含的文件,我没有看到任何重复的内容。这是一个奇怪的错误。 - KingIsulgard

0
我找到了问题所在。显然,当它想要包含Bank类时,它从当前目录中获取了“bank.php”文件^^。这只是银行页面,它应该包括“src/model/Bank.php”。我从搜索列表中删除了当前目录,问题已经解决。
因此,请始终确保autoload函数包含正确的文件。良好的实践是将文件命名更直观,例如class.Bank.php或class.User.php,而不是Bank.php或User.php。
无论如何,感谢您的帮助和快速响应!

所以问题并不在于 require_once,而只是包含了错误的文件 ^ ^ - KingIsulgard
太好了,终于搞定了。我认为为了一个很明显的错误而改变整个文件命名约定是没有意义的。 - Anther

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接