为什么 PHPMailer 只是从使用动态函数调用更改为 call_user_func()?

Why did PHPMailer just change from using dynamic function calls to call_user_func()?

在审查 PHPMailer(PHP 发送电子邮件的库)的最新更新时,我注意到了这个变化:

return $patternselect($address);

进入:

return call_user_func($patternselect, $address);

起初,我必须确保我没有从“反向”角度看待这个问题,但我不是; call_user_func 更改是新代码 -- 而不是旧代码。我还注意到在代码的不同位置进行了相同的操作。

因此,他们决定停止使用漂亮的“新”语法来动态调用函数,而是将其更改为旧的 call_user_func 语法。

为什么?我错过了什么吗?此处显示的第一个代码(这是我一直使用的代码)难道不是对 PHP 的改进,它使动态调用函数更好,而不必在代码中使用 call_user_func 吗?他们为什么要“回到”老路?

这不像是刚刚添加到 PHP 或其他任何东西,所以它不可能是“还没有完全准备好”的有问题的前沿功能。

PS:请注意,我不是要您研究 PHPMailer 开发人员的大脑,而是要向我解释为什么有人会想要这样做一旦他们实际使用了更好的(或者我认为是这样?)方式,就积极地这样做。

由于这是 所以 具体的,最好在 Github 上提问,但我会在这里回答。

这是出于一个非常具体的原因;切换到 variable functions(在 PHPMailer 6.1.2 中完成)导致 5.2.3 和 7.0.0 之间的 PHP 版本出现非常特殊的 BC 中断,我收到了报告.虽然那些 PHP 版本现在被认为已经失效,但许多人仍在使用它们,并且当前的 PHPMailer 版本 (6.x) 承诺兼容性回到 PHP 5.5,因此此更改需要还原以保持与那些旧版本的兼容性。它对以后的 PHP 版本没有影响。

我最初更改为可变函数,因为正如您所说,它是新的闪亮的,更易于阅读(恕我直言),并且是静态分析器推荐的那种东西,但是这些(显然!)不'考虑向后兼容性。

那么 BC 中断是什么?虽然可变函数本身已经存在了一段时间(我认为至少从 PHP 5.4 开始),但静态方法可调用模式 (class::method) 仅在 PHP 7.0.0 中添加,而该语法在 call_user_func 中运行良好;这正是 BC 中断的原因,也是 PHPMailer 6.1.7 版本中恢复的原因。