Собеседование по PHP: с чего начать, чтобы не провалиться?
Вы отправили резюме, прошли короткое созвон с HR, и вот — приглашение на техническое собеседование. Сердце начинает биться чаще: «А что, если спросят про что-то, чего я не знаю?», «А если я забуду синтаксис?», «А если попросят написать код на доске?».
Спойлер: скорее всего, попросят. И это нормально. Собеседование по PHP — это не экзамен по билетам, а диалог. Но диалог, к которому нужно подготовиться. В этой статье мы разберём, что реально спрашивают на собеседованиях PHP-разработчиков в 2025 году, какие ошибки совершают 90% кандидатов, и как показать себя с лучшей стороны.
Что важно знать: структура подготовки
Чтобы подготовка к собеседованию PHP была системной, разбейте её на три блока:
- База языка: типы данных, массивы, функции, работа с файлами, сессии.
- ООП и архитектура: наследование, инкапсуляция, полиморфизм, трейты, интерфейсы.
- Инструменты и экосистема: Composer, PSR, фреймворки, тестирование, SQL.
Один из самых частых вопросов на собеседовании PHP junior — разница между == и ===. Кажется, что мелочь, но именно на таких мелочах сыпятся даже опытные разработчики.
Пример: сравнение с приведением типов
<?php
// Нестрогое сравнение
var_dump(0 == '0'); // true
var_dump(0 == false); // true
var_dump('' == false); // true
// Строгое сравнение
var_dump(0 === '0'); // false
var_dump(0 === false); // false
var_dump('' === false); // false
?>
Почему это важно? Потому что в реальных проектах нестрогое сравнение может привести к трудноуловимым багам. Например, при проверке наличия значения в массиве с помощью in_array() без третьего параметра true.
ООП в PHP: что спрашивают чаще всего
На собеседовании по PHP для middle и senior уровня вопросы по ООП — обязательны. Но и джуниорам стоит быть готовыми. Вот топ-3 темы:
1. Трейты vs Интерфейсы vs Абстрактные классы
Многие путают, когда использовать трейт, а когда — интерфейс. Запомните простое правило:
- Интерфейс — это контракт. Класс обязуется реализовать методы.
- Абстрактный класс — частичная реализация + контракт.
- Трейт — это просто набор методов, которые можно «вклеить» в любой класс.
<?php
interface LoggerInterface {
public function log(string $message): void;
}
abstract class AbstractLogger implements LoggerInterface {
protected string $prefix;
public function __construct(string $prefix) {
$this->prefix = $prefix;
}
abstract public function formatMessage(string $message): string;
}
trait TimestampTrait {
public function getTimestamp(): string {
return date('Y-m-d H:i:s');
}
}
class FileLogger extends AbstractLogger {
use TimestampTrait;
public function formatMessage(string $message): string {
return $this->getTimestamp() . ' [' . $this->prefix . '] ' . $message;
}
public function log(string $message): void {
file_put_contents('log.txt', $this->formatMessage($message) . PHP_EOL, FILE_APPEND);
}
}
?>
2. Принципы SOLID
Это не просто аббревиатура. Интервьюеры любят спрашивать: «Приведите пример нарушения принципа подстановки Лисков (LSP)». Самый наглядный пример — классический «квадрат наследует от прямоугольника».
<?php
// Нарушение LSP
class Rectangle {
public function __construct(protected int $width, protected int $height) {}
public function setWidth(int $width): void { $this->width = $width; }
public function setHeight(int $height): void { $this->height = $height; }
public function getArea(): int { return $this->width * $this->height; }
}
class Square extends Rectangle {
public function setWidth(int $width): void {
$this->width = $width;
$this->height = $width; // Ломает контракт!
}
public function setHeight(int $height): void {
$this->width = $height;
$this->height = $height; // Ломает контракт!
}
}
?>
Правильное решение — не наследовать Square от Rectangle, а создать общий интерфейс Shape.
Паттерны проектирования: must-have для собеседования
На собеседовании PHP-разработчика часто просят реализовать простой паттерн. Самые популярные: Singleton, Factory, Strategy, Observer.
Но будьте осторожны с Singleton. Его часто спрашивают, но в реальной разработке он считается антипаттерном из-за проблем с тестированием. Если вас спросят — покажите, что знаете, но упомяните недостатки.
Пример: простой Factory Method
<?php
interface PaymentGateway {
public function charge(float $amount): bool;
}
class StripeGateway implements PaymentGateway {
public function charge(float $amount): bool {
// логика Stripe
return true;
}
}
class PayPalGateway implements PaymentGateway {
public function charge(float $amount): bool {
// логика PayPal
return true;
}
}
class PaymentFactory {
public static function create(string $type): PaymentGateway {
return match($type) {
'stripe' => new StripeGateway(),
'paypal' => new PayPalGateway(),
default => throw new \InvalidArgumentException("Unknown gateway: $type"),
};
}
}
// Использование
$gateway = PaymentFactory::create('stripe');
$gateway->charge(100.50);
?>
Работа с базами данных: SQL и PDO
Без SQL никуда. Даже если вы пишете на PHP, базы данных — часть вашей работы. На собеседовании по PHP спросят:
- Разница между
INNER JOINиLEFT JOIN. - Что такое индексы и когда они нужны.
- Как избежать SQL-инъекций.
Последний пункт — критически важен. Покажите, что вы используете подготовленные запросы (prepared statements).
<?php
// НЕПРАВИЛЬНО: конкатенация строк
$sql = "SELECT * FROM users WHERE email = '" . $_GET['email'] . "'";
// ПРАВИЛЬНО: подготовленный запрос
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute(['email' => $_GET['email']]);
$user = $stmt->fetch();
?>
Стандарты PSR и Composer
Вопрос «Что такое PSR-4?» — один из самых частых на собеседовании PHP middle. PSR — это рекомендации PHP-FIG, которые делают код совместимым между разными библиотеками.
PS