Как пройти собеседование по PHP: топ вопросов от А до Я
Собеседование на позицию PHP-разработчика — это не просто проверка знания синтаксиса. Работодатели хотят видеть, как вы мыслите, как решаете проблемы и насколько глубоко понимаете экосистему языка. Чтобы помочь вам подготовиться, мы собрали топ вопросов по PHP от А до Я, разбив их на ключевые темы: от основ ООП до работы с базами данных и безопасности.
Эта статья — ваш чек-лист для успешного прохождения интервью. Изучите её, попрактикуйтесь с примерами кода, и вы будете чувствовать себя уверенно.
1. Основы PHP и ООП (Объектно-Ориентированное Программирование)
Начнём с фундамента. Без понимания ООП в современном PHP делать нечего. Интервьюеры часто задают вопросы, которые проверяют ваше понимание принципов.
Вопрос: Что такое инкапсуляция, наследование и полиморфизм?
Это "три кита" ООП. Умение объяснить их на примере — обязательный навык.
- Инкапсуляция — скрытие внутренней реализации объекта. Доступ к данным осуществляется через публичные методы (геттеры/сеттеры).
- Наследование — возможность создавать новый класс на основе существующего (родительского).
- Полиморфизм — способность объектов разных классов обрабатывать один и тот же метод по-своему.
<?php
// Пример инкапсуляции
class User {
private string $name;
public function setName(string $name): void {
$this->name = htmlspecialchars($name); // Защита от XSS
}
public function getName(): string {
return $this->name;
}
}
// Пример наследования и полиморфизма
abstract class Animal {
abstract public function makeSound(): string;
}
class Dog extends Animal {
public function makeSound(): string {
return "Гав!";
}
}
class Cat extends Animal {
public function makeSound(): string {
return "Мяу!";
}
}
$animals = [new Dog(), new Cat()];
foreach ($animals as $animal) {
echo $animal->makeSound() . " "; // Выведет: Гав! Мяу!
}
?>
Вопрос: В чем разница между интерфейсом и абстрактным классом?
Это классика. Интерфейс задаёт контракт (только сигнатуры методов), а абстрактный класс может содержать реализацию по умолчанию и свойства.
2. Работа с базами данных и SQL
PHP редко работает в отрыве от баз данных. Вопросы про MySQL и PDO — обязательная часть любого собеседования.
Вопрос: Почему стоит использовать PDO, а не mysqli?
PDO (PHP Data Objects) — это абстракция, которая позволяет легко переключаться между разными СУБД (MySQL, PostgreSQL, SQLite) без переписывания кода. Кроме того, PDO поддерживает именованные плейсхолдеры, что делает код чище.
<?php
// Пример безопасного запроса с PDO
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$pdo = new PDO($dsn, 'user', 'password');
$sql = "SELECT * FROM users WHERE email = :email";
$stmt = $pdo->prepare($sql);
$stmt->execute([':email' => 'test@example.com']);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
?>
Вопрос: Как защититься от SQL-инъекций?
Главный ответ: никогда не вставляйте пользовательские данные напрямую в SQL-запрос. Используйте подготовленные выражения (prepared statements) с плейсхолдерами. Это гарантирует, что данные будут экранированы автоматически.
3. Безопасность и лучшие практики
Безопасность — это то, что отличает Junior от Middle. Интервьюеры любят задавать вопросы на эту тему.
Вопрос: Какие типы атак наиболее распространены в веб-приложениях на PHP?
- XSS (Cross-Site Scripting) — внедрение скриптов. Защита: используйте
htmlspecialchars()илиstrip_tags()при выводе данных. - SQL Injection — внедрение SQL-кода. Защита: PDO и подготовленные выражения.
- CSRF (Cross-Site Request Forgery) — подделка межсайтовых запросов. Защита: использование CSRF-токенов в формах.
- File Upload Vulnerabilities — загрузка вредоносных файлов. Защита: проверка MIME-типа, ограничение расширений и хранение файлов вне корня веб-сервера.
Вопрос: Как правильно хэшировать пароли?
Никогда не используйте md5 или sha1 для паролей! Используйте password_hash() и password_verify(). Они автоматически используют алгоритм bcrypt (или argon2), что делает взлом практически невозможным.
<?php
// Хэширование пароля
$password = "user_password_123";
$hash = password_hash($password, PASSWORD_DEFAULT); // Использует bcrypt
// Проверка пароля
if (password_verify($password, $hash)) {
echo "Пароль верен!";
} else {
echo "Неверный пароль.";
}
?>
4. Фреймворки и современные возможности PHP
Знание современного PHP (версии 8.x) и популярных фреймворков — большой плюс.
Вопрос: Какие нововведения появились в PHP 8?
- JIT-компилятор (Just-In-Time) — значительное ускорение выполнения кода.
- Атрибуты (Attributes) — альтернатива аннотациям PHPDoc.
- Named Arguments — можно передавать аргументы по имени, не соблюдая порядок.
- Match Expression — более строгий аналог switch.
- Union Types — возможность указать несколько типов для параметра.
<?php
// Пример Named Arguments и Union Types в PHP 8
function createUser(string $name, int|string $age): void {
echo "Name: $name, Age: $age";
}