PHPMailer提示无法在写入上下文中使用函数返回值错误如何解决
问题根因
该报错由PHPMailer版本与生产环境PHP版本不兼容导致:
- PHPMailer 6.5.1 最低要求PHP版本为5.5,而你的生产环境为PHP 5.4.20,不符合版本要求
- 错误提示
*can't use function return value in write context in src/PHPMailer on line 1700*的触发逻辑是:PHP 5.4及更早版本中,empty()语法结构不支持直接传入函数返回值做判断,PHPMailer 6.5.1源码第1700行刚好存在empty(函数调用)的写法,在PHP5.4环境下直接触发语法错误。
解决思路
- 方案1:降级PHPMailer到兼容PHP5.4的版本(最稳妥的临时方案)
替换PHPMailer为5.2.28版本,这是官方支持PHP5.4的最后一个稳定版本,替换后无需修改业务代码,仅替换PHPMailer源文件即可恢复正常。 - 方案2:手动修改PHPMailer 6.5.1源码兼容PHP5.4(仅应急使用)
打开报错的PHPMailer.php文件,定位到1700行,将empty()直接判断函数返回值的写法拆分:
原代码示例:
修改为:if (empty($this->getSMTPInstance())) {
注意:这类语法不兼容的逻辑可能不止一处,修改完当前报错后可能还需要处理其他同类问题,不建议长期使用修改后的源码。$smtpInstance = $this->getSMTPInstance(); if (empty($smtpInstance)) { - 方案3:升级生产环境PHP版本(长期推荐方案)
将生产环境PHP升级到5.5及以上版本,即可直接兼容PHPMailer 6.5.1,同时也能修复旧版本PHP的安全漏洞、获得更好的运行性能。
额外代码优化提示
你当前的文件引入顺序存在冗余:如果已经通过composer安装了PHPMailer,只需要引入librairies/vendor/autoload.php即可,不需要手动单独引入PHPMailer的三个源文件,不过该问题不会触发当前报错,属于可优化项。
内容的提问来源于stack exchange,提问作者Michael Collin
相关产品推荐
相关产品推荐

