Библиотека собеса по PHP | вопросы с собеседований
3.37K subscribers
142 photos
2 videos
72 links
Вопросы с собеседований по PHP и ответы на них.

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

Учиться у нас: https://proglib.io/w/9f3affba

Для обратной связи: @proglibrary_feeedback_bot
加入频道
🔥 Конкурс: 30 000 ₽ за самую смешную IT-новость

Напоминаем о конкурсе «Библиотеки программиста»: напишите самую смешную версию реальной новости про технологии.

👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.

🎁 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе

🏆 Как будем оценивать:
Мы выложим новости всех участников в одном из наших телеграм-каналов. Те новости, которые наберут больше всего охвата, войдут в шорт-лист. Из шорт-листа подписчики и жюри выберут победителя.

📅 Сроки: прием новостей до 11 мая включительно

Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8

Осталась неделя — ждем ваших новостей!
Что означает сложность алгоритма?

Сложность алгоритма представляет собой меру его эффективности и определяет количество ресурсов, таких как время и память, необходимых для его выполнения.

Существуют два основных типа сложности алгоритма: временная сложность и пространственная сложность.

Временная сложность алгоритма оценивает время, необходимое для его выполнения, в зависимости от размера входных данных. Обычно время выполнения алгоритма измеряется в тактах процессора или в секундах. Примеры временной сложности включают константную сложность O(1) (выполнение за постоянное время), линейную сложность O(n) (выполнение занимает время, пропорциональное размеру входных данных) и квадратичную сложность O(n^2) (выполнение занимает время, пропорциональное квадрату размера входных данных).

Пространственная сложность алгоритма оценивает объем памяти, необходимый для его выполнения, в зависимости от размера входных данных. Обычно пространственная сложность измеряется в байтах. Примеры пространственной сложности включают константную сложность O(1) (не зависит от размера входных данных), линейную сложность O(n) (потребляет память, пропорционально размеру входных данных) и квадратичную сложность O(n^2) (потребляет память, пропорционально квадрату размера входных данных).
Что такое идемпотентность?

Идемпотентность — это свойство операции, которое означает, что повторное ее выполнение не приводит к изменению состояния системы после первого выполнения. В контексте веб-разработки и использования HTTP методов, идемпотентность означает, что повторный запрос с одним и тем же набором параметров не изменит состояние сервера.

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

Вот несколько примеров идемпотентных операций:

1. Чтение данных: Операция получения данных из базы данных с помощью SELECT является идемпотентной, потому что повторное выполнение запроса не изменит состояние базы данных.

2. Удаление записи: Операция DELETE является идемпотентной, поскольку повторное выполнение запроса на удаление записи не приведет к ошибке и не изменит состояние базы данных, так как запись уже удалена.

3. Обновление записи: Если обновление записи происходит на основе идентификатора записи и одинаковые значения обновляются несколько раз, то запрос UPDATE будет идемпотентным.
Как работает lazy loading и можно ли его реализовать в PHP?

Lazy loading (отложенная загрузка) — это паттерн проектирования, при котором инициализация объекта или загрузка ресурса откладывается до момента, когда он действительно потребуется. Это помогает оптимизировать использование памяти и повысить производительность, особенно при работе с тяжёлыми объектами или данными.

⚙️ Как работает lazy loading
Вместо немедленной загрузки всех зависимостей при создании объекта, lazy loading позволяет отложить эту операцию до первого обращения к нужному свойству или методу. Это особенно полезно, когда:
Загрузка ресурсоёмких данных (например, из базы данных) может быть не нужна в каждом случае.
Необходимо сократить время отклика приложения.
Важно снизить потребление памяти, особенно при работе с большим количеством объектов.

🛠️ Реализация lazy loading в PHP
В PHP существует несколько подходов к реализации отложенной загрузки:

1. Ленивая инициализация (Lazy Initialization)
Значение свойства инициализируется только при первом обращении к нему. Это достигается проверкой, и если значение ещё не установлено, оно загружается и сохраняется для последующих обращений.
2. Виртуальный прокси (Virtual Proxy)
Создаётся объект-заместитель с тем же интерфейсом, что и реальный объект. При первом вызове метода прокси инициализирует реальный объект и делегирует ему вызов.
3. Призрачный объект (Ghost Object)
Объект создаётся в частично инициализированном состоянии, содержащем только идентификатор или минимальные данные. Полная инициализация происходит при первом обращении к дополнительным данным.
4. Хранитель значения (Value Holder)
Специальный объект, который управляет загрузкой значения по требованию. При обращении к значению он проверяет, загружено ли оно, и при необходимости выполняет загрузку.
5. Использование магических методов __get() и __isset()
В PHP можно переопределить магические методы __get() и __isset() для отложенной загрузки свойств объекта. При обращении к неинициализированному свойству __get() может выполнить необходимую загрузку и вернуть значение.

6. Встроенные механизмы в PHP 8.4
Начиная с PHP 8.4, появились встроенные механизмы для создания ленивых объектов с помощью методов ReflectionClass::newLazyGhost() и ReflectionClass::newLazyProxy(). Эти методы позволяют создавать объекты, которые инициализируются только при первом обращении к их свойствам или методам.

Преимущества использования lazy loading
Экономия ресурсов: Загрузка данных происходит только при необходимости, что снижает потребление памяти и ресурсов процессора.
Повышение производительности: Сокращается время инициализации объектов и загрузки страницы или приложения.
Улучшение масштабируемости: Приложение может обрабатывать большее количество объектов без значительного увеличения потребления ресурсов.

⚠️ Возможные недостатки
Сложность отладки: Ошибки могут проявляться только при обращении к отложенно загруженным данным, что усложняет их обнаружение.
Проблемы с последовательностью загрузки: В случае взаимных зависимостей между объектами может возникнуть необходимость в дополнительной логике для предотвращения циклических вызовов.
Увеличение количества запросов: При частом обращении к отложенно загружаемым данным может увеличиться количество запросов к базе данных или другим ресурсам.
Таким образом, lazy loading — это эффективный инструмент для оптимизации ресурсов и повышения производительности PHP-приложений, особенно при работе с большими объёмами данных или сложными структурами объектов. Однако его использование требует внимательного подхода к проектированию архитектуры приложения и учёта возможных сложностей.
Открытый вебинар «Локализация текстов в Symfony» в OTUS

🗓 15 мая, 20:00 МСК · онлайн · бесплатно
👤 Спикер — Михаил Каморин, Tech Lead Avito, 5 лет на Symfony

Symfony уверенно решает задачу мультиязычности — но что, если переводы живут в БД, а не в yaml-файлах? На вебинаре разберём базовый пример, как «подружить» symfony/translation с динамическими строками — без глубокого погружения во все тонкости компонента.

Что разберём
• Стандартная локализация статических текстов: настройка, plural-формы, fallback-языки.
• Подход к динамическим переводам в БД: таблицы, базовый Doctrine-маппинг.
• Практический пример: сохраним и извлечём строки, посмотрим метрики в Profiler.

Кому полезно
— Middle/Senior PHP-разработчикам, архитекторам и тимлидам, которые строят мульти-язычные сервисы или ищут нетривиальные модели хранения.

Формат — 60 минут концентрированной практики + Q&A без воды.

🔗 Регистрация

Слоты ограничены; участие бесплатное.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Как вы используете пагинацию в Laravel?

Laravel предоставляет простой способ постраничной обработки записей базы данных с помощью метода paginate.

В этом примере мы используем метод paginate для получения коллекции пользователей и разбивки результатов на страницы по 10 записей в каждой. Затем мы можем выполнить итерацию по пагинированной коллекции с помощью цикла foreach.

Чтобы отобразить ссылки на пагинацию в представлении, мы можем использовать метод links для пагинационной коллекции.
Что такое антипатерны? Приведите несколько примеров

Антипатерны (англ. antipatterns) — это плохие практики в программировании, дизайне и разработке, которые могут привести к проблемам, сложности в сопровождении кода, и общему ухудшению качества программного продукта.

1. Analytical paralysis
Аналитический паралич — считается классическим организационным антипаттерном. Его суть заключается в чрезмерном анализировании ситуации при планировании, так что решение или действие не предпринимаются, по сути парализуя разработку. Зачастую это случается в тех случаях, когда цель состоит в достижении совершенства и полной завершенности периода анализа. Этот антипаттерн характеризуется хождением по кругу (такой себе замкнутый цикл), пересмотром и созданием детальных моделей, что в свою очередь мешает рабочему процессу.

К примеру, вы пытаетесь предугадать вещи уровня: а что если вдруг пользователь захочет создать список сотрудников на основе четвертых и пятых букв их имени, с включением в список проектов, которым они уделили больше всего рабочих часов между Новым Годом и Восьмым марта за четыре предыдущих года? По сути это переизбыток анализа.

2. Spaghetti code
Спагетти-код — это антипаттерн, описывающий часть кода, которая является плохо структурированной, запутанной и трудной для понимания, содержащей много всяких переходов, каких как: оборачивание исключений, условий, циклов.

3.Magic numbers
Магическое числа — это антипаттерн, который затрагивает разнородные константы и переменные в программе без пояснения их цели, смысла. То есть, как правило нет адекватного имени или на крайний случай, комментария, поясняющего, что и зачем. Также как и спагетти код, является одним из наиболее распространённых антипаттернов.

Человек, который не является автором данного кода, с трудом может или вовсе не может объяснить, что это и как оно работает (да и сам автор со временем не сможет). В итоге при изменении этого числа или его удалении код магически перестает работать вовсе.
Какой overhead у persistent соединений в PDO?

Использование постоянных соединений в PDO (через PDO::ATTR_PERSISTENT => true) может снизить накладные расходы на установку соединений с базой данных, особенно если соединение требует значительных ресурсов. Однако этот подход имеет свои особенности и потенциальные недостатки.

⚙️ Как работают постоянные соединения в PDO
При использовании постоянных соединений PHP не закрывает соединение с базой данных после завершения скрипта. Вместо этого соединение сохраняется и может быть повторно использовано другим скриптом, если он использует те же параметры подключения. Это позволяет избежать затрат на установку нового соединения при каждом запросе, что может улучшить производительность приложения.

📈 Потенциальные преимущества
Снижение накладных расходов: Избегание повторной установки соединений может ускорить выполнение скриптов.
Повышение производительности: Особенно заметно при работе с удалёнными базами данных или при высокой нагрузке на сервер.

⚠️ Возможные недостатки
Ограничения на количество соединений: Каждый процесс может удерживать своё постоянное соединение, что может привести к превышению лимита соединений на сервере базы данных.
Состояние соединения: Если скрипт завершился с ошибкой или не освободил ресурсы (например, блокировки или транзакции), следующее использование этого соединения может столкнуться с проблемами.
Совместимость с драйверами: Некоторые драйверы, такие как ODBC, могут не поддерживать постоянные соединения должным образом, что может привести к нестабильной работе.

Рекомендации по использованию
Оцените необходимость: Используйте постоянные соединения, если установка соединения с базой данных является узким местом в производительности.
Мониторинг: Следите за количеством активных соединений и состоянием базы данных, чтобы избежать превышения лимитов и других проблем.
Очистка ресурсов: Убедитесь, что скрипты корректно завершают транзакции и освобождают ресурсы перед завершением работы.
Тестирование: Проведите нагрузочное тестирование с включёнными и отключёнными постоянными соединениями, чтобы определить оптимальный вариант для вашего приложения.
Таким образом, постоянные соединения в PDO могут быть полезны для повышения производительности, но требуют внимательного подхода и мониторинга для предотвращения потенциальных проблем.