PHP 8 的  is_callable() 在检查一个类名与非静态方法时将返回失败

💡 原文中文,约1000字,阅读约需3分钟。
📝

内容提要

最近大胡子正在准备一款可以自定义页面模块的企业主题,可以定制不同类型的官网。由于PHP 8的改动,WPJAM Basic出现了一个bug,需要发布新版解决。

🔎

延伸解读

PHP 8 的 is_callable 行为变化

PHP 8 不再允许通过静态调用方式调用非静态方法,因此 is_callable() 在检查类名与非静态方法组合时会返回 false。例如,is_callable(['Test', 'method1']) 在 PHP 8 之前为 true,之后变为 false;而检查实例则仍为 true。这一改动影响了依赖此检查的代码逻辑。

对 WPJAM Basic 的实际影响

由于上述改动,WPJAM Basic 在 PHP 8 环境下出现了后台文章和分类列表操作无效的 bug,表现为点击保存无反应。作者通过调试定位到问题源于 is_callable() 的检查失败,导致相关功能无法正常执行。这提醒开发者需注意 PHP 8 的兼容性调整。

兼容性测试的必要性

作者在准备新企业主题时,因主题支持完全自定义,需在不同 PHP 版本中进行测试,从而发现了该 bug。这表明在开发或更新插件、主题时,跨 PHP 版本的兼容性测试至关重要,尤其是 PHP 8 带来的行为变更可能影响原有功能。

❓

Q&A

PHP 8 中 is_callable() 函数有什么变化?

PHP 8 不再允许通过静态调用的方式去调用非静态方法。因此,is_callable() 在检查一个类名与非静态方法时将返回失败,应当检查一个类的实例。

为什么在 PHP 8 下 is_callable(['Test', 'method1']) 会返回 false?

因为 method1 是非静态方法,而 PHP 8 不再允许通过静态调用的方式调用非静态方法,所以 is_callable() 检查类名与非静态方法时返回 false。

WPJAM Basic 在 PHP 8 下出现了什么 bug?

后台文章和分类列表的一些操作无效,怎么点击保存都无效。

WPJAM Basic 的 bug 是如何引起的?

是由于 PHP 8 对 is_callable() 函数的改动造成的,PHP 8 不再允许通过静态调用方式调用非静态方法,导致 is_callable() 检查失败。

如何解决 WPJAM Basic 在 PHP 8 下的兼容性问题?

需要发布 WPJAM Basic 的新版本来解决这个问题,用户可以更新 WPJAM Basic。

在 PHP 8 中,如何正确检查一个非静态方法是否可调用?

应当检查一个类的实例,例如使用 is_callable([new Test, 'method1']) 而不是类名。

🏷️

标签

➡️

继续阅读