Skip to content

Latest commit

 

History

History
232 lines (159 loc) · 8.81 KB

3.php.md

File metadata and controls

232 lines (159 loc) · 8.81 KB

3. PHP

Срожайше запрещено и карается исправительной каторгой на урановых рудниках наличине 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

Обоснование: это легкий и быстрый способ обезопаситься от передачи "не того, чего надо"