Библиотека собеса по PHP | вопросы с собеседований
3.06K subscribers
226 photos
8 videos
192 links
Вопросы с собеседований по PHP и ответы на них.

По рекламе: @tproger_sales_bot

Учиться у нас: clc.to/5JWKxA

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
❓ Почему переименование параметра может сломать вызовы с именованными аргументами?

Ответ: Потому что с PHP 8 имя параметра используется при связывании именованного аргумента с параметром функции.

Допустим, есть функция findUser(int $userId), а клиент вызывает findUser(userId: 42). Если переименовать параметр в $id, позиционный вызов findUser(42) продолжит работать. Но прежний именованный вызов завершится ошибкой Unknown named parameter $userId, если функция не принимает этот аргумент через вариативный параметр.

Порядок и тип параметра при этом могли вообще не измениться. Ломается именно обращение по старому имени.

Это касается и переопределения методов: язык может разрешать другие имена параметров в реализации, но именованный вызов будет зависеть от фактически выбранного метода.

Поэтому имена параметров публичного API стоит учитывать при оценке обратной совместимости, а не считать их исключительно внутренней деталью.

Подробнее в документации PHP

🐸 Библиотека собеса по PHP
Please open Telegram to view this post
VIEW IN TELEGRAM
❓ Почему ключи 1 и строка «1» могут перезаписать друг друга в массиве?

Ответ: Потому что строка с корректной десятичной записью целого числа преобразуется в целочисленный ключ массива, если число помещается в int.

Для ключей 1 и '1' получится один и тот же ключ. Поэтому после присваиваний $data[1] = 'first' и $data['1'] = 'second' в массиве останется одна запись со значением 'second'.

Но не любая числовая строка ведёт себя так. Например, '01' останется строковым ключом из-за ведущего нуля, а '+1' — из-за знака плюс. Они могут существовать отдельно от целочисленного ключа 1.

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

Если нужно различать такие значения, можно явно кодировать ключи с префиксом, например 'int:1' и 'string:1'. Обычный PHP-массив сам по себе различие между ключами 1 и '1' не сохранит.

Подробнее в документации PHP

🐸 Библиотека собеса по PHP
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3🌚1
Переименовывает ли as метод трейта или добавляет второе имя?

Ответ: Добавляет второе имя. Исходный метод при этом остаётся доступным. Через as также можно изменить видимость метода, но сам по себе этот оператор не разрешает конфликт двух одноимённых методов из разных трейтов. Для выбора реализации используют insteadof, а для дополнительного имени — as. Эти операции можно сочетать, чтобы сохранить обе реализации под разными именами.

Документация: конфликты и псевдонимы методов трейтов

Основа вопроса: Hennadii Alforov о вопросах, которые он задаёт PHP-разработчикам.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Копируется ли строка на 100 МБ при передаче в функцию по значению?

Ответ: Обычно полная копия сразу не создаётся. PHP использует разделение данных с подсчётом ссылок и механизм copy-on-write. Пока функция только читает строку, несколько переменных могут использовать одни данные. Когда требуется изменить разделяемую строку, создаётся отдельная копия. Поэтому передача по значению не означает немедленного удвоения памяти. Но конкретный расход зависит от операций внутри функции и устройства строки.

Документация: управление памятью и copy-on-write

Источник вопроса: Hennadii Alforov, раздел PHP itself.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Чем static-замыкание отличается от обычного при работе с $this?

Ответ: Обычное замыкание, созданное в контексте объекта, автоматически получает привязку к нему через $this. Пока замыкание живёт, эта привязка может удерживать объект в памяти. У static-замыкания автоматической привязки нет, и использовать $this внутри него нельзя. Это полезно, если функция не должна зависеть от экземпляра. Но захват объекта через use всё равно может создать сильную ссылку — слово static этому не мешает.

Документация: анонимные и статические анонимные функции

Основа вопроса: Вопросы Hennadii Alforov о замыканиях и внешнем контексте.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Можно ли объявить private-метод в интерфейсе PHP?

Ответ: Нет. Методы интерфейса должны быть публичными. Интерфейс задаёт контракт, доступный вызывающему коду, а приватный метод является внутренней деталью реализации. Если нескольким классам нужна общая закрытая реализация, её можно разместить в подходящем трейте или базовом классе. Но объявить такой метод приватным членом интерфейса нельзя.

Документация: интерфейсы объектов

Источник вопроса: Hennadii Alforov, раздел PHP itself.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Может ли class_exists запустить автозагрузку?

Ответ: Да. По умолчанию второй аргумент $autoload равен true. Если класс ещё не загружен, PHP может вызвать зарегистрированные автозагрузчики. Поэтому такая проверка способна выполнить код и загрузить файлы. Если нужно узнать только о наличии уже объявленного класса, передайте false вторым аргументом. Сам объект при этом не создаётся: загрузка определения класса и создание экземпляра — разные действия.

Документация: class_exists

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Можно ли подставить имя таблицы через параметр PDO-запроса?

Ответ: Нет. Параметр представляет отдельное значение, например строку или число. Он не заменяет имя таблицы, столбца, ключевое слово или произвольный фрагмент SQL. Поэтому конструкция вида SELECT * FROM :table не решает задачу динамического выбора таблицы. Для идентификаторов используйте заранее разрешённый список вариантов и подходящие правила их оформления для вашей СУБД. Значения условий по-прежнему передавайте параметрами.

Документация: PDO::prepare

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Чем persist отличается от flush в Doctrine?

Ответ: persist сообщает EntityManager о новой сущности и включает её в отслеживание. Сам по себе этот вызов не означает немедленный INSERT. Метод flush синхронизирует накопленные изменения с базой данных: создаёт нужные SQL-запросы для отслеживаемых сущностей. При этом flush не равен безусловному завершению любой внешней транзакции — её границы зависят от того, как организована работа с EntityManager и соединением.

Документация: работа с объектами Doctrine

Основа вопроса: Вопросы Hennadii Alforov о Doctrine и Unit of Work.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Когда выбрать интерфейс, а когда — абстрактный класс?

Ответ: Интерфейс подходит для общего контракта между разными реализациями. Класс может реализовать несколько интерфейсов. Абстрактный класс нужен, когда участникам одной иерархии требуется общая реализация или состояние. Но наследоваться можно только от одного класса. Не стоит создавать базовый класс лишь ради пары общих методов: иногда проще выделить отдельный объект. В PHP 8.4 интерфейсы также могут задавать требования к свойствам — это не делает их хранилищем состояния экземпляра.

Документация: интерфейсы • Документация: абстрактные классы

Источник вопроса: Hennadii Alforov, раздел PHP itself.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🔴 Собес на PHP-разработчика с экс-лидом из Bumble в субботу в 15:00

7 ноября (в эту субботу!) в 15:00 МСК приходи онлайн на открытое собеседование. Посмотришь, как проходит настоящее интервью на Middle PHP-разработчика.

Как это будет:

📂 Глеб Виноградов, Staff Software Engineer в Ad Tyres International, ex-Lead в Bumble, проведёт собес. У Глеба больше 11 лет в разработке. В Bumble он 4 года писал бэкенд для приложений Bumble и Badoo;

📂 Глеб задаст реальные вопросы с технических секций и прокомментирует ответы;

📂 В конце можно будет задать ему любой вопрос.


Участие бесплатное. Эфир проходит в рамках менторской программы ШОРТКАТ для разработчиков, которые хотят сменить работу, повысить грейд и зарплату или прокачать навыки.

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_php_bot

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 Почему self:: и static:: могут вызвать разные реализации метода?

Ответ: self:: обращается к классу, в котором написан метод. static:: использует класс, с которым связан текущий статический вызов: это механизм позднего статического связывания.

Если метод базового класса вызывает self::name(), он выберет реализацию из базового класса. При static::name() вызов через наследника сможет попасть в переопределённый метод наследника.

Используйте static::, когда наследник должен участвовать в выборе реализации. self:: подходит для обращения к реализации класса, в котором расположен код.

Документация

Вопрос из подборки для собеседований

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 Как разрешить конфликт двух трейтов с одинаковым методом?

Ответ: Если класс подключает два трейта с одинаковым методом, PHP требует явно разрешить конфликт. Иначе определение класса завершится ошибкой.

В блоке use выбирают нужную реализацию через insteadof. Например, A::save insteadof B оставит метод save из трейта A.

Второй метод можно сохранить под дополнительным именем: B::save as saveFromB. Сам по себе as добавляет псевдоним и не решает конфликт исходных имён. Для выбора основного метода всё равно нужен insteadof.

Документация

Вопрос из подборки для собеседований

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM