Топ ошибок начинающих PHP разработчиков: как их избежать

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение

PHP остаётся одним из самых популярных языков для веб-разработки, несмотря на появление множества альтернатив. Однако новички часто допускают типичные ошибки, которые могут привести к уязвимостям, снижению производительности или просто к неработающему коду. В этой статье мы разберём топ-5 ошибок начинающих PHP-разработчиков, покажем примеры неправильного кода и дадим рекомендации по их исправлению. Материал будет полезен как тем, кто только начинает изучать PHP, так и тем, кто хочет освежить знания.

1. Игнорирование безопасности: SQL-инъекции и XSS

Самая распространённая и опасная ошибка — недостаточная фильтрация пользовательских данных. Многие новички берут данные напрямую из $_GET или $_POST и подставляют их в SQL-запросы или выводят на страницу без экранирования.

Неправильный код (SQL-инъекция)

<?php
$username = $_POST['username'];
$password = $_POST['password'];

// Уязвимый запрос
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $sql);
?>

Если злоумышленник введёт в поле username значение ' OR '1'='1, запрос вернёт всех пользователей, и вход будет выполнен без пароля.

Правильный код (использование подготовленных выражений)

<?php
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
?>

То же касается вывода данных в HTML. Всегда используйте htmlspecialchars() для экранирования специальных символов:

<?php
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
?>

2. Пренебрежение строгой типизацией

PHP — язык с динамической типизацией, и новички часто полагаются на автоматическое приведение типов. Это может приводить к неожиданным результатам, особенно при сравнениях.

Пример неочевидного поведения

<?php
$value = "100 apples";
if ($value == 100) {
    echo "Равно 100"; // Выведет "Равно 100"!
}
?>

Строка "100 apples" неявно приводится к числу 100, поэтому условие истинно. Используйте строгое сравнение (===) и строгую типизацию в современных проектах:

Рекомендации

  • Объявляйте declare(strict_types=1); в начале каждого файла.
  • Используйте строгое сравнение === и !== вместо == и !=.
  • Явно указывайте типы аргументов и возвращаемых значений функций.
<?php
declare(strict_types=1);

function calculateTotal(float $price, int $quantity): float {
    return $price * $quantity;
}
?>

3. Утечки памяти и неэффективная работа с ресурсами

Новички часто забывают закрывать файлы, соединения с БД или освобождать память после работы с большими данными. В PHP сборщик мусора работает автоматически, но это не значит, что можно игнорировать управление ресурсами.

Типичная ошибка: не закрытое соединение

<?php
$conn = new mysqli($host, $user, $pass, $db);
// ... много кода ...
// Забыли вызвать $conn->close();
?>

Правильный подход: использование try-finally или менеджеров ресурсов

<?php
$conn = new mysqli($host, $user, $pass, $db);
try {
    // работа с БД
} finally {
    $conn->close();
}
?>

Для работы с файлами используйте fopen()/fclose() в паре, а для больших массивов — unset() после использования. В современных версиях PHP можно применять генераторы (yield) для обработки больших наборов данных без загрузки всего в память.

4. Смешивание логики и представления

Классическая ошибка начинающих — писать HTML-код прямо внутри PHP-файлов, смешивая бизнес-логику с выводом. Это делает код нечитаемым, сложным для поддержки и тестирования.

Пример плохого кода

<?php
$users = getUsers();
echo "<table>";
foreach ($users as $user) {
    echo "<tr><td>" . $user['name'] . "</td></tr>";
}
echo "</table>";
?>

Рекомендации

  • Используйте шаблонизаторы (Twig, Blade) или хотя бы отделяйте PHP-логику от HTML.
  • Применяйте MVC-подход: модели для данных, контроллеры для логики, представления для вывода.
  • Избегайте echo внутри циклов для генерации разметки — лучше собирать данные в массив и передавать в шаблон.
<!-- Пример с использованием простого шаблона -->
<?php $users = getUsers(); ?>
<table>
    <?php foreach ($users as $user): ?>
        <tr><td><?= htmlspecialchars($user['name']) ?></td></tr>
    <?php endforeach; ?>
</table>

5. Игнорирование современных стандартов и инструментов

Многие новички пишут на PHP так, как учили 10 лет назад: используют mysql_* функции (устарели с PHP 7), не используют автозагрузку классов, не применяют PSR-стандарты и Composer. Это приводит к плохой архитектуре и проблемам с совместимостью.

Что делать вместо этого

  • Используйте PDO или mysqli (объектно-ориентированный стиль) вместо mysql_*.
  • Подключайте зависимости через Composer и используйте ав

Блоги

Рекомендаций по книгам