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

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Что нового в РНР 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() облегчают работу с временными метками и микросекундами.
3👍2❤‍🔥1
🔥 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

Ждем ваших новостей!
🐘 Квиз для PHP-разработчиков: ответишь на все вопросы или сольешься?

Проверь свои знания PHP перед собеседованием: тест с вопросами о типах данных, функциях, директивах и классах. Идеально для разработчиков, готовящихся к техническому интервью.

👉 Пройти тест
🌚2
🔥 Конкурс: 30 000 ₽ за самую смешную IT-новость

Напоминаем о конкурсе «Библиотеки программиста»: напишите самую смешную версию реальной новости про технологии.

👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.

🎁 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе

🏆 Как будем оценивать:
Мы выложим новости всех участников в одном из наших телеграм-каналов. Те новости, которые наберут больше всего охвата, войдут в шорт-лист. Из шорт-листа подписчики и жюри выберут победителя.

📅 Сроки: прием новостей до 11 мая включительно

Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8

Осталась неделя — ждем ваших новостей!
👍1
Какой overhead у persistent соединений в PDO?

Использование постоянных соединений в PDO (через PDO::ATTR_PERSISTENT => true) может снизить накладные расходы на установку соединений с базой данных, особенно если соединение требует значительных ресурсов. Однако этот подход имеет свои особенности и потенциальные недостатки.

⚙️ Как работают постоянные соединения в PDO
При использовании постоянных соединений PHP не закрывает соединение с базой данных после завершения скрипта. Вместо этого соединение сохраняется и может быть повторно использовано другим скриптом, если он использует те же параметры подключения. Это позволяет избежать затрат на установку нового соединения при каждом запросе, что может улучшить производительность приложения.

📈 Потенциальные преимущества
Снижение накладных расходов: Избегание повторной установки соединений может ускорить выполнение скриптов.
Повышение производительности: Особенно заметно при работе с удалёнными базами данных или при высокой нагрузке на сервер.

⚠️ Возможные недостатки
Ограничения на количество соединений: Каждый процесс может удерживать своё постоянное соединение, что может привести к превышению лимита соединений на сервере базы данных.
Состояние соединения: Если скрипт завершился с ошибкой или не освободил ресурсы (например, блокировки или транзакции), следующее использование этого соединения может столкнуться с проблемами.
Совместимость с драйверами: Некоторые драйверы, такие как ODBC, могут не поддерживать постоянные соединения должным образом, что может привести к нестабильной работе.

Рекомендации по использованию
Оцените необходимость: Используйте постоянные соединения, если установка соединения с базой данных является узким местом в производительности.
Мониторинг: Следите за количеством активных соединений и состоянием базы данных, чтобы избежать превышения лимитов и других проблем.
Очистка ресурсов: Убедитесь, что скрипты корректно завершают транзакции и освобождают ресурсы перед завершением работы.
Тестирование: Проведите нагрузочное тестирование с включёнными и отключёнными постоянными соединениями, чтобы определить оптимальный вариант для вашего приложения.
Таким образом, постоянные соединения в PDO могут быть полезны для повышения производительности, но требуют внимательного подхода и мониторинга для предотвращения потенциальных проблем.
Какие различия между первичным и уникальным ключами?

«Первичный ключ» (Primary Key) и «уникальный ключ» (Unique Key) — это оба типа ограничений баз данных, используемых для обеспечения уникальности значений в столбцах таблиц. Однако существуют определенные различия в их использовании и семантике:

Уникальность:

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

Уникальный ключ: Уникальный ключ также гарантирует уникальность значений в столбце или группе столбцов. Однако в отличие от первичного ключа, столбец, имеющий уникальный ключ, может содержать значение NULL, и таблица может иметь несколько строк с NULL в уникальном ключе.

NULL-значения:

Первичный ключ: Не может содержать NULL-значений. Все значения первичного ключа должны быть заполнены.

Уникальный ключ: Может содержать одно NULL-значение. Если столбец с уникальным ключом разрешает NULL, то однако может быть только одна строка с NULL в этом столбце.

Число ключей:

Первичный ключ: В таблице может быть только один первичный ключ.

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

Семантика использования:

Первичный ключ: Используется для однозначной идентификации каждой строки в таблице. Часто используется в качестве внешнего ключа в других таблицах.

Уникальный ключ: Используется для обеспечения уникальности значений, но не обязательно для идентификации каждой строки. Может использоваться, например, для уникальных номеров телефонов или электронных адресов в таблице клиентов.
👍2👾2
Как вы используете систему событий в Laravel?

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

В этом примере мы создали событие UserRegistered и слушатель SendWelcomeEmail. Когда пользователь регистрируется, мы можем отправить событие UserRegistered, а слушатель SendWelcomeEmail обработает это событие, отправив новому пользователю приветственное письмо.
Что такое миграции?

Миграции (migrations) обозначают процесс изменения структуры базы данных. Этот процесс позволяет разработчикам эффективно управлять и обновлять схему базы данных в процессе развития приложения, минимизируя при этом потерю данных.

Основные концепции миграций в PHP включают:

1️⃣Создание миграции: Разработчик определяет, какие изменения нужно внести в базу данных, и записывает их в виде миграции. Это может быть создание новой таблицы, добавление/удаление столбца и т.д.

2️⃣Применение миграции: При необходимости разработчик применяет миграции к базе данных. Это приводит к выполнению всех определенных в миграциях SQL-запросов, изменяющих структуру базы данных.

3️⃣Откат миграции: В случае необходимости можно откатывать миграции, что означает отмену изменений, внесенных предыдущей миграцией. Это полезно, например, при отладке или при необходимости вернуть базу данных к предыдущему состоянию.

Примеры PHP-фреймворков и инструментов, предоставляющих возможности для работы с миграциями, включают Laravel (через механизм миграций Laravel), Symfony (Doctrine Migrations), Phinx и другие. В этих фреймворках миграции часто реализуются в виде кода на PHP, обеспечивая удобство в создании и управлении изменениями в базе данных.
Как очистить кэш Symfony?

Для очистки кэша в Symfony можно использовать команду «cache:pool:clear».

С помощью этой команды вы можете удалить все данные из директории хранилища проекта. В Symfony поставляются три стандартных очистителя кэша:

app_clearer, system_clearer и global_clearer.
🚨 Смешные новости про IT теперь в одном канале

Мы запустили @hahacker_news — наш новый юмористический IT-канал.

Туда будем постить лучшие шутки до 19го мая, которые вы присылали на конкурс.

👉 @hahacker_news — голосование уже идёт, переходите, читайте, угарайте и оставляйте реакции
Опишите жизненный цикл HTTP-запроса.

Жизненный цикл HTTP-запроса в PHP можно разделить на следующие этапы:

1️⃣ Инициация запроса: Когда клиент отправляет HTTP-запрос на сервер, он инициирует процесс обработки запроса. В PHP это может быть инициировано, например, через браузер или с помощью команды curl в командной строке.

2️⃣ Маршрутизация: После получения запроса сервер должен определить, какой код или файл должен обрабатывать этот запрос. В PHP это может быть определено с помощью файла .htaccess или механизма маршрутизации, такого как маршрутизатор в фреймворке.

3️⃣ Обработка запроса: Когда PHP определяет, какой код или файл должен обработать запрос, он запускает этот код или файл. Этот этап включает выполнение кода, чтение и обработку данных, выполнение операций с базой данных и другие операции, необходимые для обработки запроса.

4️⃣ Генерация и отправка ответа: После обработки запроса PHP генерирует данные, которые должны быть отправлены обратно клиенту. Это может включать в себя генерацию HTML-страницы, отправку изображений, создание и отправку JSON-ответов и т. д. Затем PHP отправляет созданный ответ обратно на клиентскую сторону.

5️⃣ Завершение обработки запроса: После отправки ответа PHP завершает обработку запроса, освобождает ресурсы, которые были использованы во время обработки, и завершает свое выполнение.
👍2🌚2🤔1
Как работает JIT-компилятор в PHP 8, и когда он дает реальный прирост производительности?

JIT-компилятор (Just-In-Time), представленный в PHP 8, представляет собой значительное нововведение, направленное на повышение производительности за счёт компиляции PHP-кода в машинный код во время выполнения.

⚙️ Как работает JIT в PHP 8

В традиционном исполнении PHP-кода интерпретатор Zend Engine преобразует PHP-скрипты в байткод (опкоды), который затем интерпретируется при каждом запросе. С внедрением JIT-компилятора этот процесс дополняется возможностью компиляции часто вызываемых частей кода непосредственно в машинный код, который может выполняться напрямую процессором, минуя интерпретатор. Это позволяет ускорить выполнение кода, особенно в случаях интенсивных вычислений. JIT в PHP 8 работает в двух режимах: function JIT (компиляция целых функций) и tracing JIT (компиляция часто используемых участков кода).

🚀 Когда JIT действительно улучшает производительность

Хотя JIT-компиляция может значительно ускорить выполнение определённых типов задач, её влияние на производительность зависит от характера приложения:

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

Типичные веб-приложения: Для большинства веб-приложений, таких как сайты на WordPress или фреймворках Laravel и Symfony, прирост производительности от JIT незначителен, поскольку основное время выполнения уходит на операции ввода-вывода, работу с базами данных и сетевые запросы, которые не ускоряются JIT-компиляцией.

⚠️ Возможные недостатки и ограничения

Сложность отладки: Ошибки в JIT-компилированном коде могут быть труднее для диагностики, особенно если они приводят к сбоям или некорректному поведению.

Совместимость: Некоторые расширения или специфические конструкции PHP-кода могут не работать корректно с JIT, что требует дополнительного тестирования при его включении.

Потребление ресурсов: JIT-компиляция требует дополнительной памяти для хранения скомпилированного кода, что может быть критично на серверах с ограниченными ресурсами.
👍5
Как PHP обрабатывает ключи массива с разными типами данных, такими как 1, «1», 1.5 и true?

В PHP ключи массива могут быть либо целыми числами (int), либо строками (string). При использовании других типов данных в качестве ключей PHP автоматически приводит их к допустимому типу по определённым правилам:

Целые числа (int): Используются напрямую без изменений.

Строки (string):
Если строка представляет собой допустимое десятичное целое число (например, «1»), она преобразуется в соответствующее целое число (1).
Строки, содержащие недопустимые для преобразования символы (например, «08»), остаются строками.

Числа с плавающей запятой (float): Преобразуются в целые числа путём отбрасывания дробной части. Например, 1.5 становится 1.

Булевы значения (bool): true преобразуется в 1, а false — в 0.
Это означает, что при использовании значений 1, «1», 1.5 и true в качестве ключей массива, все они будут приведены к одному и тому же целому числу 1. В результате, каждый последующий элемент с этим ключом перезапишет предыдущий.

Начиная с PHP 8.1, при неявном приведении float к int (например, при использовании 1.5 в качестве ключа массива) PHP выдаёт предупреждение о потере точности. Это направлено на предотвращение неожиданных результатов из-за автоматического преобразования типов.

Для более подробной информации вы можете ознакомиться с официальной документацией PHP по массивам
👍11
Чем отличается Dependency Injection от Service Locator?

Dependency Injection (DI) и Service Locator — это два различных подхода к управлению зависимостями в PHP.

Механизм получения зависимостей:

Dependency Injection (DI): Зависимости передаются (внедряются) в объект во время создания этого объекта. Это может быть выполнено через конструктор, методы или свойства объекта.

Service Locator: Объект запрашивает зависимости через централизованный сервис (локатор служб), который предоставляет доступ к нужным службам.

Видимость зависимостей:

Dependency Injection (DI): Зависимости явным образом передаются, что делает их видимыми и понятными. Код становится более явным и легким для понимания.

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

Тестирование:

Dependency Injection (DI): Обеспечивает легкость тестирования, поскольку зависимости могут быть заменены заглушками (mocks) или фиктивными объектами, что облегчает написание юнит-тестов.

Service Locator: Может усложнить тестирование, так как локатор служб может предоставлять реальные зависимости, и контроль над ними может быть менее прозрачным.

Связанность с контейнером:

Dependency Injection (DI): Может быть использован совместно с контейнером зависимостей, но DI не обязан быть привязан к конкретному контейнеру.

Service Locator: Обычно тесно связан с конкретным локатором служб, что может усложнить замену локатора в будущем.

Производительность:

Dependency Injection (DI): Обычно оценивается как менее затратный с точки зрения производительности, так как разрешение зависимостей происходит во время создания объекта.

Service Locator: Может вызывать дополнительные затраты на производительность, так как объекты могут обращаться к локатору в любой момент выполнения программы.
👍8
Вопрос по Git. В чем разница между merge и rebase?

merge и rebase — это два различных подхода к интеграции изменений в Git.

Merge:

Когда вы выполняете merge, Git создает новый коммит, который объединяет изменения из двух (или более) веток.
Этот коммит имеет два родителя — по одному от каждой ветки.
После слияния ветки сохраняют свою структуру, история коммитов не переписывается.
Merge часто создает «соединительный» коммит.

Rebase:

Когда вы выполняете rebase, Git берет изменения из одной ветки и применяет их к другой ветке, как если бы они были там изначально.
Это переписывает историю коммитов, создавая новые коммиты для изменений в другой ветке.
История становится линейной, и смотрится так, как будто изменения были внесены последовательно.

Сравнение:

Merge сохраняет структуру истории, но может создать дополнительные коммиты-соединители.
Rebase создает более линейную историю, но переписывает коммиты и может быть опасен при работе с общими ветками.

Выбор между merge и rebase зависит от предпочтений команды и конкретного контекста проекта. Важно помнить, что rebase изменяет историю коммитов, поэтому его следует использовать только для локальных веток, которые вы еще не отправили в общий репозиторий.
👍3
Как использовать встроенную систему аутентификации в Laravel?

Laravel предоставляет встроенную систему аутентификации, которая может быть использована для аутентификации и авторизации пользователей.

В этом примере мы создали форму входа, которая отправляется на маршрут входа. Когда пользователь отправляет форму, мы можем использовать метод Auth::attempt, чтобы попытаться войти в систему. Если вход будет успешным, мы можем перенаправить пользователя на маршрут к дашборду.

Мы также можем защитить определенные маршруты, применив промежуточное ПО auth, которое гарантирует, что только аутентифицированные пользователи смогут получить доступ к маршруту.
Почему выражение $x = true and false; выводит bool(true)?

В выражении $x = true and false; результатом будет bool(true) из-за особенностей приоритетов операторов в PHP.

📌 Приоритет операторов
В PHP оператор присваивания = имеет более высокий приоритет, чем логический оператор and. Это означает, что выражение интерпретируется как:

($x = true) and false;

Здесь сначала выполняется присваивание $x = true, а затем результат этого выражения (true) используется в логической операции true and false, которая возвращает false. Однако это не влияет на значение переменной $x, которая уже была установлена в true.

Как получить ожидаемый результат
Если вы хотите, чтобы переменная $x получила результат логического выражения true and false (то есть false), необходимо использовать скобки для изменения порядка выполнения:

$x = (true and false);

Теперь сначала выполняется логическая операция true and false, результатом которой является false, и затем это значение присваивается переменной $x.

🔍 Альтернативный подход
Также можно использовать логический оператор &&, который имеет более высокий приоритет, чем and:

$x = true && false;

В этом случае выражение интерпретируется как:

$x = (true && false);

И переменной $x будет присвоено значение false, как и ожидалось.
👍3👾1
🥵 Устали от статей, где эйчары рассказывают, как на самом деле выглядит рынок труда в ИТ?

Мы тоже! Поэтому решили узнать правду и представить ее всем айтишникам — но нам нужен ваш голос. Опрос займет 3 минуты, а пользы — вагон для всего сообщества.

Результаты этого исследования помогут понять, как специалистам искать работу в 2025-м (а компаниям — специалистов).

👉 Если вы готовы сделать свой вклад в исследование — велком: https://clc.to/VGgyNA