Библиотека собеса по PHP | вопросы с собеседований
3.18K subscribers
177 photos
5 videos
118 links
Вопросы с собеседований по PHP и ответы на них.

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
🔥 Последняя неделя, чтобы забрать курс по AI-агентам по старой цене!

Пока вы тестируете Copilot, другие уже учатся строить AI-агентов, которые реально работают на бизнес. Хватит отставать!

Наш курс — это концентрат практики по LangChain и RAG. Улучшенная версия, доработанная по отзывам первого потока.

📆 Старт — 15 сентября.

💸 Цена 49 000 ₽ — только до 24 августа.

👉 Зафиксировать цену
🥱6
Для чего используется функция func_num_args()?

В PHP функция func_num_args() используется для получения количества аргументов, переданных в функцию. Она часто применяется в случае переменного числа аргументов, когда функция может принимать различное количество параметров.

В примере функция sum() принимает любое количество аргументов и вычисляет их сумму. Внутри функции func_num_args() используется для определения количества переданных аргументов, а func_get_arg($i) — для получения значения каждого аргумента по его индексу ($i). Это позволяет функции динамически обрабатывать разное количество аргументов.
👍1👾1
Какие техники вы используете для оптимизации запросов к базе данных в Laravel?

1. Жадная загрузка (Избегание проблемы N+1)
По умолчанию Laravel использует ленивую загрузку, что может вызвать проблему N+1 запроса. Например, когда выполняется запрос для коллекции записей, а затем для каждой записи делается отдельный запрос к связанным данным. Жадная загрузка помогает избежать этой проблемы, выполняя один запрос для связанных данных.

// Ленивая загрузка (неэффективно)
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name;
}

// Жадная загрузка (оптимизировано)
$posts = Post::with('user')->get();
foreach ($posts as $post) {
echo $post->user->name;
}


2. Использование select для ограничения извлекаемых столбцов
Часто нет необходимости извлекать все столбцы таблицы. Используйте метод select, чтобы выбирать только нужные данные.

// Извлечение всех столбцов (неэффективно)
$users = User::all();

// Извлечение только необходимых столбцов (оптимизировано)
$users = User::select('id', 'name', 'email')->get();


3. Чанковка запросов

При работе с большими наборами данных загрузка всего набора может перегрузить память. Используйте чанковку для извлечения данных небольшими порциями.
// Извлечение по 100 записей за раз
User::chunk(100, function ($users) {
foreach ($users as $user) {
// Обработка каждого пользователя
}
});


4. Использование whereIn вместо нескольких запросов
Если вам нужно проверить несколько значений для одного столбца, используйте whereIn, чтобы избежать нескольких отдельных запросов.

// Вместо выполнения нескольких запросов
$users1 = User::where('role_id', 1)->get();
$users2 = User::where('role_id', 2)->get();

// Использование whereIn для одного запроса
$users = User::whereIn('role_id', [1, 2])->get();


6. Индексация столбцов базы данных
Убедитесь, что столбцы, по которым часто выполняются запросы (например, используемые в условиях where), имеют соответствующие индексы в базе данных. Это значительно ускорит выполнение запросов.

Индексы можно создать через миграции Laravel:

Schema::table('users', function (Blueprint $table) {
$table->index('email');
});


7. Избегайте COUNT(*) с Eloquent, если это не нужно
Вместо загрузки всех строк только для их подсчета, используйте функцию count() напрямую.
// Неэффективно: загрузка всех записей для подсчета
$users = User::all()->count();

// Эффективно: использование count напрямую
$userCount = User::count();


8. Кэширование частых запросов

Если одни и те же запросы выполняются часто, рассмотрите возможность кэширования их результатов, чтобы уменьшить нагрузку на базу данных.
// Кэширование результата запроса на 60 минут
$users = Cache::remember('users', 60, function () {
return User::all();
});


9. Использование DB::raw для сложных SQL-запросов
Для сложных запросов или в случаях, когда требуются определенные SQL-оптимизации (например, использование функций или подзапросов), можно использовать
DB::raw.

10. Использование пула подключений к базе данных
Использование пула подключений (connection pooling), где это возможно, позволяет повторно использовать существующие подключения к базе данных вместо открытия новых для каждого запроса. Это может значительно сократить задержки выполнения запросов, хотя это больше относится к настройкам сервера, чем к самому Laravel.
👍10🔥1🌚1
This media is not supported in your browser
VIEW IN TELEGRAM
📅 Сегодня в 19:00 МСК — бесплатный вебинар с Марией Жаровой.

Тема: «Введение в ML: как спрогнозировать стоимость недвижимости».

🔹 Разберём задачу прогноза стоимости недвижимости.
🔹 Покажем пошагово, как собрать первую модель.
🔹 Получите готовые скрипты для старта.

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

👉 Регистрируйтесь
🥱2
Как вы понимаете Exception flow в контексте PHP?

Exception flow в контексте PHP относится к управлению ошибками и исключениями во время выполнения программы. Когда возникает ошибка или неожиданное условие, которое не может быть обработано нормальным образом, PHP может выбросить исключение (exception).

Процесс обработки исключений в PHP следующий:

Выброс исключения (Throwing an Exception): Когда в коде происходит ошибка или неожиданное событие, программа может создать объект исключения и «бросить» его с помощью ключевого слова throw.

Перехват исключения (Catching an Exception): Для обработки исключений можно использовать блоки try-catch. Код, который может вызывать исключение, помещается в блок try, а блок catch используется для обработки возможного исключения.

Finally: Ключевое слово finally может использоваться вместе с блоками try-catch для выполнения кода в любом случае, независимо от того, возникло исключение или нет.
Что вам известно о шаблонах, которые применяются в ORM?

В контексте Object-Relational Mapping (ORM), шаблоны (или паттерны) играют важную роль в проектировании и организации работы с базой данных. Вот несколько распространенных шаблонов, используемых в ORM:

Шаблон ActiveRecord: Этот шаблон описывает объект, который инкапсулирует как данные, так и поведение для работы с этими данными. Обычно каждая запись в базе данных представляется объектом ActiveRecord. Он обеспечивает прямое соответствие между объектами и записями в базе данных.

Шаблон Repository: Repository предоставляет абстракцию для работы с коллекциями объектов. Он предоставляет методы для поиска, сохранения, удаления и запросов к данным. Репозиторий инкапсулирует логику доступа к данным и предоставляет интерфейс для работы с этими данными.

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

Шаблон Unit of Work: Этот шаблон отслеживает изменения, сделанные с объектами в рамках одной транзакции базы данных. Он обеспечивает согласованность данных и управляет коммитом или откатом изменений. Шаблон Unit of Work также может использоваться для оптимизации работы с базой данных, пакетного сохранения изменений и управления транзакциями.

Эти шаблоны предоставляют средства для упрощения работы с базой данных в объектно-ориентированных приложениях, обеспечивая гибкость, производительность и согласованность данных. Их использование позволяет разработчикам эффективно работать с данными и минимизировать повторение кода.
👍2
Какова разница между функциями session_unregister() и session_unset()?

В PHP функции session_unregister() и session_unset() использовались для работы с переменными сессии. Однако начиная с PHP 5.3.0, функция session_unregister() была признана устаревшей, и её использование крайне не рекомендуется. Вместо неё следует использовать unset($_SESSION['имя_переменной']).

session_unregister() (Устарела):
Эта функция использовалась для удаления глобальной переменной из текущей сессии.
Была признана устаревшей в PHP 5.3.0 и удалена в PHP 5.4.0.
Основная причина устаревания связана с тем, что она зависела от устаревшей функциональности register_globals, которая считается уязвимостью безопасности.

session_unset():
Эта функция используется для освобождения всех переменных сессии.
Она не уничтожает саму сессию или сбрасывает сессионную куку; она только очищает данные сессии.
Рекомендуется использовать unset($_SESSION['имя_переменной']) для удаления определённой переменной сессии.

В современной разработке на PHP рекомендуется использовать unset($_SESSION['имя_переменной']) или $_SESSION['имя_переменной'] = null; для удаления конкретных переменных сессии и session_unset() для очистки всех переменных сессии. Использование session_unregister() следует избегать из-за её устаревания и потенциальных проблем с безопасностью, связанных с register_globals.
Что такое план выполнения запроса и как его узнать?

План выполнения запроса (Query Execution Plan) — это детальный анализ того, как база данных будет выполнять запрос, включая порядок обработки данных, используемые индексы, методы соединения и другие оптимизации запроса. Понимание плана выполнения запроса может помочь оптимизировать производительность запросов, выявляя возможные проблемы и улучшая структуру запроса или индексы.

В разных системах управления базами данных (СУБД) есть различные способы получения плана выполнения запроса. Ниже приведены общие методы для некоторых из них:

MySQL / MariaDB:
Используйте ключевое слово EXPLAIN перед запросом SQL.

PostgreSQL:
Используйте ключевое слово EXPLAIN перед запросом SQL.
Для более подробного анализа используйте ключевое слово EXPLAIN ANALYZE.

SQL Server:
Используйте ключевое слово EXPLAIN перед запросом SQL.
Для более подробного анализа используйте команду SET SHOWPLAN_TEXT ON;, а затем выполните запрос.

SQLite:
Используйте ключевое слово EXPLAIN QUERY PLAN перед запросом SQL.

Oracle:
Используйте инструкцию EXPLAIN PLAN FOR.

Полученный план выполнения запроса может быть сложным для понимания, но он предоставляет ценную информацию о том, как база данных обрабатывает ваш запрос, что может помочь в оптимизации его производительности.
🏃‍♀️ Новый поток курса — собери своих AI-агентов

7 октября стартует второй поток курса «AI-агенты для DS-специалистов».
За 5 недель вы научитесь собирать агентов, которые уже сейчас будут помогать бизнесу.

В кружке выше Максим Шаланкин, наш преподаватель, рассказывает подробнее — включай, чтобы не пропустить.

👉 Записаться на курс
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое TDD?

TDD (Test-Driven Development) — это методология разработки программного обеспечения, в которой разработка программы начинается с написания тестов, которые определяют желаемое поведение программы. Затем код разрабатывается и изменяется таким образом, чтобы эти тесты проходили успешно.

Процесс TDD обычно состоит из трех шагов, известных как «Красный», «Зеленый» и «Рефакторинг»:

Красный (Red): Сначала пишутся тесты для новой функциональности или для исправления ошибок. Поскольку этот этап выполняется до написания реализации, все тесты должны завершаться неудачей (иметь статус «красный»).

Зеленый (Green): Затем пишется минимальное количество кода, необходимое для прохождения тестов. Цель — сделать все тесты прошедшими (иметь статус «зеленый»).

Рефакторинг (Refactor): После того как все тесты прошли успешно, код можно улучшить, переработав его для улучшения структуры, производительности и т. д., сохраняя при этом поведение программы неизменным. Это позволяет улучшать код без риска нарушения его функциональности.
This media is not supported in your browser
VIEW IN TELEGRAM
Так, владелец макбука. Хватит позировать в кофейне.

Настоящее портфолио — это не стикеры на крышке, а проект с чистым кодом, README и рабочей демкой.

Не знаешь, как такой собрать? Научим. Наш курс «ML для старта в Data Science» — это пошаговый гайд к проекту, за который не стыдно.

ОСТАЛАСЬ НЕДЕЛЯ, чтобы забрать его по старой цене в 44.000 ₽. С 1 сентября — всё.

🎁 И да, при покупке курса ML до 1 сентябрякурс по Python получаешь бесплатно.

👉 Апгрейд от «вайба» до «оффера» тут
Что такое функции soundex() и metaphone() в PHP?

Функция soundex():
Функция soundex() вычисляет звуковой индекс строки.
Soundex — это фонетический алгоритм, который назначает код слову на основе его произношения.
Он применяется преимущественно для поиска слов, которые звучат похоже, но могут быть написаны по-разному.
Функция сокращает слова до четырехсимвольного кода, который представляет его звучание.
Это полезно для задач, таких как поиск имен, которые звучат похоже, но имеют разные написания.

Функция metaphone():
Функция metaphone() вычисляет метафонический ключ строки.
Metaphone — это еще один фонетический алгоритм, но он более продвинут, чем Soundex.
Он преобразует слово в фонетический ключ, состоящий из одной или нескольких букв.
В отличие от Soundex, Metaphone учитывает вариации произношения и более эффективен для английских слов.
🤔7👍5
📢 Какой сетап идеально подойдёт для разработки AI-агента?

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

❤️ — 1
👍 — 2
⚡️ — 3
👏 — 4
🔥 — 5
🎉 — 6
😁 — 7
😍 — 8
🤩 — 9

Какой бы сетап ни был, без AI-агентов в 2025 всё равно далеко не уедешь.

👉 Научим, как строить агентов, которые кодят с тобой
🥱12🔥4😍21👍1
Что такое Composer?

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

Основные функции Composer:

Установка зависимостей: Composer позволяет определить необходимые библиотеки и их версии в файле composer.json, а затем установить их с помощью команды composer install.

Обновление зависимостей: После установки библиотек, можно обновить их до последних версий, указанных в файле composer.json, с помощью команды composer update.

Автозагрузка классов: Composer автоматически создает файл автозагрузки, который позволяет использовать классы из установленных зависимостей без необходимости явного подключения файлов.

Автоматическое разрешение зависимостей: Composer управляет разрешением зависимостей, учитывая совместимость версий между различными библиотеками.

Создание собственных пакетов: Composer позволяет создавать собственные пакеты для повторного использования в различных проектах и их публикации в репозитории Packagist для общего использования.

Использование Composer значительно упрощает управление зависимостями в PHP-проектах и помогает поддерживать их актуальность и безопасность.
2🥱2
Как Laravel упрощает тестирование и почему это важно?

Laravel упрощает тестирование благодаря встроенным инструментам и структуре, которые способствуют разработке тестируемого кода, обеспечивая правильную работу приложения и его удобное обслуживание по мере роста. Тестирование важно, потому что оно помогает выявлять ошибки на раннем этапе, гарантирует, что новые функции не нарушат существующую функциональность, и даёт уверенность в том, что код работает, как ожидалось, в продакшене.

1. Инструменты для тестирования и настройка окружения

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

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

2. Интеграция с PHPUnit

Интеграция с PHPUnit: Laravel использует PHPUnit как основную тестовую среду, и предоставляет конфигурационный файл phpunit.xml, предварительно настроенный для Laravel-проектов. Это обеспечивает стандартизированное тестирование и широкую поддержку для написания и запуска юнит- и функциональных тестов.

Встроенные утверждения: Laravel предоставляет множество утверждений, которые упрощают проверку состояния приложения, HTTP-ответов и валидации данных.

3. Юнит-тестирование для изолированных компонентов

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

4. Функциональные тесты для интегрированной функциональности

HTTP-тестирование: HTTP-методы Laravel позволяют тестировать маршруты, ответы, отправку форм и API через простой и читаемый синтаксис, такой как $this->get('/route').

Тестирование браузера: С помощью Laravel Dusk можно проводить сквозное тестирование взаимодействия с JavaScript и фронтендом, симулируя действия пользователя в браузере, что идеально для тестирования сложных пользовательских интерфейсов.

5. Вспомогательные инструменты и фабрики

Фабрики моделей: Фабрики Laravel упрощают генерацию тестовых данных без необходимости вручную создавать экземпляры моделей. Это особенно полезно для тестирования базы данных, так как позволяет быстро создавать данные в различных состояниях.

Сидеры и Faker: Laravel также интегрирован с Faker для генерации фальшивых данных и позволяет использовать сидеры для определения начальных состояний базы данных.
1😁1
Напишите на PHP пример реализации паттерна Singleton.
👍3