当两个模块在 prestashop 中使用相同的类名时,如何避免“无法重新声明类”致命错误?
例如,我有一个声明并使用辅助类 Foo 的模块。我安装了一个新模块,它有一个不同的帮助类但同名 Foo。因此,当我转到模块页面时,会导致“无法重新声明类”致命错误。我什至无法卸载那个新模块。
当两个模块在 prestashop 中使用相同的类名时,如何避免“无法重新声明类”致命错误?
例如,我有一个声明并使用辅助类 Foo 的模块。我安装了一个新模块,它有一个不同的帮助类但同名 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
. 这也使得导航数据库表变得容易。给类名加前缀是一种很好的做法,事实上,我一直都这样做。缺点可能是更长的类名。
PS如果你想卸载一个有冲突的模块,你需要暂时禁用它们。一个好方法是将模块文件夹临时重命名为其他名称(您要离开的模块的文件夹),然后卸载另一个模块。之后,恢复原始文件夹名称。重命名模块文件夹将阻止它加载。从技术上讲,如果没有在 BO 中加载,您可以尝试在后台禁用它
好吧,您必须编辑这两个模块之一并更改其类声明以及该类在其其他 php 文件中的每次出现。
在 Prestashop (1.7) 的下一个版本中,将使用 Symfony 2 框架引入命名空间的概念。