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

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

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

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
Что такое абстрактный класс и чем он отличается от интерфейса?

Абстрактный класс в PHP — это класс, на основе которого нельзя создать объект напрямую, а используется только в качестве базового для других классов. Он содержит одну или несколько абстрактных методов, которые должны быть реализованы в классах-наследниках. Абстрактные классы могут также иметь обычные методы с реализацией.

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

Основные отличия между абстрактным классом и интерфейсом в PHP:

1. Абстрактный класс может иметь переменные и реализацию методов, в то время как интерфейс не может.
2. Класс может наследовать только один абстрактный класс, но имплементировать несколько интерфейсов.
3. Класс, наследующий абстрактный класс, может переопределить его методы или добавить новые методы с реализацией. В случае интерфейса, класс должен реализовать все методы из интерфейса без изменений.
4. Абстрактный класс может содержать поля и методы с любым модификатором доступа, в то время как интерфейс может содержать только публичные методы.
Symfony — это фреймворк, основанный на конфигурации или соглашениях?

Symfony — это фреймворк, основанный на соглашениях. Документ Coding Standards иллюстрирует нормы кодирования для проектов Symfony, а также внутренних и сторонних пакетов. Он определяет стандарты кодирования и соглашения, используемые в ядре фреймворка, чтобы сделать его более единообразным и предсказуемым.
Что такое PSR?

PSR в контексте PHP означает «PHP Standards Recommendations» или «Рекомендации по стандартам PHP». PSR — это набор руководящих принципов и рекомендаций, разработанных PHP сообществом, для создания единообразия и согласованности в коде и проектах на PHP.

PSRы определяют стандарты для различных аспектов разработки PHP, таких как структура директорий проекта, автозагрузка классов, стандарты кодирования, интерфейсы HTTP, контейнеры зависимостей и т. д. Они предлагают рекомендации и лучшие практики для этих областей, чтобы обеспечить совместимость между различными библиотеками и фреймворками, а также простоту сопровождения и совместной разработки кода.

Одна из самых известных и широко используемых PSR-рекомендаций — это PSR-4, который определяет правила автозагрузки классов. Согласно PSR-4, классы должны быть организованы в файловой системе в соответствии с определенной структурой директорий, а классы должны иметь пространства имен, соответствующие их местоположению в файловой системе.

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

Подробнее про PSR на русском здесь
Как использовать события и слушателей в Laravel?

События и слушатели в Laravel позволяют следовать за циклом вашего приложения и реагировать на определенные действия или события использовать:

1. Определение событий: События — это простые PHP классы, которые хранятся в директории app/Events. Они сигнализируют о том, что что-то произошло в рамках кода.
2. Определение слушателей: Слушатели — это классы, которые обрабатывают события. Они хранятся в директории app/Listeners. Каждый слушатель отвечает за выполнение действия в ответ на событие.
3. Регистрация событий и слушателей: Вам нужно зарегистрировать ваши события и слушателей в EventServiceProvider. Это делается путем добавления их в массив $listen этого провайдера.
4. Вызов событий: Вы можете вызывать события с помощью вспомогательной функции event или метода dispatch самого события.
5. Обработка события: Когда событие вызывается, Laravel автоматически вызывает зарегистрированных слушателей для этого события.
Совет на 2025-й — будьте осторожнее с выбором работы.

IT-рынок штормит: массовые сокращения, заморозка найма, снижение зарплат. В такое время особенно важно отличать стоящие офферы от проходных.

Знакомо? Открываешь вакансию, а там: «Ищем middle-разработчика с опытом 10 лет, знанием 15 языков и готовностью работать за печеньки. Офис в Челябинске, релокация за ваш счет» 🤦‍♂️

Чтобы не тратить время на сотни сомнительных предложений, подпишитесь на IT Job Hub. Там мы отфильтровываем весь мусор и публикуем только избранные вакансии в стабильных компаниях:

— Зарплаты на уровне рынка, а не на уровне голодного студента
— Никаких «мы молодая и дружная семья» — только адекватные условия
— Проверенные работодатели, а не стартапы из сомнительных сфер

Вакансии удобно разбиты по тегам: #python #java #go #data #devops и по другим направлениям. Без воды и лишнего спама — только проверенные вакансии в знакомых компаниях.

Подписывайтесь, если не хотите упустить работу мечты → @proglib_jobs
Что такое DDD?

DDD, или Domain-Driven Design (Проектирование с учетом предметной области) — это методология разработки программного обеспечения, которая сосредотачивается на моделировании бизнес-процессов и бизнес-логики в предметной области приложения. Она была предложена Эриком Эвансом в его книге «Domain-Driven Design: Tackling Complexity in the Heart of Software» и предоставляет набор практик и шаблонов для разработки сложных систем.

Основные концепции DDD включают:

Предметная область (Domain):
Предметная область — это ключевой компонент DDD. Это область, на которую направлена разработка, и она описывает бизнес-процессы, правила и логику приложения.

Эксперты предметной области (Domain Experts):
Эксперты предметной области — это люди, обладающие экспертными знаниями в конкретной области бизнеса. В DDD активно взаимодействуют с разработчиками, помогая им понимать сложности предметной области.

Сущности (Entities) и Значения (Value Objects):
Сущности представляют объекты, имеющие уникальный идентификатор, который определяет их в предметной области. Значения — это объекты, описывающие характеристики, которые не имеют своего идентификатора и сравниваются по значению.

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

Репозитории (Repositories):
Репозитории предоставляют интерфейс для работы с агрегатами и предоставляют методы для поиска и сохранения данных в предметной области.

Сервисы приложения (Application Services) и Фабрики (Factories):
Сервисы приложения — это слой, предоставляющий операции, доступные извне приложения. Фабрики создают сложные объекты, облегчая их создание и инициализацию.
Объясните задачи, выполняемые контроллером, и определите правила для создания методов в контроллере в Symfony?

В Symfony контроллер является важной частью архитектуры MVC (Model-View-Controller). Он отвечает за обработку HTTP-запросов и возврат HTTP-ответов. Ниже мы рассмотрим задачи, выполняемые контроллером, и правила создания методов в нем:

Задачи, выполняемые контроллером Symfony:

1. Прием запросов: Контроллеры начинают работу с приема HTTP-запроса.
2. Выполнение логики приложения: Они содержат логику, которая определяет, что происходит при переходе по URL. Это может быть запрос к базе данных, обработка данных формы или вызов других сервисов.
3. Создание ответов: После обработки запроса контроллеры создают и возвращают объект Response. Этим ответом может быть HTML-страница, JSON, XML, загрузка файла, перенаправление, ошибка 404 или что-либо еще, что приложение должно вернуть клиенту.

Правила создания методов в контроллере Symfony:

✔️Соглашение об именовании: Методы внутри класса контроллера часто называют «действиями». По традиции имена методов заканчиваются на 'Action', хотя в последних версиях Symfony это не является обязательным.
✔️Возвращение ответов: Каждое действие должно возвращать объект Response. Если вы не возвращаете Response напрямую, то, скорее всего, вы используете вспомогательный метод, например $this->render(), который в конечном итоге возвращает Response.
✔️Доступ к сервисам: Контроллеры имеют доступ к контейнеру сервисов, что означает, что вы можете использовать инъекцию зависимостей для доступа к сервисам в ваших методах.
✔️Сопоставление маршрутов: Каждый метод контроллера должен быть сопоставлен с маршрутом. Это можно сделать с помощью аннотаций, YAML, XML или PHP-файлов. Аннотации — это распространенный способ определения маршрутов непосредственно над методами контроллера.
✔️Аргументы метода: Вы можете вводить аргументы в методы контроллера для автоматической инъекции сервисов или параметров, например Request $request или UserInterface $user.
✔️Лучшие практики: Следуйте правилу 5-10-20: определяйте не более 5 переменных, содержите не более 10 действий и включайте не более 20 строк кода в каждое действие.
Как использовать кэширование в Laravel?

Кэширование в Laravel — это мощная функция, которая может значительно улучшить производительность вашего веб-приложения за счет хранения часто используемых данных в кэше.

1. Конфигурация: Сначала убедитесь, что ваше приложение Laravel правильно настроено для кэширования. Файл конфигурации находится в config/cache.php, где вы можете указать драйвер кэша по умолчанию и другие параметры. Laravel поддерживает различные драйверы кэша, такие как file, database, redis, memcached и другие.

2. Хранение данных в кэше: Вы можете хранить данные в кэше, используя фасад Cache или вспомогательную функцию cache(). Например, чтобы сохранить значение в кэше на 10 минут, вы можете использовать:

Cache::put('key', 'value', 600);

3. Извлечение данных из кэша: Чтобы получить данные из кэша, вы можете использовать метод get:

$value = Cache::get('key');

// или используя вспомогательную функцию
$value = cache('key');

4. Проверка наличия данных: Перед извлечением данных вы можете проверить, существуют ли они в кэше:

Cache::has('key');

5. Удаление данных из кэша: Чтобы удалить данные из кэша, используйте метод forget:

Cache::forget('key');

6. Очистка всего кэша: Если вам нужно очистить весь кэш, вы можете использовать метод flush:

Cache::flush();
👉 Интенсив «Архитектуры и шаблоны проектирования» для middle и senior-разработчиков

Проверьте свои знания, ответив на 8 вопросов – https://proglib.io/w/ed691f3f

🧐 Кому подойдет?
Разработчикам, которые знают любой объектно-ориентированный язык программирования и хотят углубиться в архитектурные паттерны.

🎮 Как проходит обучение?
В течение всего интенсива вы будете создавать игру «Звездные войны» и применять ключевые архитектурные паттерны. В процессе изучите:
– Как строить гибкую архитектуру, которая не замедляет разработку
– Как применять IoC-контейнеры и писать модульные тесты
– Как использовать SOLID за пределами ООП
– Как внедрять CI/CD и снижать технический долг

👉 Подробная программа обучения

А по промокоду MIDDLE до 28 февраля вы получите дополнительную скидку на обучение
Please open Telegram to view this post
VIEW IN TELEGRAM
Какие магические методы вы знаете и как их применяют?

__construct(): Конструктор класса, вызывается при создании нового объекта класса.

__destruct(): Деструктор класса, вызывается при уничтожении объекта.

__call($name, $arguments): Вызывается, когда обращаются к неопределённому методу в контексте объекта.

__callStatic($name, $arguments): Аналогично __call, но для статических методов.

__get($name): Вызывается при чтении данных из недоступных свойств.

__set($name, $value): Вызывается при записи данных в недоступные свойства.

__isset($name): Вызывается при использовании isset() или empty() на недоступных свойствах.

__unset($name): Вызывается при использовании unset() на недоступном свойстве.

__sleep(): Вызывается при сериализации объекта.

__wakeup(): Вызывается при десериализации объекта.

__toString(): Метод для представления объекта в виде строки.

__invoke(): Вызывается при попытке вызвать объект как функцию.

__set_state($array): Вызывается для классов, экспортируемых функцией var_export().

__clone(): Вызывается при клонировании объекта.

__debugInfo(): Используется при выводе объекта функцией var_dump().
Что такое Redis?

Redis — это высокопроизводительная система управления базами данных и кэширования, которая используется для хранения данных в формате ключ-значение. Она является ключевым инструментом в мире веб-разработки и приложений больших данных.

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

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

Атомарные операции:
Redis поддерживает атомарные операции, что означает, что множество операций можно объединить в одну, гарантируя целостность данных. Например, увеличение значения ключа на определенную величину — это атомарная операция.

Поддержка различных структур данных:
Благодаря различным типам данных, Redis идеально подходит для различных сценариев использования, начиная от кэширования данных и заканчивая реализацией очередей сообщений и управлением счетчиками.

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

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

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

В общем, Redis — это мощный и гибкий инструмент, который позволяет разработчикам создавать быстрые и масштабируемые приложения, оптимизировать производительность и обеспечивать устойчивость данных.
Что такое планировщик задач в Laravel и как он используется?

В Laravel планировщик задач — это функция, которая позволяет управлять запланированными задачами на вашем сервере внутри вашего приложения Laravel. Он предоставляет чистый, плавный API для определения ваших запланированных задач простым и удобным способом.

Вот как вы можете использовать его:

Определение запланированных задач: Вы можете определить все свои запланированные задачи в методе schedule класса App\Console\Kernel.

Запуск планировщика задач: Чтобы запустить планировщик Laravel, вам нужно добавить следующую запись Cron на ваш сервер.

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Этот Cron будет вызывать команду планировщика Laravel каждую минуту для выполнения запланированных задач.

Помните, что будут выполняться только задачи, которые должны быть выполнены. Команда schedule:run будет проверять расписание задач и выполнять все задачи, которые должны быть выполнены.

Ограничения задач: Вы также можете добавить дополнительные ограничения к расписанию, такие как ->weekdays(), ->sundays(), ->at('13:00') и т.д.

Вывод задач: По умолчанию вывод запланированных задач будет направлен в /dev/null. Вы можете использовать методы sendOutputTo и appendOutputTo для записи или добавления вывода в определенный файл.
Что вы знаете о дескрипторах в Symfony?

В Symfony дескрипторы используются для преобразования объектов и связанной с ними метаданных в различные форматы вывода, такие как текст, XML или JSON. Дескрипторы особенно полезны для отображения информации в консольных командах, генерации документации API или предоставления метаданных в различных форматах для других целей.

Назначение и использование

Дескрипторы в Symfony помогают разработчикам представлять подробную информацию об объектах (например, о командах, маршрутах, сервисах, событиях и т. д.) в согласованном и структурированном виде. Это особенно полезно, когда нужно предоставить читаемый человеком вывод или данные, понятные для машин.

Распространенные случаи использования

✔️Консольные команды: Когда вы выполняете консольную команду Symfony с опцией --help, дескрипторы используются для форматирования и отображения текста справки по команде.
✔️Информация о маршрутизации: Дескрипторы могут использоваться для отображения информации о маршрутизации в различных форматах.
✔️Информация о сервисах: Они также могут описывать сервисы в контейнере сервисов.

Основные компоненты

DescriptorInterface: Этот интерфейс определяет контракт для дескрипторов. Любой дескриптор должен реализовать этот интерфейс и его метод describe.
AbstractDescriptor: Это абстрактный класс, который реализует некоторую общую логику для дескрипторов. Он помогает уменьшить дублирование кода среди различных реализаций дескрипторов.

Специфические дескрипторы: Symfony предоставляет несколько встроенных дескрипторов, таких как:

🟢TextDescriptor
🟢XmlDescriptor
🟢JsonDescriptor
🟢MarkdownDescriptor

Расширение дескрипторов

Если встроенные дескрипторы не удовлетворяют вашим потребностям, вы можете создать собственные дескрипторы, реализовав DescriptorInterface. Это позволит вам адаптировать вывод под ваши конкретные требования.
Что такое микросервисная архитектура?

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

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

Преимущества микросервисной архитектуры включают легкость поддержки и развертывания, возможность параллельной разработки и обновления, улучшенную масштабируемость и реактивность системы, а также лучшую изоляцию и отказоустойчивость приложения.
Что такое область запросов(query scope) в Laravel и как она используется?

Область запросов в Laravel — это способ инкапсуляции многократно используемой логики запросов в модели. Определяя области запросов, мы можем сделать наши модели более выразительными и удобными в работе. Области запросов — это, по сути, готовые запросы, которые можно применить в конструкторе запросов модели.

Чтобы определить область запросов в Laravel, мы создаем публичный метод в модели, который возвращает экземпляр конструктора запросов. Затем мы можем использовать эту область в запросе, вызвав метод на модели.
Офер от Сбера за один клик 💼

Мечтаешь работать в Сбере, теперь это проще, чем когда-либо!

💡 AI-интервью за 15 минут – и ты уже на шаг ближе к своей новой работе.

Как получить офер?

📌 Зарегистрируйся
📌 Пройди AI-интервью
📌 Получи обратную связь сразу же!

После прохождения твои ответы получат рекрутеры и свяжутся с тобой в течение нескольких дней! 🚀

Реклама. ПАО СБЕРБАНК, ИНН 7707083893. Erid 2VtzqxS96Na
Какие основные отличия PHP-FPM от модульного PHP в Apache?

Основные отличия PHP-FPM и модульного PHP в Apache (mod_php):


1. Способ работы и исполнения кода

PHP-FPM (FastCGI Process Manager)

🔸Запускается как отдельный процесс и обрабатывает запросы через протокол FastCGI.
🔸Веб-сервер (Apache, Nginx, Caddy и др.) передает запросы PHP-FPM через сокет или TCP.
🔸PHP-код выполняется в отдельных процессах, не зависящих от веб-сервера.

mod_php (Apache Module)

🔸PHP встраивается в сам Apache в виде модуля.
🔸Код выполняется внутри самого веб-сервера без необходимости передавать запросы во внешний процесс.
🔸Работает только с Apache, не совместим с Nginx.

2. Производительность и ресурсы

PHP-FPM:
Лучше масштабируется, так как поддерживает динамическое управление процессами.
Можно настроить пулы воркеров с разными конфигурациями (например, разное количество процессов для разных сайтов).
Меньше потребляет память, так как процессы PHP разделены от веб-сервера.
Небольшой оверхед на передачу запросов между веб-сервером и PHP-FPM.

mod_php:
Обрабатывает PHP быстрее внутри Apache, без передачи данных во внешний процесс.
Простая настройка, так как PHP уже встроен в сервер.
Занимает больше оперативной памяти, так как каждый Apache-процесс содержит PHP-интерпретатор.
Плохо масштабируется: каждый запрос создает новый процесс Apache, что быстро потребляет ресурсы.

3. Гибкость и настройки

PHP-FPM:

🔹Позволяет задать разные настройки PHP для разных виртуальных хостов (пулы процессов).
🔹Можно легко использовать разные версии PHP на одном сервере.
🔹Гибкие настройки управления процессами (pm.dynamic, pm.max_children и т. д.).

mod_php:

🔹Одна конфигурация PHP для всего сервера.
🔹Нет гибкого управления процессами (сколько процессов запущено — контролирует Apache).

4. Безопасность

PHP-FPM:

Запускает процессы от разных пользователей (разграничение прав между сайтами).
Уменьшает риск исполнения чужого кода на общем сервере.

mod_php:

Все PHP-скрипты работают от имени одного пользователя (обычно www-data или apache).
В многосайтовой среде сайты могут получить доступ друг к другу.

5. Поддержка серверов
PHP-FPM: Работает с Apache, Nginx, Caddy и другими серверами.
mod_php: Работает только с Apache.

📌 Вывод: что выбрать?
Если нужен Nginx, масштабируемость, безопасность и гибкость → PHP-FPM.
Если нужен простой и быстрый запуск PHP на Apache, без сложных настроек → mod_php (но для продакшена редко используется).
PHP-FPM — более современное и предпочтительное решение для большинства проектов. 🚀
Расскажите о целесообразности применения redis / memcached для кэширования. Какие плюсы и минусы?

Использование Redis или Memcached для кэширования — это общепринятая практика в веб-разработке и может предоставить несколько преимуществ.

Плюсы:

1. Ускорение работы приложения: Как кэш-серверы, Redis и Memcached хранят данные в оперативной памяти, что значительно ускоряет чтение и запись данных. Они могут быть использованы для кэширования запросов к базе данных, результатов тяжелых расчетов или рендеринга представлений, что помогает снизить время отклика приложения.

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

3. Постоянность данных: Redis позволяет сохранять данные на диске, что гарантирует их сохранность и после перезапуска сервера. Это важно, если важно избежать потери кэшированных данных.

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

5. Полезные функции: Кроме возможности кэширования, Redis и Memcached предлагают различные функции, которые могут быть полезными в разработке, такие как публикация/подписка, блокирующее чтение данных и транзакции.

Минусы:

1. Ограничение доступности: Поскольку данные хранятся в оперативной памяти, Redis и Memcached могут оказаться недоступными в случае перезапуска или сбоя сервера. Это означает, что при использовании их в качестве кэша, ваше приложение должно быть готово обрабатывать ситуации, когда кэш недоступен.

2. Ограничение места хранения: В отличие от баз данных, память Redis и Memcached ограничена объемом физической памяти на сервере. Если ваше приложение требует очень большой памяти для хранения данных, может потребоваться использование дополнительных серверов или другой подход к кэшированию.

3. Отсутствие типов данных: Memcached предлагает только возможность кэширования простых строковых данных, в то время как Redis поддерживает структурированные данные. Если вам необходимо хранить сложные данные или использовать сложные запросы, Redis может оказаться предпочтительнее.

4. Сложность настройки: Настройка Redis и Memcached может быть немного сложной для начинающих разработчиков. Вам необходимо правильно настроить экземпляры серверов, определить логику кэширования и обрабатывать ситуации, когда кэш недоступен. Это может потребовать определенного уровня знаний и опыта.
В чем разница между == и === в контексте работы с объектами?

В контексте работы с объектами в PHP операторы == и === ведут себя по-разному:

🔹 == (нестрогое сравнение)
Проверяет, имеют ли два объекта одинаковые свойства и значения.
Не учитывает, являются ли они одним и тем же экземпляром.
Если объекты имеют одинаковые свойства с одинаковыми значениями, но это разные экземпляры, оператор == вернёт true.

🔹 === (строгое сравнение)
Проверяет, являются ли объекты одним и тем же экземпляром (сравнивает ссылки на память).
Если два объекта являются разными экземплярами, даже если у них одинаковые свойства и значения, оператор === вернёт false.