Prestashop 两个模块使用相同的名称并给出 "Cannot redeclare class" 致命错误

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

当两个模块在 prestashop 中使用相同的 class 名称时如何避免 "Cannot redeclare class" 致命错误?

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

创建使用自定义 classes/对象模型的模块时,您需要 namespace 它们。在 PrestaShop 中,您不能使用 PHP 的 namespace 功能(因为 PrestaShop 核心不适用于它),但您可以通过在您的 class 名称前加上旧方法来实现。例如:

// Your module:
class MyModule extends Module

// Your custom ObjectModel:
class Message extends ObjectModel

Class 名称 Message 非常 通用的并且很可能会与其他选择不当命名为 [=38 的模块发生冲突=]es.

为防止这种情况,您必须在您的 class 名称前加上前缀:

class MM_Message extends ObjectModel

在这种情况下 MM_MyModule 的缩写。这不太可能与其他模块或 classes 发生冲突。更好的方法是在整个模块名称前加上前缀:

class MyModule_Message extends ObjectModule

另外,根据 ps_my_module_message 命名您的数据库 table。这也使得浏览数据库变得容易table。前缀 class 名字是一个很好的做法,事实上,我一直这样做。缺点可能是更长的 class 个名字。

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

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

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