如何在命名空间中包装整个第三方库/框架?

时间:2016-03-15 19:38:04

标签: php wordpress namespaces twig

我为WordPress编写了一个相当受欢迎的插件。在几次修改之前,我开始在插件中包含Sensio的Twig,以便清楚地分离对表示和逻辑的关注。最近(自从我开始包括树枝以来已经超过一年左右),我一直听到用户抱怨他们无法再激活插件;他们得到一个错误,指出“Twig_Autoloader”无法重新声明,或类似地表明在另一个插件中有另一个Twig实例。

老实说,我应该想到这一点 - 我不认为别人可能会使用Twig是一种悲伤的疏忽。我对此表示反对;-)解决它似乎比我想象的更棘手。 Twig使用自动加载器,PSR-0兼容,我相信。我不能简单地在我的插件的头部声明一个命名空间并重写几行来反映新的命名空间,因为自动加载器似乎将所有内容加载到全局命名空间中。如果我为autoloader类声明一个名称空间,这仍然是正确的 - Autoloader类将为自己使用新的名称空间,但它加载的所有内容都会进入全局名称空间。

我可以简单地检查自动加载器类是否已经存在,然后使用另一个实例,但我不保证将使用相同的版本,这将导致奇怪的错误。我可以手动去在包含的Twig库中的每个文件中声明一个名称空间,但这看起来不够优雅和低效。

在其他语言中,我可以简单地将整个事物包装在一个新类中,但PHP没有那么特别精确。

那么 - 最好的方法是什么?

非常感谢!

0 个答案:

没有答案