ch
Feedback
Библиотека собеса по PHP | вопросы с собеседований

Библиотека собеса по PHP | вопросы с собеседований

前往频道在 Telegram

Вопросы с собеседований по PHP и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/9f3affba Для обратной связи: @proglibrary_feeedback_bot

显示更多
3 152
订阅者
+124 小时
-17
-430
吸引订阅者
六月 '26
六月 '26
+2
在0个频道中
五月 '26
+34
在2个频道中
Get PRO
四月 '26
+41
在2个频道中
Get PRO
三月 '26
+48
在2个频道中
Get PRO
二月 '26
+49
在1个频道中
Get PRO
一月 '26
+48
在1个频道中
Get PRO
十二月 '25
+28
在0个频道中
Get PRO
十一月 '25
+31
在0个频道中
Get PRO
十月 '25
+26
在0个频道中
Get PRO
九月 '25
+12
在0个频道中
Get PRO
八月 '25
+11
在2个频道中
Get PRO
七月 '25
+20
在0个频道中
Get PRO
六月 '25
+42
在1个频道中
Get PRO
五月 '25
+45
在0个频道中
Get PRO
四月 '25
+52
在1个频道中
Get PRO
三月 '25
+124
在52个频道中
Get PRO
二月 '25
+73
在31个频道中
Get PRO
一月 '25
+114
在35个频道中
Get PRO
十二月 '24
+94
在35个频道中
Get PRO
十一月 '24
+169
在37个频道中
Get PRO
十月 '24
+156
在35个频道中
Get PRO
九月 '24
+152
在35个频道中
Get PRO
八月 '24
+209
在35个频道中
Get PRO
七月 '24
+146
在35个频道中
Get PRO
六月 '24
+242
在30个频道中
Get PRO
五月 '24
+129
在35个频道中
Get PRO
四月 '24
+1 082
在36个频道中
Get PRO
三月 '24
+303
在30个频道中
Get PRO
二月 '24
+254
在32个频道中
Get PRO
一月 '24
+216
在25个频道中
Get PRO
十二月 '23
+102
在25个频道中
Get PRO
十一月 '23
+1 306
在4个频道中
日期
订阅者增长
提及
频道
03 六月+1
02 六月+1
01 六月0
频道帖子
Может ли абстрактный класс содержать частный(private) метод? Да, в абстрактном классе можно иметь частный метод. Этот частный метод будет отображаться ТОЛЬКО этому абстрактному классу. Это означает, что он должен будет использоваться каким-либо другим конкретным методом в абстрактном классе. Дочерние классы не смогут вызвать его напрямую.

2
💬 Обратная связь Текущий уровень сложности вопросов? 🔥 — Слишком просто, хочу сложнее 👍🏼 — В самый раз ❤️ — Иногда сложновато 😁 — Часто не понимаю
488
3
❓ Расскажите о паттерне Interpreter Interpreter — это поведенческий паттерн, который определяет грамматику простого языка и интерпретатор для его предложений. Простыми словами: вы описываете правила «мини-языка» в виде классов, и каждый класс умеет вычислить свою часть выражения. Как калькулятор, который разбирает «3 + 5 * 2». ▪️ Когда использовать — Есть простой язык или набор правил, которые нужно интерпретировать — Грамматика стабильна, но выражений — много ▪️ Минус Для сложных грамматик дерево классов разрастается и становится неуправляемым — лучше использовать парсер-генераторы (ANTLR).
598
4
До 31 мая можно забрать любой курс Proglib Academy со скидкой 40% Если давно хотели прокачаться в Python, ML, алгоритмах или
До 31 мая можно забрать любой курс Proglib Academy со скидкой 40% Если давно хотели прокачаться в Python, ML, алгоритмах или AI-агентах, сейчас самое время выбрать программу и начать обучение по сниженной цене. 🎁 Разработка AI-агентов — от 49.000 ₽ (вместо 69.000 ₽) Практический курс по разработке AI-агентов для автоматизации задач, работы и собственных проектов 🎁 Курс AgentOps — 129.000 ₽ (вместо 149.000 ₽) Для разработчиков и LLM-инженеров, которые хотят внедрять AI-логику в бэкенд и сохранять стабильность сервиса. 🎁 Математика для разработки AI-моделей — 23.990 ₽ (вместо 31.990 ₽) Практическая база по математике для анализа данных, ML и дальнейшего развития в AI. 🎁 Математика для Data Science — от 29.990 ₽ (вместо 39.990 ₽) Курс для тех, кто хочет решать задачи, которые дают на собеседованиях на позицию дата-сайентиста в бигтехе. 🎁 ML для старта в Data Science — 28.990 ₽ (вместо 38.990 ₽) Разберётесь в машинном обучении: от базовых понятий и линейных моделей до ансамблей, бустинга и рекомендательных систем. 🎁 Основы IT для непрограммистов — 16.990 ₽ (вместо 28.990 ₽) Курс для IT-рекрутеров, маркетологов, проджектов, продактов и всех, кто работает с IT, но не пишет код. 🎁 Архитектуры и шаблоны проектирования — 27.990 ₽ (вместо 37.900 ₽) Освоите основные паттерны проектирования и прокачаете навыки архитектора программного обеспечения. 🎁 Специалист по ИИ — 89.000 ₽ (вместо 113.900 ₽) Курс для тех, кто хочет получить профессию в сфере ИИ, собрать портфолио из 5 проектов и научиться разрабатывать сложных AI-агентов. 🎁 Алгоритмы и структуры данных — 33.990 ₽ (вместо 57.990 ₽) Подготовитесь к алгоритмическим собеседованиям, разберёте структуры данных и научитесь писать более эффективный код. 🎁 Программирование на языке Python — 27.990 ₽ (вместо 47.390 ₽) Освоите Python на практике: без сухой теории, с пошаговой прокачкой навыков и итоговым проектом в портфолио. 🙌 Выбирайте курс по ссылке, оставляйте заявку, и менеджер поможет подобрать программу под ваши цели — https://clc.to/SALE40
529
5
❓ Расскажите о паттерне Visitor Visitor — это поведенческий паттерн, который позволяет добавлять новые операции к объектам, не изменяя их классы. Простыми словами: налоговый инспектор (visitor) приходит в разные компании и выполняет проверку — компании не меняются, а новые виды проверок добавляются легко. ▪️ Когда использовать — Нужно выполнить операцию над группой разнородных объектов — Новые операции добавляются часто, а новые типы элементов — редко ▪️ Минус Visitor нужно обновлять при добавлении нового типа элемента — нарушается Open/Closed Principle для элементов.
495
6
❓ Расскажите о паттерне Memento Memento — это поведенческий паттерн, который позволяет сохранять и восстанавливать прежнее состояние объекта, не нарушая инкапсуляцию. Простыми словами: Ctrl+Z в любом редакторе — где-то хранится снимок предыдущего состояния, к которому можно откатиться. ▪️ Когда использовать — Нужна функция отмены/отката (undo) — Нужно сохранять контрольные точки состояния — Прямой доступ к полям объекта нарушил бы инкапсуляцию ▪️ Memento vs Command — Command: хранит действие и умеет его отменить — Memento: хранит полный снимок состояния ▪️ Минус Может потреблять много памяти, если состояние объекта большое и снимки создаются часто.
1 714
7
❓ Расскажите о паттерне Mediator Mediator — это поведенческий паттерн, который убирает прямые связи между компонентами, заставляя их общаться через посредника. Простыми словами: диспетчер в аэропорту — самолёты не переговариваются друг с другом, а общаются через башню управления. ▪️ Когда использовать — Компоненты слишком сильно связаны друг с другом — Хотите переиспользовать компоненты в других контекстах ▪️ Минус Медиатор может стать God Object, сконцентрировав слишком много логики.
586
8
❓ Расскажите о паттерне Iterator Iterator — это поведенческий паттерн, который даёт возможность последовательно обходить элементы коллекции, не раскрывая её внутреннее устройство. Простыми словами: вы проходите по элементам через «окошко» (hasNext / next), не зная — это массив, дерево или база данных за ним. ▪️ Когда использовать — Нужен единый способ обхода для разных структур данных — Хотите скрыть сложность обхода (дерево, граф, пагинация)
707
9
❓ Расскажите о паттерне Chain of Responsibility Chain of Responsibility — это поведенческий паттерн, который позволяет передавать запрос по цепочке обработчиков. Каждый обработчик решает: обработать запрос или передать дальше. Простыми словами: как эскалация тикета: L1 → L2 → L3 саппорт. Каждый уровень либо решает проблему, либо передаёт выше. ▪️ Когда использовать — Набор обработчиков и их порядок определяется динамически — Запрос должен быть обработан одним из нескольких объектов, но каким — неизвестно заранее ▪️ Минус Запрос может пройти всю цепочку и не быть обработанным; сложно отладить длинную цепочку.
713
10
💬 Обратная связь Последние посты все по единой теме паттернов. Удобно ли, если посты будут иногда такими едиными блоками? 🔥 — Удобно 👍🏼 — Без разницы 😁 — Скука смертная, хочется разнообразия
729
11
❓ Расскажите о паттерне State State — это поведенческий паттерн, который позволяет объекту менять своё поведение при изменении внутреннего состояния. Извне кажется, что объект сменил свой класс. Простыми словами: банкомат ведёт себя по-разному в зависимости от состояния: ожидание карты → ввод PIN → выбор операции. Одна и та же кнопка делает разные вещи. ▪️ Когда использовать — Объект ведёт себя по-разному в зависимости от состояния — Много if/switch по статусу — признак, что нужен State — Количество состояний может расти ▪️ State vs Strategy — Strategy: клиент выбирает алгоритм — State: объект сам переключает поведение при смене состояния ▪️ Минус Избыточен, если состояний всего 2–3 и переходы простые.
777
12
❓ Расскажите о паттерне Command Command — это поведенческий паттерн, который превращает запрос в отдельный объект, содержащий всю информацию о запросе. Простыми словами: вместо прямого вызова метода вы создаёте объект-команду, которую можно передать, поставить в очередь, отменить или повторить. ▪️ Когда использовать — Нужен undo/redo — Команды нужно ставить в очередь, логировать или выполнять отложенно — Хотите отделить объект, инициирующий операцию, от объекта, выполняющего её ▪️ Минус Усложняет код: каждая операция — отдельный класс.
811
13
❓ Расскажите о паттерне Observer Observer — это поведенческий паттерн, который создаёт механизм подписки, позволяя одним объектам следить за изменениями в других. Простыми словами: как подписка на Telegram-канал — когда выходит новый пост, все подписчики получают уведомление автоматически. ▪️ Когда использовать — Изменение одного объекта требует обновления других, и набор зависимых объектов заранее неизвестен — Хотите избежать жёсткой связи между компонентами ▪️ Минус Подписчики оповещаются в непредсказуемом порядке; утечки памяти, если забыть отписаться.
893
14
❓ Расскажите о паттерне Proxy Proxy — это структурный паттерн, который подставляет вместо реального объекта объект-заместитель, контролирующий доступ к оригиналу. Простыми словами: прокси выглядит как оригинал, но перед вызовом может проверить права, закэшировать результат или создать объект лениво. ▪️ Виды прокси — Protection Proxy — контроль доступа (Spring Security) — Caching Proxy — кэширование результатов — Lazy Proxy — отложенная инициализация (Hibernate lazy loading) — Remote Proxy — доступ к удалённому объекту (RMI) ▪️ Proxy vs Decorator — Proxy: контролирует жизненный цикл и доступ к объекту — Decorator: добавляет поведение, не контролируя доступ ▪️ Минус Увеличивает задержку отклика; усложняет отладку при нескольких слоях проксирования.
891
15
❓ Расскажите о паттерне Facade Facade — это структурный паттерн, который предоставляет простой интерфейс к сложной подсистеме, скрывая внутреннюю сложность. Простыми словами: один метод вместо десяти вызовов в разные сервисы. Пульт от телевизора — это фасад к электронике внутри. ▪️ Когда использовать — Подсистема сложная, а клиенту нужен простой вход — Хотите уменьшить связанность между слоями — Типичный пример: сервисный слой в Spring-приложении ▪️ Минус Фасад может стать God Object, если взять на себя слишком много логики.
862
16
💬 Обратная связь Как часто вы проходите собеседования? 🔥 — Сейчас активно ищу работу 👍🏼 — Раз в несколько месяцев ❤️ — Раз в полгода-год 😁 — Не прохожу, уже работаю/ещё учусь
833
17
✔️ PHP-тест: клон, который мутирует оригинал Пользователь нажал «Повторить заказ». Цены в его старом заказе изменились. 📦 Задание Фича: кнопка «Повторить заказ» в личном кабинете. Копирует предыдущий заказ, применяет промокод, создаёт новый черновик. Оригинал помечается флагом repeated для аналитики. Через неделю — тикет от бухгалтерии: суммы в старых заказах не сходятся с тем, что было при оплате. Проблема только у заказов, которые хотя бы раз «повторяли». Суммы занижены ровно на размер скидки по промокоду. // src/Order/Order.php class Order { public function __construct( private ?int $id, private int $userId, private array $items, private string $status, private bool $repeated = false, ) {} public function getId(): ?int { return $this->id; } public function getItems(): array { return $this->items; } public function getStatus(): string { return $this->status; } public function resetForRepeat(): void { $this->id = null; $this->status = 'draft'; $this->repeated = false; } public function markAsRepeated(): void { $this->repeated = true; } public function calculateTotal(): int { return array_sum(array_map( fn(OrderItem $i) => $i->getSubtotal(), $this->items )); } } // src/Order/OrderItem.php class OrderItem { public function __construct( private int $productId, private int $qty, private int $price, ) {} public function getProductId(): int { return $this->productId; } public function getQty(): int { return $this->qty; } public function getPrice(): int { return $this->price; } public function getSubtotal(): int { return $this->qty * $this->price; } public function applyDiscount(int $percent): void { $this->price = (int) round( $this->price * (1 - $percent / 100) ); } } // src/Order/RepeatOrderHandler.php class RepeatOrderHandler { public function __construct( private OrderRepository $orders, private PromoService $promo, ) {} public function handle(int $originalId, ?string $promoCode): Order { $original = $this->orders->findById($originalId); $copy = clone $original; $copy->resetForRepeat(); if ($promoCode !== null) { $discount = $this->promo->resolve($promoCode); foreach ($copy->getItems() as $item) { $item->applyDiscount($discount->percent); } } $this->orders->save($copy); $original->markAsRepeated(); $this->orders->save($original); return $copy; } } // src/Repository/OrderRepository.php class OrderRepository { public function __construct(private PDO $pdo) {} public function save(Order $order): void { if ($order->getId() === null) { $this->insert($order); } else { $this->update($order); } } private function update(Order $order): void { $this->pdo->prepare( 'UPDATE orders SET status = ?, repeated = ? WHERE id = ?' )->execute([$order->getStatus(), (int) $order->isRepeated(), $order->getId()]); $this->pdo->prepare('DELETE FROM order_items WHERE order_id = ?') ->execute([$order->getId()]); foreach ($order->getItems() as $item) { $this->pdo->prepare( 'INSERT INTO order_items (order_id, product_id, qty, price) VALUES (?, ?, ?, ?)' )->execute([$order->getId(), $item->getProductId(), $item->getQty(), $item->getPrice()]); } } } 🔹 Задачи — Объяснить, каким образом цены в оригинальном заказе оказались изменены в базе — Исправить код так, чтобы оригинал гарантированно не мутировал Ставьте → 🔥 если нравится формат. Если нет → 🌚 💬 Решения пишите в комменты под спойлер — сравним подходы.
2 156
18
❓ Расскажите о паттерне Decorator Decorator — это структурный паттерн, позволяющий на лету расширять поведение объекта, не изменяя его класс. Исходный объект помещается внутрь другого — декоратора, — который перехватывает вызовы и дополняет их нужной функциональностью. Принцип тот же, что у матрёшки: каждый новый слой добавляет что-то своё. ▪️ Когда использовать — Нужно добавить поведение объекту без наследования — Комбинации поведений непредсказуемы (логирование + кэш + метрики в любом порядке) — Классический пример в JDK: InputStream → BufferedInputStream → GZIPInputStream ▪️ Decorator vs наследование — Наследование: статическое, одно на класс — Decorator: динамическое, можно комбинировать ▪️ Минус Много мелких классов; отладка стека из нескольких обёрток может быть неудобной.
770
19
❓ Расскажите о паттерне Composite Composite — это структурный паттерн, который позволяет сгруппировать объекты в древовидную структуру и работать с ней так же, как с единичным объектом. Простыми словами: файл и папка с файлами обрабатываются одинаково — у обоих можно спросить размер, удалить, переместить. ▪️ Когда использовать — Данные образуют древовидную структуру (файловая система, меню, оргструктура) — Клиентский код должен одинаково работать с простыми и составными объектами ▪️ Минус Трудно ограничить типы компонентов внутри композита — приходится проверять в runtime.
1 376
20
🧑‍💻 Приглашаем на открытый урок курса «PHP-разработчик. Продвинутый уровень» 19 мая в 20:00 — Работа с очередями в Laravel:
🧑‍💻 Приглашаем на открытый урок курса «PHP-разработчик. Продвинутый уровень» 19 мая в 20:00 — Работа с очередями в Laravel: от настройки до решения типичных проблем Разберём, как очереди помогают ускорить приложение и вынести тяжёлые задачи в фон без потери стабильности. Обсудим настройку и обработку задач, типичные ошибки, повторы при сбоях, защиту от дублирования и мониторинг выполнения. Вы поймёте, как работают фоновые процессы в Laravel, научитесь правильно настраивать очереди и делать приложение быстрее и надёжнее. 🚀Открытый урок проходит в преддверии старта курса «PHP-разработчик. Продвинутый уровень» 19 мая в 20:00 МСК. Регистрация: https://clc.to/6HSSeg Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
596