Могут ли имена пользовательских функций модуля содержать символы между 7F и FF?


PHP определяет допустимые имена функций как [a-za-Z_\x7f-\xff][a-za-Z0-9_\x7f-\xff]*.

Я уже сталкивался с конфликтами имен Drupal при использовании hook_form_alter, которые сталкивались с именем моего модуля, когда оно содержало общие слова, разделенные подчеркиванием "_" ("isys_helper_form_alter").

Поэтому я подумал об использовании символа сломанной трубы вместо этого, как я делал в других проектах PHP ("¦", символ #A6, "isys¦helper_form_alter").

К сожалению, Drupal, похоже, не находит никаких функций, которые я называю, используя символы в диапазоне от 7F до FF.

Является ли это документально подтвержденной разницей между Drupal и PHP?

Поиск документации в Интернете не выявил такой разницы, но я мог ее пропустить.

Author: Pierre.Vriens, 2012-10-23

2 answers

Это плохая идея. Пожалуйста, обратитесь к Стандартам кодирования Drupals в разделе Соглашения об именах.

На мой взгляд, имена функций/классов/переменных не должны содержать ничего, кроме A-Za-z0-9_.

Если вы не хотите, чтобы isys_helper_form_alter был подхвачен Drupal, вы всегда можете добавить к нему префикс подчеркивания: _isys_helper_form_alter.

Обновление

Вот еще одна тема о том, почему другие персонажи плохие: https://stackoverflow.com/questions/6362241/php-variable-function-class-names-using-special-characters. И даже если вы не забудете сохранить его в правильной кодировке, другие люди, которым позже потребуется сохранить ваш код, могут этого не сделать.

 6
Author: hampusn, 2017-05-23 11:33:47

Drupal позволяет использовать эти символы в имени функции. На самом деле константа DRUPAL_PHP_FUNCTION_PATTERN определяется следующим образом.

define('DRUPAL_PHP_FUNCTION_PATTERN', '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*')

В вашем случае проблема заключается в том, что краткое имя модуля не будет совпадать с начальной частью имени функции. Если короткое имя модуля - isys_helper, то у каждого крючка, реализованного этим модулем, должно быть имя, начинающееся с isys_helper_. У вас не может быть модуля с именем isys_helper, для которого крюк называется isys¦helper_form_alter().

Столкновение имен происходит, когда Drupal не может понять, для какого модуля функция является реализацией крючка и для какого крючка.
Предположим, вы создаете модуль с именем user_node.module, который определяет новый тип контента, для которого он реализует hook_view(). Функция, реализующая этот хук для этого модуля, будет называться user_node_view(), но это также будет имя для hook_node_view(), реализованного из пользовательского модуля. Это означает, что следующий код будет user_node_view() дважды, при условии, что и user_node.module, и user.module включены.

// Call any implementation of hook_view().
$node = module_invoke_all('view', $node, $view_mode);

// Call any implementation of hook_node_view().
module_invoke_all('node_view', $node, $view_mode, $langcode);

Конечно, использование подчеркивания в коротком имени модуля не помогает, но решение состоит в том, чтобы не ставить перед именем крючка строку, отличную от той, которую ожидает Drupal.

Были предложены решения, позволяющие избежать проблем, таких как использование двух знаков подчеркивания для отделения имени модуля от имени крючка. В примере я сделал реализацию hook_node_view(), сделанную из пользовательского модуля будет называться user__node_view(), в то время как реализация hook_view() для другого модуля будет user_node__view(). Таким образом, можно было бы избежать двусмысленности.
Другое предложение состояло в том, чтобы использовать пространства имен PHP 5.3, но вполне вероятно, что даже в Drupal 8 имена крючков будут следовать той же схеме, что и в других версиях Drupal.

 0
Author: kiamlaluno, 2012-10-31 01:33:40