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

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

前往频道在 Telegram

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

显示更多
3 149
订阅者
-124 小时
-27
-630
帖子存档
Почему 0 == «foo» возвращает true? В PHP при нестрогом сравнении (==) строки с числом происходит преобразование типов для выполнения сравнения. До версии PHP 8, если строка не начиналась с числового значения, она преобразовывалась в 0. Поэтому выражение 0 == «foo» возвращало true, так как обе стороны сравнения становились 0. Однако, начиная с PHP 8, поведение изменилось. Теперь, если строка не является числовой, сравнение с числом возвращает false без преобразования строки в число. Таким образом, в PHP 8 и выше, 0 == «foo» возвращает false. Это изменение направлено на улучшение предсказуемости и безопасности сравнения данных в PHP.

Что такое генераторы и как их использовать? В PHP генераторы — это специальный тип итератора, который позволяет создавать ите
Что такое генераторы и как их использовать? В PHP генераторы — это специальный тип итератора, который позволяет создавать итераторы по требованию. Они предоставляют удобный способ работы с большими наборами данных, не загружая их все в память сразу. Генераторы помогают оптимизировать использование памяти и улучшают производительность в случаях, когда нам нужно обработать большой объем данных пошагово. Генераторы создаются с использованием ключевого слова yield. Когда функция с yield возвращает значение, она «замораживается» на этом месте, сохраняя свою текущую структуру и состояние. Когда генератор запрашивает следующий элемент, он продолжает выполнение функции с того места, где остановился ранее. В нашем примере функция numberGenerator является генератором, который создает последовательность чисел от 1 до заданного предела. Когда вы запускаете этот код, он выведет: 1 2 3 4 5. Преимущества использования генераторов: Экономия памяти: Генераторы не загружают все значения в память сразу, что позволяет работать с большими объемами данных. Ленивые вычисления: Генераторы используются по мере необходимости, что позволяет выполнять ленивые вычисления только для запрошенных значений. Удобство работы с большими данными: Позволяют обрабатывать большие наборы данных пошагово без необходимости загрузки их полностью в память.

Расскажите о целесообразности применения 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 операторы == и === ведут се
В чем разница между == и === в контексте работы с объектами? В контексте работы с объектами в PHP операторы == и === ведут себя по-разному: 🔹 == (нестрогое сравнение) Проверяет, имеют ли два объекта одинаковые свойства и значения. Не учитывает, являются ли они одним и тем же экземпляром. Если объекты имеют одинаковые свойства с одинаковыми значениями, но это разные экземпляры, оператор == вернёт true. 🔹 === (строгое сравнение) Проверяет, являются ли объекты одним и тем же экземпляром (сравнивает ссылки на память). Если два объекта являются разными экземплярами, даже если у них одинаковые свойства и значения, оператор === вернёт false.

Расскажите о целесообразности применения 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 может быть немного сложной для начинающих разработчиков. Вам необходимо правильно настроить экземпляры серверов, определить логику кэширования и обрабатывать ситуации, когда кэш недоступен. Это может потребовать определенного уровня знаний и опыта.

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

Какие основные отличия 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 — более современное и предпочтительное решение для большинства проектов. 🚀

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

Что вы знаете о дескрипторах в Symfony? В Symfony дескрипторы используются для преобразования объектов и связанной с ними метаданных в различные форматы вывода, такие как текст, XML или JSON. Дескрипторы особенно полезны для отображения информации в консольных командах, генерации документации API или предоставления метаданных в различных форматах для других целей. Назначение и использование Дескрипторы в Symfony помогают разработчикам представлять подробную информацию об объектах (например, о командах, маршрутах, сервисах, событиях и т. д.) в согласованном и структурированном виде. Это особенно полезно, когда нужно предоставить читаемый человеком вывод или данные, понятные для машин. Распространенные случаи использования ✔️Консольные команды: Когда вы выполняете консольную команду Symfony с опцией --help, дескрипторы используются для форматирования и отображения текста справки по команде. ✔️Информация о маршрутизации: Дескрипторы могут использоваться для отображения информации о маршрутизации в различных форматах. ✔️Информация о сервисах: Они также могут описывать сервисы в контейнере сервисов. Основные компоненты DescriptorInterface: Этот интерфейс определяет контракт для дескрипторов. Любой дескриптор должен реализовать этот интерфейс и его метод describe. AbstractDescriptor: Это абстрактный класс, который реализует некоторую общую логику для дескрипторов. Он помогает уменьшить дублирование кода среди различных реализаций дескрипторов. Специфические дескрипторы: Symfony предоставляет несколько встроенных дескрипторов, таких как: 🟢TextDescriptor 🟢XmlDescriptor 🟢JsonDescriptor 🟢MarkdownDescriptor Расширение дескрипторов Если встроенные дескрипторы не удовлетворяют вашим потребностям, вы можете создать собственные дескрипторы, реализовав DescriptorInterface. Это позволит вам адаптировать вывод под ваши конкретные требования.

🧑‍💻 Пишете на PHP, упираетесь в производительность и всё чаще смотрите в сторону асинхронных решений? В какой-то момент вы столкнулись с ограничениями "короткоживущих" процессов и традиционного стека с PHP-FPM, особенно, при обработке "лёгких" запросов — нужны другие подходы к запуску и масштабированию приложений. 📖 На открытом уроке вы разберётесь, как устроен RoadRunner, в каких случаях он действительно даёт выигрыш и почему его выбирают для долгоживущих процессов и асинхронных задач. Мы покажем простой пример работы и разложим по полочкам сценарии применения. ❗️ Занятие будет полезно PHP-разработчикам, которые думают о производительных и асинхронных сервисах, хотят лучше понимать архитектуру и варианты горизонтального масштабирования. Вы получите конкретные идеи, как можно пересобрать свой подход к backend-части. ▶️ Встречаемся 23 декабря в 20:00 МСК в преддверие старта курса «PHP Developer. Professional»: https://clc.to/F21P9A Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Что такое Redis? Redis — это высокопроизводительная система управления базами данных и кэширования, которая используется для хранения данных в формате ключ-значение. Она является ключевым инструментом в мире веб-разработки и приложений больших данных. Тип данных: Redis поддерживает различные типы данных, включая строки, хеш-таблицы, списки, наборы и упорядоченные наборы. Это позволяет разработчикам выбирать наиболее подходящий тип данных для конкретной задачи. Скорость: Redis славится своей высокой производительностью благодаря тому, что он хранит все данные в памяти, а не на диске. Это обеспечивает быстрый доступ к данным и делает Redis одним из самых быстрых инструментов кэширования. Атомарные операции: Redis поддерживает атомарные операции, что означает, что множество операций можно объединить в одну, гарантируя целостность данных. Например, увеличение значения ключа на определенную величину — это атомарная операция. Поддержка различных структур данных: Благодаря различным типам данных, Redis идеально подходит для различных сценариев использования, начиная от кэширования данных и заканчивая реализацией очередей сообщений и управлением счетчиками. Мультипоточность: Redis однопоточный по своей природе, но благодаря асинхронным запросам и многозадачности операционных систем, он способен обрабатывать тысячи запросов в секунду без потери производительности. Поддержка транзакций: Redis поддерживает транзакции, что позволяет группировать несколько операций в одну транзакцию и обеспечивать атомарность выполнения всех операций внутри транзакции. Сохранение данных на диск: Redis имеет возможность периодически сохранять данные на диск, обеспечивая устойчивость данных даже в случае перезапуска системы. В общем, Redis — это мощный и гибкий инструмент, который позволяет разработчикам создавать быстрые и масштабируемые приложения, оптимизировать производительность и обеспечивать устойчивость данных.

PHP — это не только сайты-визитки Современный PHP — это строгая типизация, сложные паттерны и высокие нагрузки. Чтобы претенд
PHP — это не только сайты-визитки Современный PHP — это строгая типизация, сложные паттерны и высокие нагрузки. Чтобы претендовать на серьезные вакансии и деньги, нужно выходить за рамки CMS. Акция 1 + 2: Три курса по цене одного. Оплачиваешь самый дорогой слот, два других — бесплатно. Что учить: — Архитектуры и шаблоны проектирования; — Алгоритмы и структуры данных. Level Up Акция до 31 декабря. Не знаешь, что выбрать? @manager_proglib

Какие магические методы вы знаете и как их применяют? __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().

Как использовать кэширование в 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();

Объясните задачи, выполняемые контроллером, и определите правила для создания методов в контроллере в 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 строк кода в каждое действие.

Что такое 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): Сервисы приложения — это слой, предоставляющий операции, доступные извне приложения. Фабрики создают сложные объекты, облегчая их создание и инициализацию.

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

Что такое PSR? PSR в контексте PHP означает «PHP Standards Recommendations» или «Рекомендации по стандартам PHP». PSR — это набор руководящих принципов и рекомендаций, разработанных PHP сообществом, для создания единообразия и согласованности в коде и проектах на PHP. PSRы определяют стандарты для различных аспектов разработки PHP, таких как структура директорий проекта, автозагрузка классов, стандарты кодирования, интерфейсы HTTP, контейнеры зависимостей и т. д. Они предлагают рекомендации и лучшие практики для этих областей, чтобы обеспечить совместимость между различными библиотеками и фреймворками, а также простоту сопровождения и совместной разработки кода. Одна из самых известных и широко используемых PSR-рекомендаций — это PSR-4, который определяет правила автозагрузки классов. Согласно PSR-4, классы должны быть организованы в файловой системе в соответствии с определенной структурой директорий, а классы должны иметь пространства имен, соответствующие их местоположению в файловой системе. Использование PSR-рекомендаций позволяет разработчикам использовать согласованный кодовый стиль и основные стандарты, что делает код более понятным, читаемым и поддерживаемым. Это также способствует доступности и переиспользованию кода, поскольку различные проекты и библиотеки будут соблюдать одни и те же стандарты. В целом, следование PSR-рекомендациям помогает создать экосистему совместимых и качественных проектов на PHP. Подробнее про PSR на русском здесь

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