- Как обозначить php файл
- ¶Отступы и пробелы
- ¶Операторы
- ¶Преобразование типа переменной
- ¶Управляющие конструкции
- ¶Длина линий и обертка
- ¶Вызов функций
- ¶Объявление функций
- ¶Вызов конструктора класса
- ¶Массивы
- ¶Кавычки
- $header
- ¶Объединение строк
- ¶»Включение» кода
- ¶Тэги PHP
- ¶Точка с запятой
- ¶Примеры ссылок
- ¶Соглашение об именовании
- ¶Функции и переменные
- ¶Постоянные переменные
- ¶Константы
- ¶Глобальные переменные
- ¶Название файлов
- ¶Ссылки
- 🌱 Помогите нам сделать документацию лучше!
- 🤔 По-прежнему нужна помощь?
Как обозначить php файл
Стандарты кодирования PHP — самый главный набор требований и правил, который должны соблюдать разработчики, когда пишут код для Drupal, так как PHP является основным языком системы.
¶Отступы и пробелы
Для отступов используйте 2 пробела. Табы запрещены.
Файлы должны быть отформатированы в Unix формате. Это значит, что переход на новую строку должен быть \n , а не \r\n .
Все файлы с кодом и текстом должны заканчиваться пустой строкой. Это решает проблемы с «\ No newline at end of file» и позволяет легче читать патчи.
Все блоки в начале PHP файла должны быть разделены пустой линией, это также касается /** @file */ блока, объявления неймеспейсов, использование use и весь последующий код.
Примеры правильного форматирования:
¶Операторы
Все двоичные операторы (которые идут между двумя значениями), такие как + , — , = , != , == , > , и т.д., должны иметь пробел перед и после оператора, для читаемости. Например, присвоение переменной должно выглядеть как $foo = $bar; , а не $foo=$bar; .
Для одинарных операторов (которые управляют только одним значением), таких как ++ , пробелы не ставятся, как до, так и после.
Для сравнения преобразованных типов мы используем != , использование <> запрещено.
¶Преобразование типа переменной
При преобразовании типа переменной ставится пробел между типом и самой переменной. Например (int) $foo .
¶Управляющие конструкции
Управляющие конструкции включают в себя if , for , while , switch и т.д.
Пример if условия со всеми возможными вариантами:
if (condition1 || condition2) < action1; >elseif (condition3 && condition4) < action2; >else
Не используйте else if , всегда должно быть elseif .
Управляющие конструкции должны иметь пробел между ключевым словом конструкции и открывающей скобкой, чтобы их было визуально проще отличать от вызова функий.
Всегда используйте фигурные скобки, даже тогда, когда их использование технически опционально. Они повышают читаемость кода и уменьшают вероятность логических ошибок при добавлении новых линий. Открывающая фигурная скобка всегда должна находиться на той же линии где и оператор, с пробелом перед ней. Закрывающая фигурная скобка всегда должна быть на собственной линии, и иметь тот же отступ как и открывающий оператор.
¶Длина линий и обертка
- Все линии кода не должны быть длиннее 80 символов.
- Линии содержащие названия функций длиннее данного значения, переменные, объявления и т.д., могут превышать это ограничение.
- Управляющие структуры условий могут превышать 80 символов, если их при этом остается легко читать и понимать.
Пример допустимых вариантов:
if ($something['with']['something']['else']['in']['here'] == mymodule_check_something($whatever['else'])) < . >if (isset($something['what']['ever']) && $something['what']['ever'] > $infinite && user_access('galaxy')) < . >// Неочевидные и сложные условия допустимы, но должны быть всегда задокументированы, // описывая зачем та или иная проверка производится. if (preg_match('@(/|\\)(\.\.|~)@', $target) && strpos($target_dir, $repository) !== 0)
- Условия не должны быть обернуты в несколько линий.
- Управляющие структуры условий также не должны пытаться выиграть Награду за самое компактное условие при меньшем числе строк кода™:
// Никогда не делайте такого! if ((isset($key) && !empty($user->uid) && $key == $user->uid) || (isset($user->cache) ? $user->cache : '') == ip_address() || isset($value) && $value >= time()))
Вместо этого мы рекомендуем дробить условия на самостоятельные куски, что также позволяет спокойно документировать, почему те или иные условия написаны и что они делают.
Правильный пример того что выше:
// Ключ валидный, только если он равен ID текущего пользователя, в противном // случае, другие пользователи смогут получить доступ к любым данным. $is_valid_user = isset($key) && !empty($user->uid) && $key == $user->uid; // IP адрес должен равняться кешу, для предотвращения подмены сессии. $is_valid_cache = isset($user->cache) ? $user->cache == ip_address() : FALSE; // Альтернативно, если параметр запроса находится в будущем, то он всегда // действителен, потому что галактика всё равно взорвется и рухнет. $is_valid_query = $is_valid_cache || (isset($value) && $value >= time()); if ($is_valid_user || $is_valid_query)
Данный пример по прежнему не совсем прозрачен и понятен что делает. Всегда берите во внимание и решайте, с пониманием чего могут возникнуть сложности, и объясните те конструкции подробнее.
Обратите внимание, в примерах используются комментарии на русском языке в демонстрационных целях. Писать комментарии на отличном от английского языке в Drupal запрещено!
¶Вызов функций
Функции должны вызываться без пробелов между названием функции и её открывающей скобкой и пробелом между первым аргументом. Пробелы должны быть между запятыми и следующим параметром, но пробелов не должно быть между последним параметром и закрывающей скобкой, также и до точки с запятой.
¶Объявление функций
function funstuff_sustem($field)
Аргументы со значениями по умолчанию должны быть в конце списка. Если функция возвращает какие-то данные, убедитесь что они осмысленны.
Анонимные функции должны иметь пробел между function и его скобками, как в следующем примере:
array_map(function ($item) use ($id) < return $item[$id]; >, $items);
¶Вызов конструктора класса
Когда вызываете конструктор без аргументов, всегда добавляйте скобки:
Это позволяет соблюдать последовательность с конструкторами, имеющие аргументы:
$foo = new MyClassName($arg1, $arg2);
Если название класса является переменной, то используйте следующий пример:
$bar = 'MyClassName'; $foo = new $bar(); $foo = new $bar($arg1, $arg2);
¶Массивы
Массивы должны быть отформатированы коротким синтаксисом, значения которого разделяются пробелом после каждого элемента (запятой), а также пробелами между оператором ассоциации => .
$some_array = ['hello', 'world', 'foo' => 'bar'];
Если объявление массива длиннее 80 символов, то каждый элемент должен быть на своей собственной линии с увеличением вложенности на 1 уровень.
$form['title'] = [ '#type' => 'textfield', '#title' => t('Title'), '#size' => 60, '#maxlength' => 128, '#description' => t('The title of your node.'), ];
Обратите внимание на запятую в конце последнего элемента массива. Это не опечатка! Это позволяет предотвратить ошибки парсинга, если в массив будут добавлены новые элементы в дальнейшем.
¶Кавычки
Drupal не имеет жестких стандартов на счет одиночных или двойных кавычек. Где возможно, соблюдайте последовательность с модулем и уважайте стиль других разработчиков.
Имя это ввиду, одиночные кавычки должны использовать по умолчанию. Они рекомендуются для использования кроме двух случаев:
- Интерполяция переменных в строке «
$header
» .
- Переводимые строки, где требуется эскейпинг данных. Например «He’s a good person.» — предпочтительный и правильный вариант ‘He\’s a good person.’ . Подобный эскейпинг может быть неправильно обработан генератором .pot файлов (переводов), и просто странно выглядит.
¶Объединение строк
Всегда используйте пробел между точкой и объединяемыми частями для улучшения читаемости:
$string = 'Foo' . $bar; $string = $bar . 'foo'; $string = bar() . 'foo'; $string = 'foo' . 'bar';
Когда вы объединяете значение простой переменной, используйте двойные кавычки, вместо одинарных:
Когда используете объединение при помощи оператора .= , используйте пробел по сторонам оператора:
$string .= 'Foo'; $string .= $bar; $string .= baz();
¶»Включение» кода
Везде, где вы подключаете файл с кодом без условий, используйте require_once() .
Когда подключаете код с использованием условий, используйте include_once() . Таким образом, файл будет импортирован лишь единожды.
include_once() и require_once() — это выражения, не функции. Вам не нужно заключать путь до файла в скобки.
Когда вы внедряете код из текущей директории или подпапки, путь до файла должен начинаться с точки . (текущая директория в файловых системах): include_once ./includes/mymodyle_formatting.inc .
Используйте константу DRUPAL_ROOT чтобы указать путь до файла относительно корня Drupal. Корнем является директория, где находится файл index.php. Например: require_once DRUPAL_ROOT . ‘/’ . variable_get(‘cache_inc’, ‘includes/cache.inc’); .
Для того чтобы подгрузить код из конкретного модуля:
module_load_include(‘inc’, ‘node’, ‘node.admin’);
¶Тэги PHP
Всегда используйте для PHP кода. Не используйте краткую запись . Это требование Drupal, а также позволяет делать код максимально портативным, так как включение кода на PHP, на различных системах, может отличаться.
У PHP файлов, не указывайте закрывающий ?> в конце файла. Это сделано специально:
- Удаление данного тега решает проблему с нежелательными пустыми строками в конце файла, которые приводят к ошибкам «header already sent», проблем с валидацией XHTML/XML и ряд других проблем.
- Закрывающий тег является опциональным.
- PHP.net также удаляют закрывающий тег в конце файла (например: prepend.inc), что можно расценивать как «лучшая практика».
¶Точка с запятой
В PHP точка с запятой обязательна почти во всех ситуациях, но разрешает их опускать в конце блоков кода. Drupal стандарты требуют указывать их, даже в конце блоков кода.
¶Примеры ссылок
Если вы хотите указать пример ссылки, всегда используйте домен «example.com» для таких ссылок согласно RFC 2606.
¶Соглашение об именовании
¶Функции и переменные
Названия функций должны быть в нижнем регистре, а слова разделены нижним подчеркиванием. Название функций также должны иметь группирующее название (модуля, темы) в качестве префикса, для того чтобы исключить пересечения с другими модулями.
Переменные должны быть в нижнем регистре, а слова разделены либо заглавными буквами (пример: $lowerCamelCase ), либо нижним подчеркиванием (например: $snake_case ). Будьте постоянны, не смешивайте оба варианта внутри файла.
¶Постоянные переменные
Постоянные переменные — те что установлены при помощи \Drupal::state() , должны всегда быть в нижнем регистре, а слова разделены нижним подчеркиванием. Они также должны иметь префикс в виде модуля, для исключения пересечения с переменными других модулей.
¶Константы
- Константы всегда должны быть в верхнем регистре, с нижним подчеркиванием в качестве разделителя слов. Это правило также касается предустановленных констант в PHP, таких как TRUE , FALSE и NULL .
- Константы объявленные модулем, должны иметь в качестве префикса название модуля, также в верхнем регистре.
- Начиная с Drupal 8 и выше, все константы должны быть объявлены при помощи ключевого слова const (подробнее), вместо define() , так как это лучше для производительности.
/** * Indicates that the item should be removed at the next general cache wipe. */ const CACHE_TEMPORARY = -1;
Обратите внимание что const не работает с выражениями PHP. Используйте define() , когда объявляете константу при определенных условиях или значениях литералов:
if (!defined('MAINTENANCE_MODE'))
¶Глобальные переменные
Если вам необходимо объявить глобальную переменную, то не забудьте добавить к названию в качестве префикса название модуля, а слова разделяйте нижним подчеркиванием.
¶Название файлов
Все файлы документации должны иметь расширение «.txt», для того чтобы просмотр на Windows системах был проще. Также, название данных файлов должно быть в верхнем регистре (например README.txt, вместо readme.txt), тогда как расширение остается в нижнем.
Примеры: README.txt, INSTALL.txt, TODO.txt, CHANGELOG.txt и т.д.
¶Ссылки
🌱 Помогите нам сделать документацию лучше!
Вся документация Druki с отрытым исходным кодом. Нашли ошибку или неточность? Создайте pull request.
🤔 По-прежнему нужна помощь?
Не нашли ответа на свой вопрос? Попросите помощи у сообщества!
- Отступы и пробелы
- Операторы
- Преобразование типа переменной
- Управляющие конструкции
- Длина линий и обертка
- Вызов функций
- Объявление функций
- Вызов конструктора класса
- Массивы
- Кавычки
- Объединение строк
- «Включение» кода
- Тэги PHP
- Точка с запятой
- Примеры ссылок
- Соглашение об именовании
- Функции и переменные
- Постоянные переменные
- Константы
- Глобальные переменные
- Название файлов
Drupal — зарегистрированная торговая марка Dries Buytaert.
Исходный код сайта предоставляется по лицензии GNU GPL v2 license.
Содержимое сайта предоставляется по лицензии Creative Commons Attribution CC-BY-SA 4.0 license.