Prestashop两个模块使用相同的名称;无法重新声明类“”;致命错误


Prestashop two modules use identical name and give "Cannot redeclare class" fatal error

当两个模块在prestashop中使用相同的类名时,如何避免"无法重新声明类"的致命错误?

例如,我有一个模块,它声明并使用一个助手类Foo。我安装了一个新模块,它有一个不同的helper类,但名称相同Foo。因此,当我转到模块页面时,这会导致"无法重新声明类"的致命错误。我甚至无法卸载那个新模块。

创建使用自定义类/对象模型的模块时,需要命名它们。在PrestaShop中,您不能使用PHP的名称空间功能(因为PrestaShop核心不适合使用它),但您可以通过在类名前面加前缀来使用旧方法。例如:

// Your module:
class MyModule extends Module
// Your custom ObjectModel:
class Message extends ObjectModel

类名Message非常通用的,并且通常会与其他一些选择不当的模块发生冲突。

为了防止这种情况,您必须在类名前加上前缀:

class MM_Message extends ObjectModel

在这种情况下,MM_MyModule的缩写。这与其他模块或类冲突的可能性要小得多。事件一个更好的方法是在整个模块名称前面加上前缀:

class MyModule_Message extends ObjectModule

另外,根据以下内容命名数据库表:ps_my_module_message。这也使得导航数据库表变得容易。前缀类名是一种很好的做法,事实上,我一直都这么做。缺点可能是类名更长。

p.S如果要卸载有冲突的模块,则需要暂时禁用其中一个模块。一个好方法是将模块文件夹临时重命名为其他文件夹(要离开的模块的文件夹),然后卸载其他模块。之后,恢复原始文件夹名称。重命名模块文件夹将阻止其加载。从技术上讲,如果它没有加载到BO 中,您可以尝试在后台禁用它

您必须编辑这两个模块中的一个,并更改其类声明以及该类在其他php文件中的每次出现。

在Prestashop(1.7)的下一个版本中,将使用Symfony 2 Framework引入名称空间的概念。