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

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
😎 Вы просили — мы сделали. Самый долгожданный анонс этого лета!

Мы открываем набор на второй поток курса «AI-агенты для DS-специалистов»!

На курсе мы учим главному навыку 2025 года: не просто «болтать» с LLM, а строить из них рабочие системы с помощью Ollama, RAG, LangChain и crew.ai.

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

💸 Цена 49 000 ₽ действует только в эти выходные — до 17 августа. С понедельника будет дороже.

👉 Занять место
В чём разница между методами __sleep и __wakeup в PHP?

__sleep() и __wakeup() — это магические методы в PHP, которые используются в связке с сериализацией и десериализацией объектов. Вот их краткое описание:

__sleep():
Этот метод вызывается автоматически, когда объект готовится к сериализации (например, с помощью функции serialize()).
Он позволяет определить, какие свойства объекта должны быть сериализованы. Вы возвращаете массив с именами свойств, которые должны быть сериализованы.
Если у вас есть чувствительные данные или ресурсы, которые не должны быть сериализованы, вы можете удалить или изменить их в этом методе.

__wakeup():
Этот метод вызывается автоматически при десериализации объекта (например, с помощью функции unserialize()).
Он позволяет повторно инициализировать ресурсы или выполнять любую необходимую настройку после десериализации.
Если ваш объект требует специальной обработки после десериализации, вы можете определить это поведение в этом методе.

В заключение, __sleep() используется для контроля над тем, какие свойства сериализуются, а __wakeup() используется для выполнения действий после десериализации. Они предоставляют хуки для настройки процесса сериализации и десериализации объектов в PHP.
Git. Что такое stash и зачем он нужен?

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

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

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

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

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

Для использования stash в Git можно воспользоваться командой git stash. Эта команда сохраняет текущие изменения в стеке stash. Позже, когда вам потребуется, вы можете применить эти изменения с помощью команды git stash apply или git stash pop. git stash apply применяет изменения, не удаляя их из stash, в то время как git stash pop применяет изменения и сразу удаляет их из stash.
4👍4
Какое криптографическое расширение предоставляет возможность генерации и проверки цифровых подписей?

В PHP цифровые подписи можно генерировать и проверять с помощью расширения OpenSSL, которое предоставляет функции для различных криптографических операций, включая цифровые подписи.
🔥 Последняя неделя, чтобы забрать курс по 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): После того как все тесты прошли успешно, код можно улучшить, переработав его для улучшения структуры, производительности и т. д., сохраняя при этом поведение программы неизменным. Это позволяет улучшать код без риска нарушения его функциональности.