Я знаком с использованием module_exists
в модуле, и использовать его в таких ситуациях, как:
- Включите некоторые дополнительные функции в модуле, при условии, что на сайте также доступен другой модуль. Модуль Reservations: Email содержит пример (на самом деле примеров тому достаточно), как показано в источнике его модуля : для использования токенов (в теле письма) необходимо, чтобы модуль Token был включен.
- Реализовать зависимости модулей в теме, как показано в ответе на вопрос « Как реализовать зависимости модулей в теме и модули пакетов с темой? ».
Тем не менее, есть также function_exists
, как показано в ответе на вопрос « Можно ли объявить зависимость библиотеки Javascript на Hook.info? ».
У меня сложилось впечатление, что использование function_exists
является более надежным (безопасным) подходом по сравнению с module_exists
. Особенно, если вы хотите быть уверены, что какая-то функция (добавленная в более новой версии модуля) доступна, тогда как, просто используя ее module_exists
, вы рискуете столкнуться с такими ошибками:
- если сайт еще использует старую версию модуля, который не имеет эту функцию еще (так что вы не должны пытаться использовать его еще ).
- если сайт уже использует новую версию модуля, который не имеет этой функции больше (так что вы не должны пытаться использовать его больше ).
Мой вопрос : каковы типичные критерии, или плюсы / минусы, чтобы выбрать для использования либо module_exists
против function_exists
?
источник
MODULENAME_requirements
в связанном посте? Да, это будет иметь больше смысла, как призыв кmodule_exists
. Как упоминалось в MPD, высокоуровневый / более абстрактный способ убедиться, что зависимость имеет определенные функции, - это проверить код для выпуска и заставить ваш код полагаться на конкретную версию, с которой, как вы знаете, работает ваш код. Точно так же, как это делают Composer / NPM / Bundler / etcВы правы,
function_exists
это более надежный способ проверить наличие функции API, предоставляемой модулем contrib. Это очень удобно для непосредственного использования API модуля contrib.Я использую Session Cache API в качестве примера:
Однако некоторые модули contrib предоставляют только некоторые дополнительные свойства или функции, очень сложно сказать, какая это зависимая функция. В этом случае вам нужно использовать
module_exists
Я использую Элементы в качестве примера:
источник
session_cache_set
предоставляется ли это drupal.org/project/session_cache или другим модулем и, следовательно, выполняет то, что вы хотите?function_exists
может предотвратить неопределенную ошибку функции, когда модуль contrib изменил свой API после обновления. Конечно, наиболее гарантия способ обернутьfunction_exists
с ,module_exits
как указано @Clive, но для меня это слишком утомительно.function_exits
действительно, препятствуйте тому, чтобы сайт полностью разрушился ...Предыдущие 3 (интересные) ответы кажутся мне как-то подтверждающими мое «восприятие» (как я описал в своем вопросе). Интересно, что эти ответы изначально были написаны независимо друг от друга (они были опубликованы примерно в тот же момент, как показано на временной шкале этого вопроса , используйте «формат переключения», чтобы увидеть «мин»).
Ответ Джимми Ко (+ комментарии под ним) иллюстрирует еще несколько примеров того, как использование
function_exists
может сделать модуль более устойчивым в отношении возможных изменений в каком-либо другом модуле, который модуль использует (зависит от).Ответ Клайва показывает, что вы также можете объединить,
module_exists
иfunction_exists
хотя приведенный ниже комментарий разрешил мои сомнения по поводу моегоfunction_exists
примера (то есть его лучше использоватьmodule_exists
).Ответ mpdonadio (+ комментарии под ним), по крайней мере для меня, самый сложный для восприятия. Но после просмотра комментария Шона Конна под ним я нашел еще несколько ссылок, которые предоставляют более подробную информацию обо всем этом, а именно:
«Мой вывод» (после переваривания предыдущих ответов): оставьте это для использования ядром Drupal
function_exists
, и добавленные / пользовательские модули должны стараться, насколько это возможно, придерживатьсяmodule_exists
... хотя есть исключения ...источник