|
WordPress 是一个古老的 CMS,但也是最常用的. 由于其支持过时的 PHP 版本和遗留代码的历史,它尚未实现现代编码实践:WordPress 中的抽象就是一个例子。 例如,将 WordPress 代码库拆分为由 Composer 管理的包会更好。或者,从文件路径自动加载 WordPress 类。 本文将教你如何手动抽象WordPress代码并使用WordPress插件的抽象功能。 WordPress 集成和 PHP 工具的问题 由于其旧架构,我们偶尔会遇到将 WordPress 与 PHP 代码库工具集成的问题,例如PHPStan静态分析器、 PHPUnit单元测试库和PHP-Scoper命名空间搜索库。例如,考虑以下情况: 在支持PHP 8.0的WordPress 5.6到来之前,Yoast 报告描述了在 WordPress 核心中运行 PHPStan 如何导致数千个问题。
由于仍然支持 PHP 5.6,WordPress 测试套件目前仅支持 PHPUnit 最高版本 7.5,该版本已达到生命周期终点。 通过 PHP-Scoper 确定 WordPress 插件的范围是非常困难的。 我们项目中的 WordPress 代码仅占总数的一小部分;该项目还将包含与底层 CMS 无关的业务代码。但是,仅仅因 v 为您有一些 WordPress 代码,该项目可能无法与工具正确集成。 因此,将项目拆分为多个包可能是有意义的,其中一些包包含 WordPress 代码,另一些包仅包含使用普通 PHP 的业务代码,而没有 WordPress 代码。这样,这些最新的软件包就不会受到上述问题的影响,而是能够与工具完美集成。 什么是代码抽象? 代码抽象消除了固定的代码依赖性,生成通过契约相互交互的包。然后可以将这些包添加到具有不同堆栈的不同应用程序中,从而最大限度地提高其可用性。代码抽象的结果是一个完全解耦的代码库,基于以下支柱: 针对接口而不是实现进行编码。 创建包并通过 Composer 分发它们。 通过依赖注入将所有部分粘合在一起。
您想了解更多有关 WordPress 代码抽象的信息吗?从最佳实践到推荐插件,您需要了解的一切只需一键点击即可点击发推文 针对接口而不是实现编写代码 针对接口进行编码是使用契约使代码片段相互交互的实践。合约只是一个 PHP(或任何其他语言)接口,它定义了可用的函数及其签名,即它们接收的输入和输出。 接口声明功能的意图,但不解释功能将如何实现。通过接口访问功能,我们的应用程序可以依赖自主的代码片段来实现特定的目标,而无需知道或关心它们是如何实现的。这样,应用程序不需要适应切换到实现相同目标的另一段代码,例如来自不同供应商的代码。 合同示例 CacheInterface以下代码使用Symfony合约和CacheItemInterfacePHP 标准推荐 (PSR) 合约来实现缓存功能: use Psr\Cache\CacheItemInterface; use Symfony\Contracts\Cache\CacheInterface; $value = $cache->get('my_cache_key', function (CacheItemInterface $item) { $item->expiresAfter(3600); return 'foobar'; }); $cacheImplements ,它定义从缓存中检索对象的CacheInterface方法。get通过合约访问此功能,应用程序可能不知道缓存在哪里。无论是在内存、磁盘、数据库、网络还是其他任何地方。尽管如此,它仍然必须执行该功能。CacheItemInterface定义方法expiresAfter来声明项目应在缓存中保留多长时间。应用程序可以调用此方法,而无需关心缓存的对象是什么;他只关心自己要在里面呆多久。 针对 WordPress 中的接口进行编码 由于我们正在抽象 WordPress 代码,因此结果将是应用程序不会直接引用WordPress 代码,而是始终通过接口引用。
|
|