Библиотека собеса по PHP | вопросы с собеседований
Open in Telegram
Вопросы с собеседований по PHP и ответы на них. По рекламе: @proglib_adv Учиться у нас: clc.to/5JWKxA Для обратной связи: @proglibrary_feeedback_bot
Show more3 112
Subscribers
-324 hours
-97 days
-1930 days
Posts Archive
🐘 Квиз для PHP-разработчиков: ответишь на все вопросы или сольешься?
Проверь свои знания PHP перед собеседованием: тест с вопросами о типах данных, функциях, директивах и классах. Идеально для разработчиков, готовящихся к техническому интервью.
👉 Пройти тест
Как использовать каталог хранилищ в Laravel?
Laravel предоставляет каталог хранения, который можно использовать для хранения файлов и других данных, которые не должны быть общедоступными.
В этом примере мы сохраняем файл в каталоге
uploads внутри каталога storage с помощью метода store. Затем мы можем получить файл с помощью метода get и удалить его с помощью метода delete.Почему
json_encode([]) === '[]', но json_encode((object)[]) === '{}'?
В PHP функция json_encode() преобразует структуры данных в строки JSON. Результат зависит от типа передаваемой структуры: массив или объект.
🔍 Почему json_encode([]) возвращает '[]'
Пустой массив [] в PHP интерпретируется как последовательный массив без ключей. При преобразовании в JSON он становится пустым массивом: '[]'.
🔍 Почему json_encode((object)[]) возвращает '{}'
При приведении пустого массива к объекту (object)[] получается экземпляр класса stdClass без свойств. При кодировании в JSON он становится пустым объектом: '{}'.
⚠️ Важность различия
В JSON пустой массив '[]' и пустой объект '{}' — разные типы данных. Это различие может быть критичным при взаимодействии с API или клиентскими приложениями, ожидающими определённый тип данных.
✅ Как контролировать результат json_encode()
🔸Чтобы получить пустой объект в JSON, приведите массив к объекту: (object)[].
🔸 Чтобы получить пустой массив, используйте [].
Будьте осторожны с флагом JSON_FORCE_OBJECT, так как он преобразует все массивы в объекты, что может привести к нежелательным результатам.Какие типы связей в базе данных?
Существует три типа связей между таблицами в базе данных:
«Один-к-одному» или 1:1. Это означает, что каждой записи в первой таблице соответствует не более одной записи во второй таблице, и наоборот.
«Один-ко-многим» или 1:M. Это означает, что одному экземпляру сущности может соответствовать любое количество (M) экземпляров другой сущности.
«Многие-ко-многим» или M:N. Это означает, что нескольким экземплярам одной сущности может соответствовать несколько экземпляров другой сущности.
Как защититься от SQL-инъекций без prepared statements?
🔐 Альтернативные способы защиты от SQL-инъекций без prepared statements
1. Экранирование пользовательского ввода
Для MySQL можно использовать функцию
mysqli_real_escape_string(), которая экранирует специальные символы в строке, делая её безопасной для использования в SQL-запросах.
$login = mysqli_real_escape_string($conn, $_POST['login']);$query = «SELECT * FROM users WHERE login = '$login'»;
Однако этот метод не защищает от всех видов атак и может быть недостаточно эффективным, особенно если не учитывать кодировку и типы данных.
2. Приведение типов и валидация данных
Если ожидается, что пользовательский ввод должен быть определённого типа (например, целое число), следует явно приводить его к этому типу и проверять допустимость значения.
$id = (int)$_GET['id'];$query = «SELECT * FROM products WHERE id = $id»;
Это предотвращает внедрение вредоносного кода через параметры, ожидающие числовые значения.
3. Белые списки допустимых значений
Для параметров, которые могут принимать ограниченный набор значений (например, порядок сортировки), следует использовать белые списки и проверять, что введённое значение входит в допустимый набор.
$order = $_GET['order'];if (!in_array($order, ['ASC', 'DESC'])) {$order = 'ASC';}$query = «SELECT * FROM products ORDER BY price $order»;
Это предотвращает возможность внедрения произвольного SQL-кода через параметры.
4. Использование хранимых процедур
Хранимые процедуры, определённые на стороне базы данных, могут помочь изолировать SQL-логику от пользовательского ввода. Однако они также могут быть уязвимы, если параметры не обрабатываются должным образом.
⚠️ Почему эти методы менее надёжны
🔸 Экранирование и валидация требуют тщательной реализации и могут быть легко нарушены при изменении кода.
🔸 Ошибки в логике проверки или упущенные случаи могут открыть путь для атак.
🔸 Эти методы не обеспечивают такой же уровень защиты, как подготовленные выражения, особенно при работе с различными типами данных и кодировками.Когда Symfony отказывает пользователю в доступе?
Когда неавторизованный пользователь пытается получить доступ к веб-приложению, Symfony отказывает ему в доступе. Он отображает страницу ошибки и возвращает HTTP-статус 403. Ошибка Access Denied, как следует из названия, на веб-странице означает, что веб-сервер отклонил ваш запрос на просмотр, либо потому, что веб-сервер работает неправильно, либо потому, что у вас нет правильных учетных данных.
🔥 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" от 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 МСК · онлайн · бесплатно
👤 Спикер — Михаил Каморин
Кто ведёт
• 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, который выполняет строгое сравнение без приведения типов. Это позволяет писать более четкий и предсказуемый код.
