Библиотека собеса по 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 генераторы —
это специальный тип итератора, который позволяет создавать итераторы по требованию. Они предоставляют удобный способ работы с большими наборами данных, не загружая их все в память сразу. Генераторы помогают оптимизировать использование памяти и улучшают производительность в случаях, когда нам нужно обработать большой объем данных пошагово.
Генераторы создаются с использованием ключевого слова 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 операторы == и === ведут себя по-разному:
🔹 == (нестрогое сравнение)
Проверяет, имеют ли два объекта одинаковые свойства и значения.
Не учитывает, являются ли они одним и тем же экземпляром.
Если объекты имеют одинаковые свойства с одинаковыми значениями, но это разные экземпляры, оператор == вернёт 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 — это способ инкапсуляции многократно используемой логики запросов в модели. Определяя области запросов, мы можем сделать наши модели более выразительными и удобными в работе. Области запросов — это, по сути, готовые запросы, которые можно применить в конструкторе запросов модели.
Чтобы определить область запросов в 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 — это строгая типизация, сложные паттерны и высокие нагрузки. Чтобы претендовать на серьезные вакансии и деньги, нужно выходить за рамки 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 позволяют следовать за циклом вашего приложения и реагировать на определенные действия или события использовать:
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, а также внутренних и сторонних пакетов. Он определяет стандарты кодирования и соглашения, используемые в ядре фреймворка, чтобы сделать его более единообразным и предсказуемым.
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
