如何避免因重新声明的函数而导致两个框架冲突?

时间:2016-09-05 17:44:41

标签: php

问题

我正在使用两个并行运行的PHP框架,Wordpress和CakePHP的网站上工作。它们都包含一个名为__()的核心函数。

我知道我可以修改任一框架的核心文件来检查函数是否已声明,然后不声明它:

if (!function_exists('__')) {
    function __() {
        // ...
    }
}

然而,问题是两个框架都需要不时自动更新,当发生这种情况时,核心文件会被重写并且函数会返回,从而导致致命的错误。

Wordpress不受我们的控制。使用CMS的编辑器希望能够从Wordpress管理面板自动更新框架和插件。这意味着我无法真正修改Wordpress核心来解决问题,因为他们只会在每次更新时覆盖我的更改。

CakePHP由开发人员通过Composer进行更新。当然,一个基本的解决方案是确保所有开发人员都知道在执行Composer更新时,需要修改声明该函数的核心文件以修复致命错误。这仍然是一个非常糟糕的解决方案。

问题

所以虽然我99%肯定没有永久性的解决方案,但我想知道是否有任何PHP专家能够想到一个非常聪明的,尽管有些非传统/凌乱,用一些代码来解决这个问题。 CakePHP中的自定义应用程序。如果有些事情可以做,我不会在PHP中知道。

应用程序的工作原理

  • 该网站的基本营销页面是纯Wordpress。 CakePHP不会在这些页面上加载。

  • 在网站的某些需要更复杂功能的部分,CakePHP首先加载 。在呈现页面之前,CakePHP加载Wordpress框架,然后通过Wordpress呈现页面。 这两个框架在同一个被声明两次的函数上发生冲突的页面。

我的想法

  1. 当CakePHP在页面上引导时,让它运行直到要呈现视图。此时,只有CakePHP声明了该函数。

  2. 在加载Wordpress之前检查函数是否存在。

  3. 以某种方式阻止Wordpress提前重新声明该功能。我们在应用程序代码中编写了这个代码,该代码完全由开发人员控制并致力于我们的Git仓库。

  4. 我觉得发布这个问题很荒谬,因为我确定这是不可能的,但如果有一种非常聪明的方法可以解决这个问题,那就太有用了。

1 个答案:

答案 0 :(得分:0)

正如ceejayoz所说,派上CakePHP,并在那个分支上维护你的项目。

进行提交,为您的项目提供服务,并提交给Cake团队。正如你的建议,使__声明条件尚未存在,在其phpdoc中声明@deprecated,并创建一个你将所有内容转换为的命名空间版本。将其作为PR发送给Cake。

当您需要更新分支时,将上游分支合并到您的分支中。 您非常关注使用__函数的传入Cake更改并相应地更改它们。 Git不会抓住这些。