Как избежать фатальной ошибки «Cannot redeclare class», когда два модуля используют одно и то же имя класса в prestashop?
Например, у меня есть модуль, который объявляет и использует вспомогательный класс Foo.
Я устанавливаю новый модуль, который имеет другой класс помощника, но с тем же именем Foo. Так что это приводит к фатальной ошибке «Cannot redeclare class», когда я захожу на страницу модулей. Я даже не могу удалить этот новый модуль.
Что ж, вам придется отредактировать один из этих двух модулей и изменить его объявление класса и каждое вхождение этого класса в другие его файлы php.
В следующей версии Prestashop (1.7) понятие пространств имен будет введено с использованием Symfony 2 Framework.
При создании модулей, использующих пользовательские классы / объектные модели, вам необходимо Пространство имен их. В 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