Срожайше запрещено и карается исправительной каторгой на урановых рудниках наличине HTML, JavaSccript и/или CSS в php-коде (исключая скомпилированные шаблоны). Это же правило касается любых "частей" HTML, JavaSccript и/или CSS: классов, имен тегов, конкретных значений CSS-свойств и т. д.
====
Строжайше запрещено использование конструкций типа $$variable
. Автор полагает, что это правило в объяснении не нуждается
====
Строжайше запрещено подавление ошибок через @
Обоснование: а. Это невероятно медленно. б. Это полный ад при отладке. Если где-то возникает ошибка - это в любом случае плохо, она должна не подавляться, а не возникать.
====
Расширение php-файла строго .php
.
====
Первыми символами любого php-файла должен быть открывающий тег <?php
.
Обоснование: любой вывод отправляет заголовки, делая отдачу тех заголовков, которые требуются невозможным. К тому-же, тогда по факту вывод начинается на моменте Controller или Model, что нарушает MVC.
====
Строжайше запрещено использование закрывающего PHP тега (?>
)
Обоснование: см. предыдущий пункт.
====
Запрещено использование PHP short tag (<? /* snip */ ?>
````).
Хорошее объяснение тут.
====
Запрещено в рамках одного файла объявлять символы (классы, функции и т. д.) и исполнять логику
ПЛОХО:
class SuperVillain { /* snip */ }
$magneto = new SuperVillain('Magneto');
try {
$magneto->conquer($world);
}
catch (VillainException $e) {
/* snip */
}
ХОРОШО:
// Файл SuperVillain.php
class SuperVillain { /* snip */ }
// Файл index.php
$magneto = new SuperVillain('Magneto');
try {
$magneto->conquer($world);
}
catch (VillainException $e) {
/* snip */
}
====
Каждый класс должен размещаться в отдельном файле, имя которого должно совпадать с именем класса. Единственным исключением является случай, когда в файле объявляются несколько очень тесно связанных между собой классов, например - класс DAO (Data Access Object) и исключения, которые использует только он.
====
Настоятельно рекомендуется использовать исключения (Exceptions) для сигнализации обо всех нештатных ситуациях.
ПЛОХО:
public static function logIn ($login, $password) {
if (self::checkLoginAndPassword($login,$password)) {
return null;
}
return new self();
}
ХОРОШО:
public static function logIn ($login, $password) {
if (self::checkLoginAndPassword($login,$password)) {
throw new UserNotFoundException ();
}
return new self();
}
====
Все классы-наследники класса Exception
должны иметь имя, заканчивающееся на слово Exception
====
Любые конфигурационные файлы должны иметь расширение .php
Обоснование: можно легко забыть закрыть доступ к этим файлам через .htaccess, следовательно, если конфигурационные файлы имеют расширение .php
и злоумышленник попытается их открыть (Зайдя в браузере по урлу http://test.com/config/db.cnf), он не увидит содержимого, т.к. эти файлы будут исполнены и на выход ничего не будет отправлено.
====
Настоятельно рекомендуется использовать следующие параметры при разработке:
display_errors = On
display_startup_errors = On
error_reporting = -1
При этом код не должен вызывать ни одной ошибки (даже E_NOTICE
). Разрешается при выводе отключать отображение E_NOTICE
, но не более.
Настоятельно рекомендуется использовать следующую конструкцию для циклов for
:
for ($i = 0, $c = count($array); $i < $c; $i++) { /* snip */ }
Обоснование: count($array)
выполняется только один раз и ее выполнение вписано в сам цикл, что есть удобно
====
Настоятельно рекомендуется использовать комментарии типа
/**
* @var SomeObject $object
*/
foreach ($objectsArray as $object) {
$object->someMethid();
}
Обоснование: IDE "подхватит" $object
как объект класса SomeObject
, что позволит использовать встроенный в IDE автокомплитер по полям/методам объекта.
Использование переменных внутри строки запрещено.
ПЛОХО:
return "C'mon $name let's go party!";
ТОЖЕ ПЛОХО:
return "C'mon {$user['name']} let's go party!";
ХОРОШО:
return 'C\'mon '.$name.' let's go party!';
====
Если требуется принудительно вывести перенос строки (например - в отдельном скрипте, обрабатывающем запросы другого сервера), рекомендуется использовать константу.
ПРИМЕР:
define('EOL',"\r\n");
echo '42'.EOL;
Использование var
запрещено.
====
Обязательно использование ключевого слова public
даже там, где его можно опустить.
====
Использование магических методов не рекомендуется
====
Если свойство или метод могут быть статическими, они должны быть статическими
====
Каждый класс должен быть разделен на такие "логические блоки":
- Блок констант класса
- Блок свойств класса
- Блок публичных методов
- Блок защищенных методов
- Блок Блок приватных методов
====
Использование статических переменных в функциях запрещено
====
Использование global
запрещено
====
Использование суперглобального массива $GLOBALS
запрещено
====
Если метод/функция принимают объект как параметр, обязательно указание класса объекта
ПЛОХО:
public static function disturbForce ($jedi) {
$ratio = $jedi->getForceStrength();
/* snip */
}
ХОРОШО:
public static function disturbForce (JediPerson $jedi) {
$ratio = $jedi->getForceStrength();
/* snip */
}
Подробнее: Type Hinting
Обоснование: это легкий и быстрый способ обезопаситься от передачи "не того, чего надо"