phpMailer 函数中的 New Smarty() 出现致命错误

Posted

技术标签:

【中文标题】phpMailer 函数中的 New Smarty() 出现致命错误【英文标题】:Fatal error with New Smarty() in phpMailer function 【发布时间】:2017-05-26 17:34:02 【问题描述】:

我有一个继承的站点,并且在迁移到新的托管站点并升级到更新的 Smarty 2.6.3 和 php 5.6 后一直运行良好。今天我在一些用户抱怨他们没有收到来自网站的电子邮件(会员注册)后进行了一些测试。

今天开始收到此错误Fatal error: Cannot redeclare class Smarty。调查显示,系统中有两条$temp = new Smarty() 语句——一个在用户登录设置Smarty 时调用,第二个在类Emailer 中使用phpmailer

如果我尝试引用初始 Smarty 设置变量,我会收到 call to null 错误。如果我删除电子邮件中的聪明代码,电子邮件甚至不会被调用。正如我所说,几年来一直工作良好......过去一个月代码没有变化......

这是两个模块中的 smarty 初始化:

// Setup.php
require('../Smarty-2.6.30/libs/Smarty.class.php');
$_TEMP = new Smarty();

class Emailer ...
require('../Smarty-2.6.30/libs/Smarty.class.php');
$temp = new Smarty();

...

emailer功能中Smarty的需要是邮件正文使用Smarty模板。

【问题讨论】:

意识到我应该提到在电子邮件功能中需要 Smarty 是为电子邮件正文使用 Smarty 模板。 上面的代码,来自一个文件? 对不起 - 不。第二个是在一个单独的类文件中,它设置了电子邮件功能(cEmailer.php)。 setup.php 由 index.php 代码调用。 cEmailer 由发送电子邮件的各个模块调用。 【参考方案1】:

这是一件简单的事情——你的问题不是你创建了两个 Smarty 实例,而是你在同一个文件上调用了两次 require。改为这样做:

// Setup.php
require_once('../Smarty-2.6.30/libs/Smarty.class.php');
$_TEMP = new Smarty();

class Emailer ...
require_once('../Smarty-2.6.30/libs/Smarty.class.php');
$temp = new Smarty();

这将解决您的致命错误,但是,您现在可能会遇到一个不同的错误,因为您创建的两个实例可能不是您所需要的,但这是一个单独的问题。

当我在这里时,为什么你使用古老的 Smarty 2.x? 3.x 要好得多。

【讨论】:

我正在使用旧的 smarty,因为这是一个继承的站点,我只是在学习 Smarty 和代码中包含的其他一些库。还没准备好处理升级的结果。从旧版本的 php 和 mysql 升级时遇到了足够的问题。 而且,它有效!非常感谢!

以上是关于phpMailer 函数中的 New Smarty() 出现致命错误的主要内容,如果未能解决你的问题,请参考以下文章

thinkcmf安装后

8. Smarty3:模版中的内置函数

PHP 通过PHPMailer发送邮件

PHP 通过PHPMailer发送邮件

强制 phpmailer 发送正文为空的邮件

php使用PHPMailer发送邮件示例