如何避免两个框架冲突,由于重声明的功能


How to avoid two frameworks conflicting due to redeclared function?

问题

我在一个网站上工作,利用两个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仓库。

我觉得张贴这个问题很荒谬,因为我确信这是不可能的,但如果有一个真正聪明的方法来解决这个问题,那将是非常有用的。

正如ceejayoz所说,分叉CakePHP,并在该分支上维护您的项目。

为你的项目做一个提交,你可以提交给Cake团队。正如您所建议的,将__声明设为不存在的条件,在其phpdoc中声明为@deprecated,并创建一个将所有内容转换为的命名空间版本。把它作为公关发给Cake。

当你需要更新你的分支时,将上游分支合并到你的分支中。您应该注意使用__函数时传入的Cake更改,并相应地更改它们。Git不会捕获这些