【问题标题】:Cannot redeclare class PHPMailer无法重新声明类 PHPMailer
【发布时间】:2018-02-16 14:07:40
【问题描述】:

这很令人困惑,因为我检查了其他答案并应用了它们,但我仍然不断收到这个致命错误。

我在 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:命名空间用于避免类名中的这些冲突。
  • 如果您注释掉您提供的代码行会发生什么?您提供的代码行下面是什么?
  • 您正在使用哪些插件,有些插件会造成此类问题。您可能使用了多个邮件插件。
  • class_exists() 可能会返回带有命名空间的意外 假阴性。看看这个How to check if class exists within a namespace?。例如,如果您的代码在命名空间Foo 中,那么您的代码会检查类Foo\PHPMailer 是否存在。试试class_exists('\\PHPMailer')
  • 今天是您了解命名空间的日子 =)

标签: php wordpress class phpmailer


【解决方案1】:

PHPMailer 实例已经在 wordpress 中工作。您不需要再次包含库。检查此链接以供参考

https://codex.wordpress.org/Plugin_API/Action_Reference/phpmailer_init

【讨论】:

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

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

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

在其他新闻中:use composer。它为您管理所有类加载。即使是琐碎的脚本也值得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 2013-08-07
    • 2011-03-22
    • 2023-03-29
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多