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 и позвольте ему сделать всё за вас.