Как пройти собеседование по PHP: топ вопросов и ответов

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

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

Начать курс

Как пройти собеседование по PHP: разбор топовых вопросов

Собеседование на позицию PHP-разработчика — это не только проверка синтаксиса, но и тест на понимание архитектуры, безопасности и современных стандартов (PSR). В этой статье мы собрали 10 ключевых вопросов, которые чаще всего задают на собеседованиях для Junior и Middle уровня. Каждый вопрос сопровождается пояснением, примером кода и типичными ловушками.

1. Чем отличается echo от print? А print_r от var_dump?

Это базовый вопрос, который проверяет знание встроенных функций вывода.

  • echo — языковая конструкция, не возвращает значение. Работает быстрее print.
  • print — тоже конструкция, но всегда возвращает 1. Можно использовать в выражениях.
  • print_r — выводит человеко-читаемую информацию о переменной (массивы, объекты). Возвращает строку, если второй параметр true.
  • var_dump — выводит тип и значение переменной, включая длину строки. Полезен для отладки.
<?php
$arr = ['a' => 1, 'b' => 2];
echo print_r($arr, true); // Возвращает строку, не выводит сразу
var_dump($arr);           // array(2) { ["a"]=> int(1) ["b"]=> int(2) }
?>

2. Что такое автозагрузка классов и как она работает с Composer?

Автозагрузка (autoloading) позволяет PHP подключать классы автоматически при первом обращении к ним, без явного require_once.

  • Раньше использовали функцию spl_autoload_register().
  • Сейчас стандарт де-факто — Composer и его автозагрузчик.
  • Composer поддерживает PSR-4 (пространства имён) и PSR-0 (устаревший).
// composer.json
{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

// После composer dump-autoload
// Файл src/User.php с namespace App;
$user = new \App\User(); // Автоматически загрузится

3. Разница между include, require, include_once и require_once

Вопрос на понимание работы с внешними файлами и обработки ошибок.

  • include — выдаёт Warning, если файл не найден, скрипт продолжает работу.
  • require — выдаёт Fatal Error, скрипт останавливается.
  • *_once — проверяет, был ли файл уже подключён ранее, и не подключает его повторно.

Ловушка: include в цикле может вызвать повторное подключение и ошибку переопределения функций, если не использовать include_once.

4. Как работает PDO и чем оно лучше mysql_* функций?

PDO (PHP Data Objects) — это интерфейс для работы с базами данных. Он обязателен к знанию для любого современного PHP-разработчика.

  • Поддерживает разные СУБД (MySQL, PostgreSQL, SQLite) — достаточно сменить DSN.
  • Использует подготовленные запросы (prepared statements), что защищает от SQL-инъекций.
  • Удобная работа с транзакциями и обработка ошибок через исключения.
<?php
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
$pdo = new PDO($dsn, 'user', 'pass', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
?>

5. Что такое магические методы в PHP? Приведите примеры

Магические методы начинаются с двойного подчёркивания (__) и вызываются автоматически при определённых действиях с объектом.

  • __construct() — вызывается при создании объекта.
  • __get() / __set() — срабатывают при чтении/записи недоступных свойств.
  • __call() / __callStatic() — для вызова несуществующих методов.
  • __toString() — определяет, как объект преобразуется в строку.
<?php
class User {
    private $data = [];

    public function __get($name) {
        return $this->data[$name] ?? null;
    }

    public function __set($name, $value) {
        $this->data[$name] = $value;
    }

    public function __toString() {
        return json_encode($this->data);
    }
}

$user = new User();
$user->name = 'Alice'; // Вызов __set
echo $user->name;      // Вызов __get
echo $user;            // Вызов __toString
?>

6. Типизация в PHP: строгая и нестрогая. Что такое declare(strict_types=1)?

По умолчанию PHP пытается автоматически преобразовывать типы (нестрогая типизация). Директива declare(strict_types=1) включает строгий режим для файла.

  • В строгом режиме передача строки в параметр int вызовет TypeError.
  • Действует только на вызовы функций внутри файла, где объявлена, а не на сам файл.
<?php
declare(strict_types=1);

function add(int $a, int $b): int {
    return $a + $b;
}

echo add(2, 3);     // 5
echo add('2', 3);   // Fatal error: Uncaught TypeError
?>

7. Разница между self, $this и parent в ООП

Блоги

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