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

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

Открыть в Telegram

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

Больше
3 149
Подписчики
-124 часа
-27 дней
-630 день
Архив постов
Когда Symfony отказывает пользователю в доступе? Когда неавторизованный пользователь пытается получить доступ к веб-приложению, Symfony отказывает ему в доступе. Он отображает страницу ошибки и возвращает HTTP-статус 403. Ошибка Access Denied, как следует из названия, на веб-странице означает, что веб-сервер отклонил ваш запрос на просмотр, либо потому, что веб-сервер работает неправильно, либо потому, что у вас нет правильных учетных данных.

🔥 IT Breaking Memes — 30 000 ₽ за самую смешную IT-новость Библиотека программиста запускает конкурс, который взорвет вашу л
🔥 IT Breaking Memes — 30 000 ₽ за самую смешную IT-новость Библиотека программиста запускает конкурс, который взорвет вашу ленту: создайте самую смешную альтернативную версию реальной IT-новости! 👾 Правила просты: 1. Берете настоящую новость из мира технологий. 2. Переписываете ее так, чтобы смеялись все. 3. Получаете деньги и славу. 🏆 Призы: - 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала - 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе Пример: Реальная новость: «Гугл создала модель для общения с дельфинами». Смешная альтернатива: «Нейросеть от Гугл обрабатывает видеопоток с камеры в свинарнике. ИИ следит, сколько свинья находится возле кормушки, не отталкивают ли ее собратья. Недокормленных докармливают, а переевшие пропускают следующую кормешку». 📅 Сроки: с 29 апреля по 11 мая включительно Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8 Ждем ваших новостей!

Как устроен Singleton и почему его считают антипатерном? Синглтон (Singleton) — это порождающий паттерн проектирования, который обеспечивает, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. Теперь рассмотрим, почему Синглтон часто считают антипаттерном: 1️⃣Глобальное состояние: Использование глобального объекта (в данном случае, единственного экземпляра класса) может привести к созданию глобального состояния, что затрудняет тестирование и усложняет понимание потока управления программы. 2️⃣Сложность в тестировании: Синглтоны могут вызывать проблемы при тестировании, так как они создают глобальные зависимости, которые не всегда легко подменить для модульного тестирования. 3️⃣Проблемы с наследованием: Наследование от Синглтона может стать проблемой, так как он имеет статическую точку доступа, которая не всегда вписывается в иерархию наследования. 4️⃣Сложность в масштабировании: Использование Синглтона может затруднить масштабирование системы, так как он создает глобальную точку зависимости, которая может стать узким местом. 5️⃣Проблемы с потокобезопасностью: Реализации Синглтона, как правило, не потокобезопасны по умолчанию, что может привести к проблемам в многопоточных приложениях.

Что подразумевается под понятием «триггер» в SQL? Триггер в SQL — это предопределенный SQL-код, который автоматически выполняется (или «срабатывает») в ответ на определенные события в таблице или представлении базы данных. Триггеры могут быть использованы для автоматизации выполнения определенных действий при вставке, обновлении или удалении данных в таблице. Они предоставляют способ добавления бизнес-логики к базе данных. Примеры событий, на которые могут реагировать триггеры: AFTER INSERT (После вставки данных): Триггер срабатывает после вставки новой записи в таблицу. AFTER UPDATE (После обновления данных): Триггер срабатывает после обновления существующей записи в таблице. AFTER DELETE (После удаления данных): Триггер срабатывает после удаления записи из таблицы. BEFORE INSERT (Перед вставкой данных): Триггер срабатывает перед вставкой новой записи в таблицу. Он может использоваться, чтобы модифицировать данные перед их вставкой. BEFORE UPDATE (Перед обновлением данных): Триггер срабатывает перед обновлением существующей записи в таблице. Он может использоваться для проверки или модификации данных перед обновлением. BEFORE DELETE (Перед удалением данных): Триггер срабатывает перед удалением записи из таблицы. Он может использоваться для проверки или сохранения данных перед удалением.

Что нового в РНР 8? 🚀 PHP 8.0 JIT-компиляция: Just-In-Time компилятор улучшает производительность, особенно в вычислительных задачах. Атрибуты (аннотации): Позволяют добавлять метаданные к классам, методам и свойствам, улучшая читаемость и поддержку кода. Сопоставление с образцом (match expression): Более строгая и удобная альтернатива конструкции switch. Промоция свойств конструктора: Уменьшает количество кода при объявлении свойств в конструкторе. Объединённые типы (union types): Позволяют указывать несколько типов для параметров и возвращаемых значений. Оператор nullsafe (?->): Упрощает работу с возможными null значениями, предотвращая ошибки. Новые строки функций: str_contains(), str_starts_with(), str_ends_with() — для удобной работы со строками. Интерфейс Stringable: Упрощает работу с объектами, которые могут быть приведены к строке. Функция get_debug_type(): Предоставляет точный тип переменной для отладки.​ 🔧 PHP 8.1 Перечисления (enums): Позволяют создавать наборы констант с типовой безопасностью. Только для чтения свойства (readonly): Свойства, которые можно инициализировать только один раз. Тип never: Указывает, что функция никогда не возвращает значение (например, всегда выбрасывает исключение). Синтаксис для первого класса callable: Упрощает создание и использование функций как объектов. Fibers: Позволяют реализовывать кооперативную многозадачность, полезно для асинхронного кода.​ 🧪 PHP 8.2 Типы null, false, true как отдельные типы: Улучшает типовую безопасность. Динамические свойства устарели: Предотвращает ошибки при случайном добавлении свойств в объекты. Атрибут #[SensitiveParameter]: Помечает параметры, содержащие чувствительную информацию, для предотвращения их логирования. 🔍 PHP 8.3 Типизация констант классов: Позволяет задавать типы для констант внутри классов. Атрибут #[\Override]: Указывает, что метод переопределяет родительский. Глубокое копирование только для чтения свойств: Обеспечивает корректное поведение при копировании объектов. Новые функции для работы с случайными значениями: Упрощают генерацию случайных данных. 🧩 PHP 8.4 Хуки свойств (Property Hooks): Возможность определять логику для геттеров и сеттеров непосредственно в свойстве, что упрощает код и уменьшает количество шаблонного кода. ​ Асимметричная видимость (Asymmetric Visibility): Позволяет задавать разные уровни доступа для чтения и записи свойств, например, сделать свойство доступным только для чтения. ​ Инстанцирование классов без скобок: Теперь можно вызывать методы сразу после создания объекта без необходимости оборачивать конструкцию в дополнительные скобки. ​ Новые функции для работы с массивами: array_find(), array_find_key(), array_any(), array_all() упрощают поиск и проверку элементов в массивах. ​ Поддержка HTML5 в расширении DOM: Расширение DOM теперь поддерживает HTML5, улучшая работу с современными веб-страницами. ​ Новые функции для работы со строками: mb_trim(), mb_ucfirst(), mb_lcfirst() предоставляют дополнительные возможности для обработки многобайтовых строк. Поддержка HTTP/3 в cURL: Добавлены константы CURL_HTTP_VERSION_3 и CURL_HTTP_VERSION_3ONLY для работы с протоколом HTTP/3. ​ Новые методы для DateTimeImmutable: Методы createFromTimestamp() и get/setMicrosecond() облегчают работу с временными метками и микросекундами.

Почему стоит избегать foreach ($array as &$value), если не требуется изменять массив? ​Использование конструкции foreach ($array as &$value) в PHP без необходимости изменения элементов массива может привести к неожиданным и труднообнаружимым ошибкам.​ ⚠️ Почему стоит избегать foreach с ссылкой без необходимости 1. Сохранение ссылки после цикла После завершения цикла переменная $value остаётся ссылкой на последний элемент массива. Если затем использовать эту переменную без её предварительного удаления, это может непреднамеренно изменить последний элемент массива. Это поведение может привести к труднообнаружимым ошибкам. ​ 2. Повторное использование переменной в последующих циклах Если переменная, использованная в качестве ссылки в одном цикле, повторно используется в следующем foreach без ссылки, это может привести к неожиданным изменениям данных. Это связано с тем, что переменная остаётся ссылкой на последний элемент массива из предыдущего цикла. ​ 3. Непреднамеренные изменения при передаче массива в функции Если массив передаётся в функцию после использования foreach с ссылкой, и внутри функции также используется foreach с ссылкой, это может привести к изменению оригинального массива, даже если он передан по значению. Это происходит потому, что переменная остаётся ссылкой, и при передаче массива в функцию изменения отражаются на оригинальном массиве. ​ ✅ Рекомендации 🔸 Используйте foreach ($array as $value) без ссылки, если не планируете изменять элементы массива.​ 🔸 Если необходимо изменить элементы, предпочтительнее использовать foreach ($array as $key => $value) и присваивать новые значения через $array[$key] = ...;.​ 🔸 После использования foreach с ссылкой всегда вызывайте unset($value); для удаления ссылки. ​ 🔸 Избегайте повторного использования переменной, использованной в foreach с ссылкой, в последующих циклах без её предварительного удаления.​

Cуперглобальные массивы. Суперглобальные массивы в PHP — это предопределенные глобальные переменные, которые доступны из любой области видимости в скрипте. Некоторые из наиболее распространенных суперглобальных массивов в PHP: 1. $_GET: содержит переменные, переданные из строки запроса URL в качестве параметров. Они обычно используются для передачи данных через URL. 2. $_POST: содержит переменные, отправленные через HTTP POST-запросы. Этот массив обычно используется для передачи данных из формы на сервер. 3. $_SESSION: хранит переменные сессии пользователя. Эти данные могут быть доступны на протяжении всей сессии пользователя. 4. $_COOKIE: содержит переменные, переданные клиентом через HTTP-куки. Они обычно используются для сохранения долговременных данных о состоянии пользователя. 5. $_SERVER: содержит информацию о сервере и окружении, в котором выполняется текущий скрипт. 6. $_FILES: содержит информацию о файлах, загруженных на сервер через форму загрузки файлов. Про остальные можно узнать в документации

🐘 Тест по PHP 🔥 Проверь насколько хорошо ты знаешь PHP Ответишь — пройдешь на продвинутый курс "PHP Developer. Professional
🐘 Тест по PHP 🔥 Проверь насколько хорошо ты знаешь PHP Ответишь — пройдешь на продвинутый курс "PHP Developer. Professional" от OTUS по специальной цене. ➡ ПРОЙТИ ТЕСТ: https://clc.to/jYsBjw Приятный бонус Курс можно приобрести в рассрочку и без переплаты Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Использует ли Laravel Symfony? Да, Laravel широко использует компоненты фреймворка Symfony. Laravel, популярный PHP-фреймворк, использует несколько компонентов Symfony, чтобы предоставить надежную и богатую функциями основу для создания веб-приложений. Некоторые из компонентов Symfony, используемых в Laravel, включают: HTTP Foundation: Этот компонент используется для обработки HTTP-запросов и ответов. Консоль (Console): Командный интерфейс Artisan в Laravel построен с использованием компонента консоли Symfony. Диспетчер событий (Event Dispatcher): Система обработки событий в Laravel работает на основе компонента диспетчера событий Symfony. Файловая система (Filesystem): Компонент файловой системы Symfony используется для операций с файлами. Внедрение зависимостей (Dependency Injection): Laravel использует контейнер внедрения зависимостей Symfony для управления зависимостями.

Коротко расскажите об истории 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), и другие синтаксические улучшения.

Открытый вебинар «Почему стоит выбрать Symfony для нового проекта» в OTUS 📅 29 апреля, 20:00 МСК · онлайн · бесплатно 👤 Спи
Открытый вебинар «Почему стоит выбрать Symfony для нового проекта» в OTUS 📅 29 апреля, 20:00 МСК · онлайн · бесплатно 👤 Спикер — Михаил Каморин Кто ведёт • Tech Lead в Avito • 20 + лет в разработке (10 лет B2B, 4 года B2C) • 10 + лет на PHP, 5 лет — на Symfony • Автор двух RAD‑движков (Laravel + Symfony), запущенных в 10 + прод‑проектах • Выпускник ВМК МГУ, член ПК Podlodka PHP Crew Symfony — ядро экосистемы PHP. Разберём, как фреймворк помогает запускать и поддерживать продукты с горизонтом 5 + лет. Ключевые вопросы • Модульность — 25 + компонентов подключаются по мере надобности • Гибкость — DI‑контейнер переопределяет сервисы без боли • Стабильность — LTS 3 года, минорные версии совместимы назад • Speed‑toolkit — Symfony CLI, Flex, автоконфигурация, Profiler Кому полезно — Middle/Senior PHP‑разработчикам, архитекторам и тимлидам, которым нужны строгие аргументы «за» Symfony. Формат — 60 минут концентрированной практики + Q&A без маркетинговой воды. Участие бесплатное. Места ограничены. Регистрируйтесь. →https://clc.to/53mPng Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Что такое sensitive данные? Как хранятся в базе? Как отражаются в логах? Sensitive данные (чувствительные данные) — это информация, которая является приватной, конфиденциальной или важной для безопасности организации или пользователя. К таким данным относятся, например, пароли, номера кредитных карт, персональные идентификационные номера и т.д. Хранение sensitive данных в базе данных требует особых мер безопасности, чтобы предотвратить несанкционированный доступ. Важной практикой является хеширование паролей. При регистрации пользователя пароль хешируется — процесс преобразования пароля в непонятный для чтения вид. Затем хеш сохраняется в базе данных. При входе в систему, введенный пароль также хешируется, и соответствующий хеш сравнивается с сохраненным в базе данных. Sensitive данные не должны непосредственно отражаться в логах. Вместо этого должна быть сохранена информация о том, что операция на sensitive данных была выполнена. Например, вместо того, чтобы сохранять сам пароль в логах, можно сохранить запись вроде «пользователь X изменил свой пароль». Это делается для предотвращения утечки конфиденциальной информации в случае несанкционированного доступа к логам.

В чем разница между Serializer и Normalizer в Symfony? В Symfony сериализаторы и нормализаторы используются для обработки преобразования данных, но они выполняют разные функции и работают на разных уровнях абстракции. Сериализатор (Serializer) Сериализатор отвечает за преобразование сложных структур данных (таких как объекты и массивы) в определённый формат (например, JSON, XML или CSV) и обратно. Компонент Serializer в Symfony предоставляет унифицированный способ выполнения этого процесса. Основные задачи сериализатора: Сериализация: Преобразование структур данных PHP (объекты, массивы) в строковой формат (JSON, XML и т.д.). Десериализация: Преобразование строкового формата (JSON, XML и т.д.) обратно в структуры данных PHP. Например, если у вас есть объект, и вы хотите получить его представление в формате JSON, вы будете использовать сериализатор. Нормализатор (Normalizer) Нормализатор — это более детализированное понятие, которое занимается преобразованием между различными представлениями данных в процессе сериализации. Нормализаторы используются сериализатором для обработки преобразования конкретных типов данных. Основные задачи нормализатора: Нормализация: Преобразование объекта в нормализованный массив. Денормализация: Преобразование нормализованного массива обратно в объект. Нормализаторы фокусируются на разложении и восстановлении объектов и массивов без непосредственного взаимодействия с конечным форматом, таким как JSON или XML. Они обрабатывают промежуточный этап преобразования данных в ассоциативный массив, который сериализатор затем может преобразовать в требуемый формат.

В чем разница между match и switch? 1. Тип сравнения switch: использует нестрогое сравнение (==), что может привести к неожиданным результатам из-за приведения типов match: использует строгое сравнение (===), учитывая как значение, так и тип 2. Возвращение значения switch: не возвращает значение; используется для выполнения кода в блоках case.​ match: возвращает значение, что позволяет присваивать результат переменной или использовать его в выражениях. 3. Обязательность обработки всех случаев switch: если ни один case не совпадает, и default не указан, код после switch продолжается без ошибок.​ match: если ни одно условие не совпадает и default не указан, выбрасывается исключение UnhandledMatchError.​ 4. Синтаксис и лаконичность switch: требует использования break для предотвращения «проваливания» в следующий case.​ match: автоматически прекращает выполнение после первого совпадения; break не требуется. ✅ Когда использовать match? 🔹 Когда необходимо строгое сравнение значений и типов.​ 🔹 Когда требуется вернуть значение на основе условий.​ 🔹 Для более лаконичного и читаемого кода.​ ⚠️ Когда предпочтительнее использовать switch? 🔸 В версиях PHP до 8.0, где match недоступен.​ 🔸 Когда требуется нестрогое сравнение или поддержка «проваливания» между case.​

Сравнение значений переменных в РНР и подводные камни? Приведение типов. Что изменилось в 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 предоставляет констру
Как использовать конструктор запросов(query builder) для выполнения сложных запросов в Laravel? Laravel предоставляет конструктор запросов, который позволяет строить SQL-запросы более бегло и читабельно, чем при написании исходного SQL. Конструктор запросов предоставляет ряд методов для построения запросов, включая select, where, join и orderBy. В этом примере мы используем конструктор запросов, чтобы выбрать имя и номер телефона всех пользователей старше 25 лет, упорядоченные по имени. Мы соединяем таблицу contacts с таблицей users с помощью метода join и фильтруем результаты с помощью метода where. Затем мы используем метод orderBy для сортировки результатов, а метод get — для получения результатов в виде коллекции.

Чем опасен оператор @ в PHP? ​В PHP оператор @ используется для подавления сообщений об ошибках, возникающих при выполнении выражений. Однако его применение может привести к ряду проблем, особенно в контексте безопасности и отладки кода.​ Проблемы, связанные с использованием оператора @: 🔸 Подавление критических ошибок: Оператор @ скрывает все сообщения об ошибках, включая критические. Это может привести к тому, что важные ошибки останутся незамеченными, что затруднит их обнаружение и исправление.​ 🔸 Снижение производительности: Использование @ может негативно влиять на производительность приложения. Даже если ошибки не возникают, PHP выполняет дополнительные операции для подавления сообщений, что может замедлить выполнение кода.​ 🔸 Сложности в отладке: Подавление ошибок затрудняет процесс отладки, поскольку разработчик не получает информации о возникших проблемах. Это может привести к длительному поиску причин некорректного поведения программы.​ Рекомендации по использованию: 🔹 Избегайте использования @: Вместо подавления ошибок рекомендуется обрабатывать их с помощью конструкций try-catch или проверять условия перед выполнением потенциально проблемных операций.​ 🔹 Настройка уровней отчетности об ошибках: Используйте функции error_reporting() и set_error_handler() для управления выводом сообщений об ошибках и их обработкой. Это позволит более гибко контролировать поведение приложения при возникновении ошибок.​ В целом, использование оператора @ в PHP считается плохой практикой. Подавление ошибок может привести к пропуску критических проблем и усложнить процесс отладки. Рекомендуется явным образом обрабатывать возможные ошибки и исключения, что способствует повышению надежности и безопасности кода.