Библиотека собеса по PHP | вопросы с собеседований
الذهاب إلى القناة على Telegram
Вопросы с собеседований по PHP и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/9f3affba Для обратной связи: @proglibrary_feeedback_bot
إظهار المزيد3 150
المشتركون
لا توجد بيانات24 ساعات
-37 أيام
-430 أيام
أرشيف المشاركات
Коротко расскажите об истории PHP. Что появлялось в каждой версии?
PHP 1.0 (1995): Ранняя версия PHP, созданная Расмусом Лердорфом. Она представляла собой набор скриптов для отслеживания посещений его онлайн-резюме.
PHP 2.0 (1996): Внедрение синтаксиса, похожего на Perl, и добавление поддержки для работы с базами данных.
PHP 3.0 (1998): Полная переработка языка. Добавление поддержки объектно-ориентированного программирования (ООП) и формальное определение языка.
PHP 4.0 (2000): Значительные улучшения производительности и добавление новых возможностей, таких как суперглобальные массивы ($_GET, $_POST) и поддержка для расширений.
PHP 5.0 (2004): Основной момент — введение поддержки ООП с использованием классов и объектов. Добавление механизма обработки ошибок Exception.
PHP 5.3 (2009): Введение пространств имен, замыкания (closures) и поддержка late static binding.
PHP 5.4 (2012): Включение трейтов (traits), короткого синтаксиса для массивов, и улучшения в производительности.
PHP 5.6 (2014): Поддержка переменных переменных, использование оператора ** в качестве оператора возврата.
PHP 7.0 (2015): Значительное увеличение производительности, введение строгой типизации (scalar type declarations и return type declarations), оператора косвенной ссылки (null coalescing operator), и другие улучшения.
PHP 7.4 (2019): Добавление выражений соединения (arrow functions), поддержка spread-оператора для массивов, а также улучшения в синтаксисе и производительности.
PHP 8.0 (2020): Множество новых возможностей, таких как JIT-компиляция для улучшения производительности, добавление строгой типизации для свойств классов, сопоставление шаблонов (match expression), и другие синтаксические улучшения.
❓Как долго может работать ваше приложение на PHP?
Чувствуете ограниченность PHP в долгосрочной перспективе?
9 июля в 20:00 мск узнайте, как ваш PHP-код может работать дольше простого HTTP-запроса, обрабатывая данные для интеграции с партнерами или реагируя на события системы в реальном времени.
🔮На вебинаре вы узнаете:
- какие классы задач могут решать долгоживущие приложения на PHP;
- какие инструменты и средства доступны для реализации этих задач;
- как правильно организовать работу приложений на PHP, чтобы избежать проблем с памятью;
- когда стоит рассматривать расширение стека и использовать другие языки программирования.
Спикер Александр Пряхин — технический руководитель юнита в Авито и опытный преподаватель.
🎁Регистрируйтесь на урок и получите подарок участника чек-лист «SOLID и типичные ошибки на собеседованиях»: https://meetup.otus.ru/php-lesson-09-07-2024?utm_source=telegram&utm_medium=cpm&utm_campaign=php&utm_content=lesson_09-07-2024_usp-universal_php__no-headline_aida_long_banner_lesson-banner_violet_standart&utm_term=php_interview_lib
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru Erid 2VtzqvG3kFT
Как использовать переменные окружения в Laravel?
Laravel позволяет определять переменные окружения для вашего приложения, которые можно использовать для хранения конфиденциальной информации или конфигурационных данных, которые должны быть разными в зависимости от окружения (например, разработка, staging, production)
В этом примере мы определили переменную окружения под названием APP_NAME в файле .env. Затем мы можем получить эту переменную в нашем коде с помощью функции env.
+1
Что такое простая фабрика?
Простая фабрика (Simple Factory) — это порождающий шаблон проектирования, который предоставляет интерфейс для создания объектов в зависимости от переданного типа или параметра. В контексте PHP, простая фабрика может быть использована для создания экземпляров классов без явного указания конкретного класса в коде.
Простая фабрика обычно содержит метод, который принимает параметр (например, строку или число), определяющий тип создаваемого объекта, и затем возвращает экземпляр соответствующего класса. Это упрощает процесс создания объектов и позволяет легко изменять создаваемый тип объекта без изменения кода, где объект используется.
Для чего используется Symfony Event Dispatcher?
Компонент Symfony Event Dispatcher используется для управления и обработки событий в приложении Symfony. Он обеспечивает способ разъединения различных частей приложения, что позволяет сделать код более модульным и поддерживаемым. Вот для чего он используется:
1. Разъединение компонентов: Event Dispatcher позволяет различным компонентам или сервисам в приложении взаимодействовать друг с другом, не будучи жестко связаными. Это означает, что одна часть приложения может вызвать событие, а другие части могут прослушивать это событие и реагировать на него, не зная друг о друге.
2. Обработка событий: Он предоставляет способ определения событий и регистрации слушателей событий. Когда событие создается (dispatch), все зарегистрированные слушатели этого события уведомляются и могут выполнить свою логику. Это полезно для реализации хуков или точек расширения в приложении.
3. Модульность и повторное использование: Используя события, вы можете сделать ваш код более модульным и повторно используемым. Разные части вашего приложения могут подписываться на события и реагировать на них, что упрощает добавление или удаление функционала без изменения основной логики.
4. Расширяемость: Event Dispatcher позволяет легко расширять приложение. Сторонние пакеты или компоненты могут подключаться к событиям вашего приложения и добавлять или изменять поведение без необходимости изменять существующую кодовую базу.
5. Асинхронная обработка: События могут использоваться для запуска асинхронной обработки. Например, после регистрации пользователя может быть вызвано событие, которое запускает отправку приветственного письма или логирование активности, что может обрабатываться асинхронно слушателями.
Ключевые концепции
🔸Событие: Сообщение или сигнал, указывающий на то, что что-то произошло. Оно содержит информацию о событии и может использоваться для передачи данных слушателям.
🔸Event Dispatcher: Сервис, отвечающий за создание событий и уведомление всех зарегистрированных слушателей.
🔸Слушатель событий: Функция или метод, который выполняется в ответ на конкретное событие.
🔸 Слушатели регистрируются в Event Dispatcher.
🔸Подписчик на события: Класс, который регистрирует несколько слушателей для разных событий. Он реализует интерфейс EventSubscriberInterface и определяет, какие события его интересуют и соответствующие методы для вызова.
Как работает session в РНР, где хранится, как инициализируется?
В PHP, сессия — это механизм, который позволяет сохранять данные о состоянии пользователя между разными запросами на сервере.
Сессия инициализируется следующим образом:
Сначала нужно вызвать функцию session_start(), которая инициализирует или возобновляет уже существующую сессию для текущего пользователя. Если сессия уже инициализирована, функция просто возобновляет ее.
После вызова session_start(), PHP создает уникальный идентификатор сессии (называемый session ID), который может быть сохранен в виде cookie на стороне клиента или передан через URL (если отключены куки). ID сессии используется для связи данных сессии между разными запросами.
Данные сессии хранятся на сервере. По умолчанию, PHP сохраняет данные сессии во временной директории на сервере. Местоположение директории можно настроить в php.ini с помощью параметра session.save_path. Каждая сессия имеет свой собственный файл, который называется session file.
В файле сессии хранятся данные, которые могут быть доступны пока сессия открыта. Эти данные могут быть сохранены в массиве $_SESSION, который доступен на протяжении всей сессии и содержит данные, заданные разработчиком.
Каков жизненный цикл запроса в laravel?
Жизненный цикл запроса в Laravel представляет собой последовательность этапов, через которые проходит HTTP-запрос, поступающий в приложение, до того момента, когда генерируется HTTP-ответ. Этот процесс включает в себя несколько шагов:
Инициализация (Bootstrap):
Запрос поступает на веб-сервер (например, Nginx или Apache), который перенаправляет его на index.php файл в корне Laravel приложения.
index.php файл загружает автозагрузчик Composer и инициализирует приложение, вызывая файл bootstrap/app.php.
Создание объекта приложения:
В bootstrap/app.php создается объект приложения, экземпляр класса Illuminate\Foundation\Application.
Конфигурация приложения загружается, а также подключаются различные сервис-провайдеры.
Загрузка сервис-провайдеров:
Сервис-провайдеры, указанные в config/app.php, регистрируются и запускаются.
Эти провайдеры настраивают различные аспекты приложения, такие как маршрутизация, базы данных, очереди и многое другое.
Обработка Middleware:
Laravel начинает обработку глобальных middleware, которые определены в файле app/Http/Kernel.php.
Эти middleware могут обрабатывать запросы до и после их обработки контроллерами, занимаясь такими задачами, как аутентификация, сессии и управление CORS.
Маршрутизация:
Запрос передается в маршрутизатор, который определяет, какой контроллер и метод должны обработать запрос, основываясь на URI и HTTP-методе.
Маршрутизация может быть определена в файлах routes/web.php, routes/api.php и других файлах маршрутов.
Обработка контроллером:
Маршрутизатор вызывает соответствующий метод контроллера.
Контроллер может взаимодействовать с моделями, сервисами и другими компонентами для обработки бизнес-логики запроса.
Генерация ответа:
Контроллер возвращает ответ, который может быть представлением (view), JSON-данными или другим типом ответа.
Этот ответ оборачивается в объект Illuminate\Http\Response.
Обработка завершающих Middleware:
Перед отправкой клиенту, ответ проходит через завершающие middleware (например, для управления сессиями или кешем).
Отправка ответа клиенту:
Обработанный ответ отправляется веб-серверу, который передает его обратно клиенту (например, браузеру).
Завершение запроса:
Любые завершающие операции, такие как закрытие соединений с базой данных или очистка сессий, выполняются перед окончанием жизненного цикла запроса.
Что подразумевается под понятием «триггер» в SQL?
Триггер в SQL — это предопределенный SQL-код, который автоматически выполняется (или «срабатывает») в ответ на определенные события в таблице или представлении базы данных. Триггеры могут быть использованы для автоматизации выполнения определенных действий при вставке, обновлении или удалении данных в таблице. Они предоставляют способ добавления бизнес-логики к базе данных.
Примеры событий, на которые могут реагировать триггеры:
AFTER INSERT (После вставки данных): Триггер срабатывает после вставки новой записи в таблицу.
AFTER UPDATE (После обновления данных): Триггер срабатывает после обновления существующей записи в таблице.
AFTER DELETE (После удаления данных): Триггер срабатывает после удаления записи из таблицы.
BEFORE INSERT (Перед вставкой данных): Триггер срабатывает перед вставкой новой записи в таблицу. Он может использоваться, чтобы модифицировать данные перед их вставкой.
BEFORE UPDATE (Перед обновлением данных): Триггер срабатывает перед обновлением существующей записи в таблице. Он может использоваться для проверки или модификации данных перед обновлением.
BEFORE DELETE (Перед удалением данных): Триггер срабатывает перед удалением записи из таблицы. Он может использоваться для проверки или сохранения данных перед удалением.
Что такое sensitive данные? Как хранятся в базе? Как отражаются в логах?
Sensitive данные (чувствительные данные) — это информация, которая является приватной, конфиденциальной или важной для безопасности организации или пользователя. К таким данным относятся, например, пароли, номера кредитных карт, персональные идентификационные номера и т.д.
Хранение sensitive данных в базе данных требует особых мер безопасности, чтобы предотвратить несанкционированный доступ. Важной практикой является хеширование паролей. При регистрации пользователя пароль хешируется — процесс преобразования пароля в непонятный для чтения вид. Затем хеш сохраняется в базе данных. При входе в систему, введенный пароль также хешируется, и соответствующий хеш сравнивается с сохраненным в базе данных.
Sensitive данные не должны непосредственно отражаться в логах. Вместо этого должна быть сохранена информация о том, что операция на sensitive данных была выполнена. Например, вместо того, чтобы сохранять сам пароль в логах, можно сохранить запись вроде «пользователь X изменил свой пароль». Это делается для предотвращения утечки конфиденциальной информации в случае несанкционированного доступа к логам.
Что нового в РНР 8?
1. Just-in-Time компиляция (JIT): В PHP 8 была добавлена возможность JIT компиляции, что может улучшить производительность вашего приложения. JIT-компиляция позволяет выполнять оптимизацию кода на лету.
2. Улучшенная типизация: В PHP 8 была добавлена более строгая типизация, включая поддержку статического анализа типов. Теперь вы можете определить ожидаемые типы аргументов функций и возвращаемые значения.
3. Атрибуты: PHP 8 вводит новую концепцию атрибутов, позволяющих применять метаданные к классам, методам и свойствам. Атрибуты потенциально полезны для разработчиков фреймворков и библиотек, чтобы добавить дополнительную информацию о коде.
4. Отлов исключений: PHP 8 добавляет возможность отлавливать несколько исключений в одном операторе catch. Теперь вы можете указать несколько типов исключений через вертикальную черту, например: catch (Exception1 | Exception2 $e).
5. Nullsafe оператор: В PHP 8 был добавлен новый оператор «?->», который облегчает работу с объектами, которые могут быть null. Этот оператор позволяет безопасно и удобно обращаться к свойствам и методам объектов, проверяя наличие значения null.
6. Много других улучшений: PHP 8 содержит еще множество других улучшений, таких как улучшения в ядре, новые функции, оптимизации и исправления ошибок. Все нововведения можно увидеть тут
В чем разница между Serializer и Normalizer в Symfony?
В Symfony сериализаторы и нормализаторы используются для обработки преобразования данных, но они выполняют разные функции и работают на разных уровнях абстракции.
Сериализатор (Serializer)
Сериализатор отвечает за преобразование сложных структур данных (таких как объекты и массивы) в определённый формат (например, JSON, XML или CSV) и обратно. Компонент Serializer в Symfony предоставляет унифицированный способ выполнения этого процесса.
Основные задачи сериализатора:
Сериализация: Преобразование структур данных PHP (объекты, массивы) в строковой формат (JSON, XML и т.д.).
Десериализация: Преобразование строкового формата (JSON, XML и т.д.) обратно в структуры данных PHP.
Например, если у вас есть объект, и вы хотите получить его представление в формате JSON, вы будете использовать сериализатор.
Нормализатор (Normalizer)
Нормализатор — это более детализированное понятие, которое занимается преобразованием между различными представлениями данных в процессе сериализации. Нормализаторы используются сериализатором для обработки преобразования конкретных типов данных.
Основные задачи нормализатора:
Нормализация: Преобразование объекта в нормализованный массив.
Денормализация: Преобразование нормализованного массива обратно в объект.
Нормализаторы фокусируются на разложении и восстановлении объектов и массивов без непосредственного взаимодействия с конечным форматом, таким как JSON или XML. Они обрабатывают промежуточный этап преобразования данных в ассоциативный массив, который сериализатор затем может преобразовать в требуемый формат.
Как вы используете макросы response для упрощения ответов API в Laravel?
Laravel предоставляет функцию, называемую макросами ответов, которая позволяет определять пользовательские форматы ответов, которые могут быть повторно использованы в вашем приложении. Макросы ответов могут упростить процесс создания ответов API, инкапсулируя общие форматы ответов в многократно используемый метод.
В этом примере мы определяем пользовательский формат ответа с помощью метода макроса на фасаде Response. Пользовательский формат ответа возвращает ответ в формате JSON с ключом состояния и необязательным ключом данных.
Затем мы используем пользовательский формат ответа в UserController, вызывая response()->api() и передавая данные, которые мы хотим вернуть.
Используя макросы ответов, мы можем упростить процесс создания ответов API и избежать дублирования кода в нашем приложении.
Сравнение значений переменных в РНР и подводные камни? Приведение типов. Что изменилось в PHP 8 в этом контексте?
В PHP, сравнение значений переменных может быть подвержено некоторым особенностям из-за приведения типов. Вот несколько важных вещей, которые следует учитывать при сравнении значений переменных в PHP:
1️⃣Неявное приведение типов: PHP может неявно приводить значения переменных к определенному типу при выполнении операций. Например, при сравнении числа и строки, PHP попытается привести строку к числу.
2️⃣Типизация сравнения: Оператор == выполняет нестрогое сравнение значений с приведением типов, в то время как оператор === выполняет строгое сравнение без приведения типов. Строгое сравнение учитывает и тип данных и значение.
3️⃣Знаки сравнения: При использовании операторов сравнения (<, <=, >, >=), PHP также может производить неявное приведение типов.
Изменения в PHP 8:
В PHP 8 был добавлен новый оператор match, который выполняет строгое сравнение без приведения типов. Это позволяет писать более четкий и предсказуемый код.
Чем характеризуется эффективность кэширования?
Эффективность кэширования в PHP, как и в других языках программирования, характеризуется рядом параметров и аспектов, которые определяют, насколько хорошо кэширование улучшает производительность и уменьшает нагрузку на сервер. Основные из них включают:
Скорость доступа:
Время извлечения данных из кэша. Чем быстрее кэш-система может вернуть данные, тем эффективнее она работает. Например, чтение данных из оперативной памяти (RAM) быстрее, чем чтение с диска.
Время записи данных в кэш. Быстрая запись также важна, чтобы не создавать дополнительные задержки.
Процент попаданий (cache hit ratio):
Cache Hit Rate: Процент запросов, которые нашли данные в кэше, по сравнению с общим количеством запросов. Высокий процент попаданий означает, что кэширование работает эффективно, поскольку большинство запросов обрабатываются быстро.
Cache Miss Rate: Процент запросов, которые не нашли данные в кэше, и система была вынуждена обращаться к первоисточнику данных (например, к базе данных).
Экономия ресурсов:
Уменьшение нагрузки на базу данных. Чем меньше запросов к базе данных, тем меньше ее загрузка и тем быстрее она может обслуживать другие запросы.
Уменьшение потребления CPU. Кэширование уменьшает количество операций, требующих интенсивных вычислений.
Объем кэша (cache size):
Достаточное количество памяти для хранения часто запрашиваемых данных. Недостаток места может привести к удалению старых данных, что снижает вероятность попаданий.
Оптимальное управление памятью: баланс между количеством кэшированных данных и использованием системных ресурсов.
Сложность управления кэшем:
Легкость внедрения и использования кэширования в приложении.
Простота настройки и конфигурирования параметров кэша.
Наличие механизмов для автоматического обновления и очистки кэша.
Согласованность данных (cache consistency):
Актуальность данных в кэше по сравнению с первоисточником. Механизмы инвалидации кэша (устаревания данных) должны быть настроены правильно, чтобы предотвратить использование устаревшей информации.
Обеспечение согласованности данных при изменении исходных данных.
Обработка ошибок и отказоустойчивость:
Как кэш-система обрабатывает ошибки и сбои.
Наличие резервных механизмов на случай недоступности кэша.
С помощью какой технологии написаны файлы конфигурации маршрутизации Symfony?
Конфигурация маршрутизации определяет действие, которое должно выполняться для каждого входящего URL.
Файлы конфигурации маршрутизации в Symfony написаны с использованием технологий YAML, XML и PHP. app/config/routing.yml — это файл конфигурации маршрутизации по умолчанию в Symfony.
В PHP 8 для настройки маршрутов используйте родные атрибуты, а в PHP 7 вместо них используйте аннотации, предоставляемые библиотекой Doctrine Annotations.
Зачем нужно ключевое слово final?
Ключевое слово «final» в PHP используется для обозначения, что класс, метод или свойство не может быть изменен или унаследован в дочерних классах.
Если класс объявлен как final, то он не может быть унаследован, и не может быть основой для других классов.
Если метод объявлен как final, то он не может быть переопределен (перезаписан) в дочерних классах.
Если свойство объявлено как final, то его значение уже не может быть изменено, и оно становится константой.
Как использовать конструктор запросов(query builder) для выполнения сложных запросов в Laravel?
Laravel предоставляет конструктор запросов, который позволяет строить SQL-запросы более бегло и читабельно, чем при написании исходного SQL. Конструктор запросов предоставляет ряд методов для построения запросов, включая select, where, join и orderBy.
В этом примере мы используем конструктор запросов, чтобы выбрать имя и номер телефона всех пользователей старше 25 лет, упорядоченные по имени. Мы соединяем таблицу contacts с таблицей users с помощью метода join и фильтруем результаты с помощью метода where.
Затем мы используем метод orderBy для сортировки результатов, а метод get — для получения результатов в виде коллекции.
Индексы в SQL для PHP-разработчиков
Индексы в базах данных считаются "волшебной палочкой" для решения многих проблем при разработке веб-приложений. Впрочем, опытные программисты знают, что из этой палочки в любой момент может вылететь "Авада Кедавра".
Чтобы научиться осознанно пользоваться индексами в SQL и ускорить свои приложения, присоединяйтесь к открытому уроку 26 июня в 20:00!
На уроке ты:
1. Разберёшься, что такое индексы и как они работают в PostgreSQL и MySQL.
2. Научишься грамотно проектировать индексы под свои данные и запросы.
3. Узнаешь о неочевидных особенностях индексов, которые могут всё сломать, и как их избежать.
Твой гид в мир быстрых баз данных — Дмитрий Кириллов, соучредитель и технический директор 1С-Старт, опытный разработчик.
Регистрируйтесь прямо сейчас, чтобы попасть на открытый урок: https://otus.ru/lessons/razrabotchik-php/?utm_source=telegram&utm_medium=cpm&utm_campaign=php&utm_content=lesson_26-06-2024_usp-universal_php__no-headline_aida_long_banner_no-banner-hl_blue_standart&utm_term=php_interview_lib#event-4436
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru Erid 2VtzqwSKzRVЧто такое type hinting, как работает, зачем нужен?
Type hinting в PHP — это возможность указывать ожидаемые или допустимые типы данных для параметров функций и функций-обратного вызова (callback). Он используется для определения типов аргументов функций и возвращаемых значений.
Type hinting выполняется при помощи объявления типа данных перед именем параметра функции или функции-обратного вызова.
В данном случае мы указываем, что параметры $a и $b должны быть целочисленного типа (int), а функция должна возвращать тоже целочисленное значение. Если будет передан несоответствующий тип данных, то PHP выдаст ошибку.
Type hinting в PHP имеет следующие преимущества и цели:
1. Увеличение надежности и безопасности кода: Type hinting позволяет контролировать типы данных, которые принимаются и возвращаются функциями, что может помочь предотвратить ошибки типизации и некорректное использование функций.
2. Улучшение понимания кода: Type hinting делает код более читаемым и понятным, особенно при работе в команде. Видя ожидаемые типы данных в объявлениях функций, другие разработчики легко могут понять, какие данные ожидаются для правильного использования функции.
3. Интеграция со средами разработки: Многие среды разработки, такие как PhpStorm, могут использовать информацию о типах данных для предоставления подсказок и автодополнения, что упрощает разработку и ускоряет процесс написания кода.
Однако, следует отметить, что type hinting в PHP не является строгой типизацией. Если передать аргумент, не соответствующий указанному типу, PHP будет пытаться выполнить приведение типов, что может привести к непредсказуемому поведению программы.
Что такое gap locks в MySQL?
Gap locks в MySQL — это блокировки, применяемые на диапазоне значений индексов таблицы, но не на конкретную запись. Они используются для решения проблем с возможными фантомными чтениями и уровнем изоляции транзакций.
Когда выполняется операция SELECT с условием по диапазону значений, MySQL устанавливает gap lock на промежуток (gap) между найденными итемами или между первым и последним итемами в результате выборки. Gap lock блокирует вставку или обновление других записей, которые попадают в этот промежуток, и предотвращает получение непоследовательных данных другими транзакциями.
Gap locks обеспечивают последовательность данных при выполнении поисковых запросов с условиями по диапазону значений в многопользовательской среде. Они помогают предотвратить возможные конфликты между транзакциями и гарантируют консистентность данных.
Однако, стоит отметить, что использование gap locks может увеличить вероятность блокировки и снизить производительность в высоконагруженных средах. Поэтому, при разработке приложений на PHP с использованием MySQL, важно тщательно оценить необходимость использования gap locks и продумать стратегию обработки блокировок для обеспечения оптимальной производительности и надежности системы.
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
