当两个模块在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引入名称空间的概念。