无法重新声明类PHPMailer

3
这很令人困惑,因为我查看了其他答案并应用了它们,但我仍然不断收到这个致命错误。
我在WordPress中使用phpmailer,并有以下代码:
if (!class_exists('PHPMailer')) {
    require_once(ABSPATH . 'wp-content/uploads/phpmailer/_lib/class.phpmailer.php');
}

页面无法加载,出现错误信息:

PHP致命错误:无法重新声明类PHPMailer

(我也尝试过class_exists('PHPMailer', false),但仍然出现相同的错误。)
据我所见,通过检查类是否存在,然后使用require_once,我不应该遇到这个问题。
但是我确实遇到了...
非常感谢您的帮助。

你的代码中已经有一个名为 PHPMailer 的类了,它不必在你包含的同一文件中,只需要类名相同即可。你之所以会出现错误是因为类名必须唯一。你能否对所有代码进行全面搜索?PS:命名空间用于避免类名冲突。 - KIKO Software
如果您注释掉您提供的代码行会发生什么?提供代码行下面是什么? - Will B.
你使用了哪些插件?有时候一些插件会导致这种问题。可能是你为邮件使用了多个插件。 - Akshay Shah
1
class_exists() may returns unexpected false negative with namespaces. Take a look at this How to check if class exists within a namespace?. If your code is within the namespace Foo for example, then your code checks for the existence of the class Foo\PHPMailer. Try with class_exists('\\PHPMailer') - Chris
这将是你学习命名空间的日子 =) - Bogdan Burym
感谢大家的评论和建议!非常感激。 - arathra
2个回答

2

谢谢!我在wp-includes中“发现”了PHPMailer,并链接到该版本,而不是我上传的“额外”版本。现在一切都好了。 :) - arathra

0

我认为这可能比命名空间问题更简单:class_exists 接受第二个 autoload 参数,默认值为 true,这意味着如果它尚未加载并且可以在您的 include_path 中找到它,它将自动尝试加载该类。最终结果是,通过将该参数保留为其默认值,您实际上会加载两次,因此会出现重新声明错误。请尝试使用以下代码:

if (!class_exists('PHPMailer', false)) {
    require_once(ABSPATH . 'wp-content/uploads/phpmailer/_lib/class.phpmailer.php');
}

另外一则消息:使用Composer。它可以为您管理所有的类加载,即使是微不足道的脚本也值得使用。

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