PHP: Выполнение более строгих проверок

Источник: «Doing stricter checks in PHP»
Эти более строгие проверки помогают писать более надёжный и предсказуемый код, выявлять ошибки на ранней стадии и избавиться от потенциальных головных болей в будущем. Хотя к некоторым из этих рефакторингов может потребоваться время для привыкания, они стоят усилий по улучшению качества кода.

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

В течение многих лет я писал if (!empty($posts)), но Rector, инструмент для автоматического рефакторинга кода, изменил это на if ($posts === []). Основное преимущество использования $posts === [] заключается в том, что оно более явное и менее подвержено неожиданному поведению.

Может показаться, что это не так много, но это говорит о кодовой базе, с которой вы работаете. Использование $posts === [] демонстрирует более высокий уровень внимания к деталям и стремление писать более надёжный и предсказуемый код. Это показывает, что вы думаете о конкретных требованиях вашего кода и предпринимаете шаги, чтобы убедиться, что он ведёт себя так, как ожидалось.

Использование !empty($posts) может предложить более непринуждённый подход к программированию, когда вы полагаетесь на поведение PHP по умолчанию, а не явно определяете ожидаемое поведение вашего кода. Хотя это может быть приемлемо для небольших проектов, это может привести к неожиданным ошибкам и трудностям по мере роста и усложнения вашей кодовой базы.

Вот несколько фрагментов рефакторинга изученные мною, которые заставляют меня чувствовать, что я отвечаю за код, а не наоборот.

Используйте строгое сравнение для проверки на null и пустые строки

// До
if ($username == null) {}
if (!$username) {}

// После
if ($username === null) {}

Первые два условия проверяют, является ли user ложным, что включает в себя проверку того, является ли он null, false, 0 или пустой строкой. В примере После мы можем использовать оператор строгого сравнения ===, чтобы специально проверить, является ли $username null.

Используйте подсказку типа в параметрах функции

function calculate(int $x, int $y) {
// Какие-то вычисления
}

В этом примере подсказка типа int гарантирует, что $x и $y являются целыми числами. Если в функцию передано не целочисленное значение (int), PHP выдаст ошибку TypeError.

Используйте array_key_exists() для проверки ключей массива

// До
if (isset($data['username'])) {
// Какие-то действия
}

// После
if (array_key_exists('username', $data)) {
// Какие-то действия
}

В примере До мы использовали функцию isset(), чтобы проверить, существует ли $data['username']. В примере После мы можем использовать функцию array_key_exists(), для проверки, существует ли ключ username в $data.

Оператор объединения с null и оператор присваивания объединения с null

// До
if (isset($userData['username'])) {
$username = $userData['username'];
} else {
$username = 'Guest';
}

// После
$username = $userData['username'] ?? 'Guest';

В примере До мы используем оператор if, для проверки, существует $userData['username'] и соответствующим образом установить $username. В примере После мы используем оператор объединения с null ??, чтобы установить для $username значение $userData['username'], если оно существует и Guest, если его нет. Кроме того, мы можем использовать оператор присваивания объединения с null ??=, чтобы присвоить $username значение по умолчанию, если ему ещё не присвоено значение.

Эти более строгие проверки помогают писать более надёжный и предсказуемый код, выявлять ошибки на ранней стадии и избавиться от потенциальных головных болей в будущем. Хотя к некоторым из этих рефакторингов может потребоваться время для привыкания, они стоят усилий по улучшению качества кода. Или просто установите Rector и позвольте ему сделать всё за вас.

Дополнительные материалы

Предыдущая Статья

JavaScript: Что такое API и как с ним работать

Следующая Статья

Новое в Symfony 6.3 — Улучшения Перечислений