Старайтесь следовать единому стилю кодирования фреймворка Kohana. Это улучшает читабельность кода и позволяет с легкостью производить обмен кодом между разработчиками.
Имена классов и расположение файлов
Имена классов в Кохане должны следовать строгим правилам, для возможности автозагрузки. У имен классов первые буквы должны быть заглавными, с подчеркиваниями, в качестве разделителя слов. Эти подчеркивания очень важны, так как они непосредственно отражают местоположение файлов в файловой системе.
Применяются следующие правила:
1. Не должна использоваться так называемая Верблюжья нотация (напр. NewReport), кроме случаев, когда нежелательно создавать новый каталог.
2. Названия файлов с классами и директорий должны быть в нижнем регистре.
3. Все классы должны находиться в директории classes. Они могут находиться на любом уровне в каскадной файловой системе.
Примеры
Помните, что в классе подчеркивание означает новый каталог. Рассмотрим следующие примеры:
Class Name | File Path |
---|---|
Controller_Template | classes/controller/template.php |
Model_User | classes/model/user.php |
Database | classes/database.php |
Database_Query | classes/database/query.php |
Form | classes/form.php |
Стандарты кодирования
Просим вас следовать стандартам кодирования, насколько это возможно, чтобы ваш код максимально соответствовал исходному коду.
Скобки
Пожалуйста, используйте
Фигурные скобки
Фигурные скобки должны находиться на своей собственной линии, с отступом как у конструкции, к которой они относяться.
// Правильно if ($a === $b) { ... } else { ... } // Неправильно if ($a === $b) { ... } else { ... }
Скобки у класса
Единственное исключение — открывающая фигурная скобка класса. Она идет на той же линии.
// Правильно class Foo { // Неправильно class Foo {
Пустые скобки
Не вставляйте никакие символы внутрь пустых скобок.
// Правильно class Foo {} // Неправильно class Foo { }
Скобки у массивов
Массивы могут быть однострочные и многострочные
array('a' => 'b', 'c' => 'd') array( 'a' => 'b', 'c' => 'd', )
Открывающая скобка
Открывающая скобка массива должна идти на той же линии
// Правильно array( ... ) // Неправильно array ( ... )
Закрывающая скобка
Одномерный массив
Закрывающая скобка многострочного одномерного массива должна находиться на отдельной строке с отступом, таким же, как у выражения.
// Правильно $array = array( ... ) // Неправильно $array = array( ... )
Многомерный массив
Правила те же, что и у одномерного, только у вложенного массива должен быть отступ на один TAB вправо.
// Правильно array( 'arr' => array( ... ), 'arr' => array( ... ), ) array( 'arr' => array(...), 'arr' => array(...), )
Массивы, как аргументы функции
// Правильно do(array( ... )) // Неправильно do(array( ... ))
Как отмечалось в начале раздела про массивы, однострочный стиль написания также вполне приемлем.
// Правильно do(array(...)) // Альтернативный стиль написания, для разрыва длинных строк do($bar, 'this is a very long line', array(...));
Правила написания имен
Kohana использует стандарт under_score (использование символа нижнего подчеркивания в качестве разделителя) и не использует camelCase (так называемую «Верблюжью нотацию») в названиях.
Классы
// Класс контроллера, использует префикс контроллера class Controller_Apple extends Controller { // Класс модели, использует префикс модели class Model_Cheese extends Model { // Обычный класс class Peanut {
Не используйте скобки, если вы не передаете ничего конструктору, при создании экземпляра класса.
// Правильно $db = new Database; // Неправильно $db = new Database();
Функции и Методы
Функции должны быть в нижнем регистре и использовать подчеркивание для разделения слов.
function drink_beverage($beverage) {
Переменные
Названия переменных должны быть в нижнем регистре и использовать подчеркивание, а не «верблюжью нотацию» для разделения.
// Правильно $foo = 'bar'; $long_example = 'uses underscores'; // Неправильно $weDontWantThis = 'understood?';
Отступ
Вы должны использовать табуляцию для создания отступов. Использование пробелов строго запрещено.
Вертикальное выравнивание (для нескольких строк) осуществляется пробелами. Табуляция не подходит для этого, т.к. у разных людей она имеет разную ширину.
$text = 'this is a long text block that is wrapped. Normally, we aim for ' .'wrapping at 80 chars. Vertical alignment is very important for ' .'code readability. Remember that all indentation is done with tabs,' .'but vertical alignment should be completed with spaces, after ' .'indenting with tabs.';
Объединение строк (конкатенация)
Не ставьте пробелы вокруг оператора конкатенации.
// Правильно $str = 'one'.$var.'two'; // Неправильно $str = 'one'. $var .'two'; $str = 'one' . $var . 'two';
Однострочные условия
Однострочные if — условия могут быть использованы только в случае прерывания исполнения кода (например, return или continue).
// Правильно if ($foo == $bar) return $foo; if ($foo == $bar) continue; if ($foo == $bar) break; if ($foo == $bar) throw new Exception('You screwed up!'); // Неправильно if ($baz == $bun) $baz = $bar + 2;
Операторы сравнения
Пожалуйста, используйте операторы OR и AND для сравнения.
// Правильно if (($foo AND $bar) OR ($b AND $c)) // Неправильно if (($foo && $bar) || ($b && $c))
Пожалуйста, используйте elseif, а не else if.
// Правильно elseif ($bar) // Неправильно else if($bar)
Конструкция Switch
Каждый case, break и default должен быть на отдельной строке. Блок с кодом внутри case или default должен иметь отступ в одну табуляцию.
switch ($var) { case 'bar': case 'foo': echo 'hello'; break; case 1: echo 'one'; break; default: echo 'bye'; break; }
Круглые скобки
Между конструкцией и круглой скобкой должен стоять пробел. Знак ! (Восклицательный знак) должен иметь пробелы с обоих сторон, для улучшения читабельности. Кроме случаев с Восклицательным знаком или приведением типов, не должно быть никаких пробелов после открывающей и перед закрывающей скобками.
// Правильно if ($foo == $bar) if ( ! $foo) // Неправильно if($foo == $bar) if(!$foo) if ((int) $foo) if ( $foo == $bar ) if (! $foo)
Тернарный оператор
Стиль написания тернарного оператора — стандартный. Используйте скобки только вокруг выражения, а не вокруг переменных.
$foo = ($bar == $foo) ? $foo : $bar; $foo = $bar ? $foo : $bar;
Все сравнения и операции должны выполняться внутри круглых скобок.
$foo = ($bar > 5) ? ($bar + $foo) : strlen($bar);
Если требуется разделить тернарный оператор, в котором первая часть получается очень длинной (~ 80 символов), на несколько строк, для их выстраивания используйте пробелы.
$foo = ($bar == $foo) ? $foo : $bar;
Приведение типов
При приведении переменной тип должен обрамляться пробелами с обоих сторон.
// Правильно $foo = (string) $bar; if ( (string) $bar) // Неправильно $foo = (string)$bar;
Пожалуйста, старайтесь использовать приведение типа вместо тернарного оператора.
// Правильно $foo = (bool) $bar; // Неправильно $foo = ($bar == TRUE) ? TRUE : FALSE;
При приведении к целому или логическому типу используйте сокращенную форму записи
// Правильно $foo = (int) $bar; $foo = (bool) $bar; // Неправильно $foo = (integer) $bar; $foo = (boolean) $bar;
Константы
Для констант всегда используйте верхний регистр.
// Правильно define('MY_CONSTANT', 'my_value'); $a = TRUE; $b = NULL; // Неправильно define('MyConstant', 'my_value'); $a = True; $b = null;
При сравнении располагайте константу в конце.
// Правильно if ($foo !== FALSE) // Неправильно if (FALSE !== $foo)
Это немного спорно, поэтому я поясню. Если бы нам пришлось написать предыдущий пример по-русски, правильный пример будет звучать так:
если переменная $foo точно не FALSE (ложь)
А неправильный пример звучит так:
если FALSE (ложь) точно не переменная $foo
Так как мы читаем слева направо, ставить константу первой не имеет смысла.
Комментарии
Однострочные комментарии
Используйте //, лучше всего над строкой кода, который вы комментируете. Поставьте пробел и начните комментарий с большой буквы. Никогда не используйте #.
// Правильно //Неправильно // неправильно # Неправильно
Регулярные выражения
При написании регулярных выражений используйте стандарт PCRE, а не POSIX. PCRE считается более «мощным» и быстрым.
// Правильно if (preg_match('/abc/i', $str)) // Неправильно if (eregi('abc', $str))
Обрамляйте регулярные выражения одинарными кавычками, а не двойными. Одинарные кавычки более удобны из-за своей простоты. В отличие от строк в двойных кавычках они не поддерживают интерполяцию переменных и такие записи, как например \n или \t и т.д.
// Правильно preg_match('/abc/', $str); // Неправильно preg_match("/abc/", $str);
Для регулярных выражений с поиском и заменой, пожалуйста, используйте $n обозначение для обратных ссылок. Это предпочтительнее, чем \n.
// Правильно preg_replace('/(\d+) dollar/', '$1 euro', $str); // Неправильно preg_replace('/(\d+) dollar/', '\\1 euro', $str);
Наконец, обратите внимание, что метасимвол «$» соответствует позиции перед последним символом, в случае, если им является перевод строки. Используйте модификатор D, чтобы исправить это, если необходимо. Если данный модификатор используется, метасимвол «$» в шаблоне соответствует только окончанию обрабатываемых данных.
Подробнее:
$str = "email@example.com\n"; preg_match('/^.+@.+$/', $str); // TRUE preg_match('/^.+@.+$/D', $str); // FALSE
Пожалуйста, зарегистрируйтесь для комментирования.
А каковы правила использования закрывающего тега php «?>». Есть ли случаи когда его надо ставить в конце файла?
Не встречал, если честно. Только во вставках типа < ?php echo $name; ?> …..html-код.
На сколько видно по кодам в Kohana закрывающий тег «?>» не часто используется. Слышал, что это для ускорения обработчика PHP + вот ещё версия http://proger.net.ru/joomla/452
Есть много мнений, почему не стоит. Это и возможность попадания «лишних» символов и появление ошибки с заголовками. И возможность срабатывания вируса. У нас на одном из сайтов через фтп попала зараза и прописалась в конец всех php файлов сайта. Но так как закрывающий тег пхп отсутствовал, то интерпретатор php выдал ошибку и вредоносный код не сработал. А были бы теги, сработал бы.
Хм… для меня про код вируса самый весомый аргумент.
Обьясните пожалуйста для чего нужно файлы называть вот так Controller_Widget_Menu extends Controller_Template. В роутах ведь известно что открывать и где это искать! !!
По названию класса сразу видно, где его искать.
При чем тут роуты. А если мы класс наследуем ?
Controller_Widget_Menu зачем мне его так называть, его я не наследую и не собираюсь, согласен, что Controller_Template логично называть, чтоб знать где его искать. Так же интересно где создается обьект созданного класса контроллера мной, раз он работает, значить где-то создается обьект.