Вопросы по PHP: Junior — 8 вопросов с ответами 2026
S.
Sobes AI

Вопросы по PHP на собеседовании: Junior — часть 1/3 с разбором ответов

05.03.2026 | 4 мин чтения | 9 просмотров

Это часть 1 из 3. Часть 2: Middle → | Часть 3: Senior →

TL;DR: 8 вопросов, которые задают Junior PHP-разработчикам на собеседованиях. Для каждого — ответ с кодом, типичная ошибка кандидата и follow-up вопрос. По данным разборов собеседований на Хабре, Glassdoor и Reddit за 2024–2026.

Как пользоваться: Открой перед собеседованием → пройдись по каждому вопросу → попробуй ответить до того, как прочитаешь разбор → проверь follow-up. Если follow-up не вызывает затруднений — ты готов.

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

Серия из трёх частей: Junior (ты здесь), Middle и Senior. Каждая часть — самостоятельная, читай только свой уровень или пройди все три.

Содержание


1. Какие типы данных есть в PHP?

Интервьюер проверяет, знаешь ли ты систему типов — фундамент, без которого невозможно понять приведение типов и баги сравнений.

В PHP есть три категории типов:

Скалярные (4 штуки): int, float, string, bool

Составные (4 штуки): array, object, callable, iterable

Специальные (2 штуки): null, resource

Начиная с PHP 8.0 появились дополнительные типы для type hints: mixed, void, never (PHP 8.1), true, false, null как standalone типы (PHP 8.2).

// PHP 8.2+
function processInput(string|int $input): true {
    // обработка
    return true;
}

Типичная ошибка: Кандидат перечисляет типы, но не может объяснить, чем float отличается от int при делении, или путает resource с object.

Follow-up: Что вернёт gettype(1/2) и почему? (Ответ: double, потому что результат деления — число с плавающей точкой, а gettype() возвращает double вместо float по историческим причинам.)


2. Чем отличаются ==, === и <=>?

Один из самых частых вопросов на собеседованиях по PHP (по данным Хабра и Glassdoor). Проверяет понимание приведения типов — источника большинства неочевидных багов.

== (нестрогое сравнение) — сравнивает значения, приводя типы:

"5" == 5;    // true — строка приводится к числу
0 == "foo";  // PHP 7: true (строка → 0), PHP 8: false (изменено!)
"" == null;  // true

=== (строгое сравнение) — сравнивает и значение, и тип:

"5" === 5;   // false — разные типы
0 === false; // false

<=> (spaceship operator, PHP 7+) — возвращает -1, 0 или 1:

1 <=> 2;   // -1
2 <=> 2;   // 0
3 <=> 2;   // 1
// удобен для usort:
usort($users, fn($a, $b) => $a->age <=> $b->age);

Важно (PHP 8.0): изменено поведение == при сравнении числа со строкой. Теперь 0 == "foo" возвращает false — строка больше не приводится к 0. Это изменение касается только сравнений число ↔ нестроковая-числовая строка — остальное поведение == не изменилось.

Типичная ошибка: Кандидат не знает про изменение в PHP 8 или не может объяснить, зачем нужен <=>.

Follow-up: Что вернёт "0" == false в PHP 8? (Ответ: true"0" приводится к false, потому что это пустая строка в boolean-контексте.)


3. Как работают сессии в PHP?

Проверяет понимание HTTP-стейтлесности и серверного хранения состояния — критично для любого веб-разработчика.

Сессия — механизм сохранения данных пользователя между HTTP-запросами. Работает в 4 шага:

1. session_start() — PHP генерирует уникальный session_id (или берёт из cookie PHPSESSID).

2. Данные сохраняются в суперглобальный массив $_SESSION.

3. При завершении скрипта PHP сериализует $_SESSION и записывает в хранилище (по умолчанию — файл в /tmp/sess_{id}).

4. При следующем запросе cookie PHPSESSID отправляется на сервер, PHP десериализует файл обратно в $_SESSION.

session_start();
$_SESSION['user_id'] = 42;
// На следующем запросе:
echo $_SESSION['user_id']; // 42

Типичная ошибка: Кандидат говорит «сессии хранятся в cookie» — это не так. В cookie хранится только session_id, а сами данные — на сервере.

Follow-up: Какие альтернативные хранилища для сессий бывают? (Redis, Memcached, база данных — через session_set_save_handler() или настройку session.save_handler.)


Базовые вопросы позади. Дальше — ООП, которое составляет основу большинства PHP-собеседований на уровне Junior.


4. Назовите основные принципы ООП

Спрашивают практически на каждом PHP-собеседовании (по разборам на Хабре — в 80%+ интервью). Интервьюер хочет не определения, а понимание, зачем эти принципы нужны.

Четыре принципа:

Инкапсуляция — объединение данных и методов в одном объекте + контроль доступа. Не «скрытие данных», а защита инвариантов.

class BankAccount {
    private float $balance = 0;

    public function deposit(float $amount): void {
        if ($amount <= 0) {
            throw new InvalidArgumentException('Сумма должна быть положительной');
        }
        $this->balance += $amount;
    }

    public function getBalance(): float {
        return $this->balance;
    }
}

Наследование — создание нового класса на основе существующего. В PHP — одиночное наследование (extends).

Полиморфизм — один интерфейс, разные реализации. В PHP реализуется через интерфейсы и абстрактные классы.

interface NotificationChannel {
    public function send(string $message): void;
}

class EmailChannel implements NotificationChannel {
    public function send(string $message): void { /* email */ }
}

class SmsChannel implements NotificationChannel {
    public function send(string $message): void { /* sms */ }
}

// Полиморфизм: один тип, разное поведение
function notify(NotificationChannel $channel, string $msg): void {
    $channel->send($msg);
}

Абстракция — выделение значимых характеристик объекта, игнорируя несущественные.

Типичная ошибка: Кандидат заучивает определения, но не может привести пример из реального проекта, где полиморфизм решает конкретную задачу.

Follow-up: Приведите пример, где наследование — плохой выбор и лучше использовать композицию.


5. Чем abstract class отличается от interface?

Один из самых стабильных вопросов для Junior (встречается в большинстве списков на Хабре и Glassdoor). Проверяет, умеет ли кандидат проектировать, а не только кодить.

Interface — контракт: «что объект умеет делать». Все методы по умолчанию публичные, нет состояния. Класс может реализовать несколько интерфейсов.

Abstract class — частичная реализация: «что объект собой представляет». Может содержать свойства, конструктор, реализованные методы. Класс может наследовать только один абстрактный класс.

// Interface — контракт поведения
interface Cacheable {
    public function getCacheKey(): string;
    public function getCacheTTL(): int;
}

// Abstract class — базовая реализация
abstract class BaseRepository {
    public function __construct(
        protected PDO $db
    ) {}

    abstract protected function getTableName(): string;

    public function findById(int $id): ?array {
        $table = $this->getTableName();
        $stmt = $this->db->prepare("SELECT * FROM {$table} WHERE id = ?");
        $stmt->execute([$id]);
        return $stmt->fetch() ?: null;
    }
}

Начиная с PHP 8.0 интерфейсы могут содержать константы, а с PHP 8.2 — константы в интерфейсах можно типизировать.

Типичная ошибка: Кандидат говорит «интерфейс — это абстрактный класс без реализации». Это упрощение, которое не объясняет ключевое различие: множественная реализация vs одиночное наследование.

Follow-up: Когда стоит использовать abstract class вместо interface? (Когда есть общая логика, которую надо переиспользовать в наследниках, и/или нужно общее состояние.)


6. Что такое traits и зачем они нужны?

Проверяет знание PHP-специфичного механизма. Часто спрашивают как follow-up к вопросу об ООП, по отзывам с Хабра за 2024–2026.

Traits — механизм горизонтального переиспользования кода. PHP не поддерживает множественное наследование классов, traits решают эту проблему.

trait Timestampable {
    public function touchCreatedAt(): void {
        $this->created_at = new DateTimeImmutable();
    }

    public function touchUpdatedAt(): void {
        $this->updated_at = new DateTimeImmutable();
    }
}

trait SoftDeletable {
    public function softDelete(): void {
        $this->deleted_at = new DateTimeImmutable();
    }

    public function isDeleted(): bool {
        return $this->deleted_at !== null;
    }
}

class Post {
    use Timestampable, SoftDeletable;

    public ?DateTimeImmutable $created_at = null;
    public ?DateTimeImmutable $updated_at = null;
    public ?DateTimeImmutable $deleted_at = null;
}

Если два traits содержат метод с одинаковым именем — будет fatal error. Решается через insteadof и as:

class MyClass {
    use TraitA, TraitB {
        TraitA::hello insteadof TraitB;
        TraitB::hello as helloFromB;
    }
}

Типичная ошибка: Кандидат не знает, что делать при конфликте имён методов в traits.

Follow-up: Можно ли в trait использовать abstract методы? (Да — класс, использующий trait, обязан реализовать эти методы.)


Мы разобрали ООП-базу. Последние два вопроса — про модификаторы доступа и замыкания. Их задают реже, но если зададут — незнание сразу снизит впечатление.


7. Модификаторы доступа: public, protected, private

Проверяет понимание инкапсуляции на практике, а не в теории.

public — доступен отовсюду: из класса, наследников, внешнего кода.

protected — доступен из класса и его наследников, но не из внешнего кода.

private — доступен только внутри класса, где объявлен. Наследники не имеют доступа.

class User {
    public string $name;
    protected string $email;
    private string $passwordHash;

    public function __construct(string $name, string $email, string $password) {
        $this->name = $name;
        $this->email = $email;
        $this->passwordHash = password_hash($password, PASSWORD_BCRYPT);
    }

    public function verifyPassword(string $password): bool {
        return password_verify($password, $this->passwordHash);
    }
}

class Admin extends User {
    public function getEmail(): string {
        return $this->email;      // OK — protected
        // return $this->passwordHash; // Error — private
    }
}

С PHP 8.1 появились readonly свойства — можно задать значение один раз:

// PHP 8.1+
class Product {
    public function __construct(
        public readonly string $name,
        public readonly float $price,
    ) {}
}

$p = new Product('PHP Book', 29.99);
$p->name = 'Other'; // Error: Cannot modify readonly property

Типичная ошибка: Кандидат путает protected и private, или не знает про constructor promotion (сокращённое объявление свойств в конструкторе, PHP 8.0).

Follow-up: Что такое constructor promotion и как он связан с модификаторами доступа?


8. Что такое замыкания (Closures) в PHP?

Проверяет понимание функционального стиля в PHP — всё чаще встречается в реальном коде, особенно в Laravel (по отзывам на Glassdoor за 2024–2026).

Замыкание (Closure) — анонимная функция, которая может захватывать переменные из окружающей области видимости через use:

$multiplier = 3;

$multiply = function (int $x) use ($multiplier): int {
    return $x * $multiplier;
};

echo $multiply(5); // 15

Важно: по умолчанию переменные захватываются по значению. Для захвата по ссылке используется &:

$counter = 0;
$increment = function () use (&$counter) {
    $counter++;
};

$increment();
$increment();
echo $counter; // 2

С PHP 7.4 появились стрелочные функции (arrow functions), которые автоматически захватывают переменные по значению:

$multiplier = 3;
$multiply = fn(int $x): int => $x * $multiplier;
echo $multiply(5); // 15

Стрелочные функции:

  • автоматически захватывают внешние переменные (без use)
  • содержат только одно выражение (нет {})
  • всегда возвращают результат выражения

Типичная ошибка: Кандидат не понимает разницу между захватом по значению и по ссылке, или не знает про arrow functions.

Follow-up: Чем замыкания в PHP отличаются от замыканий в JavaScript? (В JS переменные захватываются по ссылке автоматически. В PHP нужен явный use, и по умолчанию — по значению.)


Итого Junior: 8 вопросов. Фокус — типы данных, сравнения, сессии, ООП-база, traits, замыкания. Если уверенно отвечаешь на follow-up — ты готов к Junior-собеседованию.

Как готовиться

  • Типы и сравнения — прогони в голове таблицу приведения типов PHP 8. Помни про изменение 0 == "foo".
  • ООП — не заучивай определения. Напиши маленький проект, где используешь interface, abstract class и trait вместе.
  • Сессии — подними локальный PHP-сервер, открой файл сессии в /tmp и посмотри, что там хранится. Практика > теория.
  • Замыкания — потренируйся с array_map, array_filter, usort — там замыкания используются постоянно.

Как попробовать Sobes AI

Sobes AI — ассистент, который помогает на реальных технических собеседованиях в реальном времени.

  1. Зайди на sobesai.app
  2. Скачай и установи приложение
  3. Запусти во время подготовки — задавай вопросы из этой статьи
  4. Sobes AI подскажет ответ, если забудешь, и поможет сформулировать мысль
  5. На реальном собесе — работает как невидимый помощник

Это часть 1 из 3. Часть 2: Middle → | Часть 3: Senior →

Готовитесь к собеседованию?

Sobes AI слушает вопросы интервьюера и генерирует ответы в реальном времени.

Скачать Sobes AI