Как пройти собеседование по 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
?>