Библиотека собеса по PHP | вопросы с собеседований
3.14K subscribers
190 photos
6 videos
117 links
Вопросы с собеседований по PHP и ответы на них.

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Что такое генераторы и как их использовать?

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

Генераторы создаются с использованием ключевого слова yield. Когда функция с yield возвращает значение, она «замораживается» на этом месте, сохраняя свою текущую структуру и состояние. Когда генератор запрашивает следующий элемент, он продолжает выполнение функции с того места, где остановился ранее.

В нашем примере функция numberGenerator является генератором, который создает последовательность чисел от 1 до заданного предела. Когда вы запускаете этот код, он выведет: 1 2 3 4 5.

Преимущества использования генераторов:

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

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

Удобство работы с большими данными: Позволяют обрабатывать большие наборы данных пошагово без необходимости загрузки их полностью в память.
👍5
Почему 0 == «foo» возвращает true?

В PHP при нестрогом сравнении (==) строки с числом происходит преобразование типов для выполнения сравнения. До версии PHP 8, если строка не начиналась с числового значения, она преобразовывалась в 0. Поэтому выражение 0 == «foo» возвращало true, так как обе стороны сравнения становились 0.

Однако, начиная с PHP 8, поведение изменилось. Теперь, если строка не является числовой, сравнение с числом возвращает false без преобразования строки в число. Таким образом, в PHP 8 и выше, 0 == «foo» возвращает false.

Это изменение направлено на улучшение предсказуемости и безопасности сравнения данных в PHP.
👍2
WANTED: PHP-АРХИТЕКТОР

Обвиняется в знании того, как сделать PHP быстрым и надёжным. Мы ищем эксперта, который поможет другим соискателям не бояться вопросов про DI, паттерны и архитектуру.

Приметы:

— является профи в PHP (знает, в чём его сила по сравнению с Python или Java);
— имеет опыт проведения глубоких технических интервью;
— умеет объяснять сложные концепции без лишней воды;
— готов работать на свою узнаваемость в IT.

Контракт:

— статус официального эксперта;
— достойный гонорар за подготовку материалов;
— доступ к большой аудитории Proglib.

Заполнить анкету

P.S. Знаешь того, кто «слишком много знает» о современном PHP? Сдай его нам.
👍1
Что такое нормализация?

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

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

Выделяют различные уровни нормализации (нормальные формы), такие как:

1. Первая нормальная форма (1NF): Требует, чтобы каждая колонка в таблице содержала только атомарные (неделимые) значения, а каждая строка была уникальной.

2. Вторая нормальная форма (2NF): Находит и устраняет избыточные зависимости между колонками в таблице, разделяя данные на связанные таблицы.

3. Третья нормальная форма (3NF): Устраняет транзитивные зависимости между колонками, вынося их в отдельные таблицы.

Существуют также более высокие уровни нормализации, такие как четвертая нормальная форма (4NF), пятая нормальная форма (5NF) и другие. Эти нормальные формы помогают сделать базу данных более гибкой, масштабируемой, эффективной и согласованной.

Нормализация является важным шагом в проектировании базы данных, однако следует помнить, что чрезмерная нормализация может привести к сложности и медленным запросам. Поэтому в некоторых случаях может быть необходимым достигнуть компромисса между нормализацией и денормализацией данных для повышения производительности и удобства использования базы данных.
2👍1
Что делает оператор yield?

Когда оператор yield вызывается внутри функции, она превращает эту функцию в генератор. Он возвращает следующее значение из генератора и приостанавливает его выполнение, сохраняя его текущее состояние. При следующем вызове оператора yield выполнение продолжится с того же места, где остановилось.

Оператор yield может использоваться для итерации через массивы, коллекции или базы данных без необходимости загружать все значения сразу.
👍1
Расскажите про сериализатор Symfony

В Symfony, сериализатор — это сервис, который преобразует данные между различными форматами, такими как JSON, XML, YAML или CSV, и PHP-объектами. Компонент сериализации в Symfony — это мощный инструмент, используемый для преобразования объектов в сериализуемый формат и обратно.

Нормализаторы и кодировщики

Нормализаторы: Отвечают за преобразование объектов в массивы и обратно:

✔️ObjectNormalizer: Преобразует объекты в массивы и обратно.
✔️ArrayDenormalizer: Обрабатывает массивы объектов.
✔️DateTimeNormalizer: Обрабатывает объекты DateTime.

Кодировщики: Отвечают за преобразование массивов в определенные форматы и обратно:

✔️JsonEncoder: Обрабатывает кодирование/декодирование JSON.
✔️XmlEncoder: Обрабатывает кодирование/декодирование XML.
✔️YamlEncoder: Обрабатывает кодирование/декодирование YAML.
✔️CsvEncoder: Обрабатывает кодирование/декодирование CSV.
👍4
Какие существуют уязвимости, связанные с unserialize(), и как их избежать?

Функция unserialize() в PHP преобразует сериализованную строку обратно в соответствующий объект или значение. Однако её использование может привести к серьёзным уязвимостям, особенно если данные для десериализации поступают из ненадёжных источников. Основные риски включают:

1. Инъекция объектов (Object Injection)
Злоумышленник может передать специально сформированные данные в unserialize(), что приведёт к созданию объектов нежелательных классов. Если эти классы содержат методы, выполняющие опасные действия при инициализации или уничтожении объектов (например, магические методы __wakeup() или __destruct()), это может привести к выполнению произвольного кода.

2. Использование освобождённой памяти (Use-After-Free)
Некоторые уязвимости связаны с ошибками в механизме управления памятью PHP, что может позволить злоумышленнику выполнить произвольный код через функцию unserialize().

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

$data = unserialize($input, ['allowed_classes' => false]);


Это предотвратит создание объектов произвольных классов.

🔸 Рассмотрите альтернативные методы сериализации, такие как JSON, которые не поддерживают сериализацию объектов и, следовательно, безопаснее при обработке пользовательских данных.

🔸 Обновляйте PHP и используемые библиотеки до последних версий, где многие уязвимости уже исправлены.

🔸 Реализуйте строгую валидацию и санитизацию входящих данных, особенно если они будут десериализованы.

🔸 Соблюдение этих рекомендаций поможет защитить приложения от потенциальных атак, связанных с небезопасной десериализацией данных.