Библиотека собеса по PHP | вопросы с собеседований
3.38K subscribers
140 photos
2 videos
68 links
Вопросы с собеседований по PHP и ответы на них.

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

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

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
Что такое идемпотентность?

Идемпотентность — это свойство операции, которое означает, что повторное ее выполнение не приводит к изменению состояния системы после первого выполнения. В контексте веб-разработки и использования HTTP методов, идемпотентность означает, что повторный запрос с одним и тем же набором параметров не изменит состояние сервера.

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

Вот несколько примеров идемпотентных операций:

1. Чтение данных: Операция получения данных из базы данных с помощью SELECT является идемпотентной, потому что повторное выполнение запроса не изменит состояние базы данных.

2. Удаление записи: Операция DELETE является идемпотентной, поскольку повторное выполнение запроса на удаление записи не приведет к ошибке и не изменит состояние базы данных, так как запись уже удалена.

3. Обновление записи: Если обновление записи происходит на основе идентификатора записи и одинаковые значения обновляются несколько раз, то запрос UPDATE будет идемпотентным.
Вакансии «Библиотеки программиста» — ждем вас в команде!

Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉авторов в наше медиа proglib.io
👉контент-менеджеров для ведения телеграм-каналов

Подробности тут

Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴

Ждем ваших откликов 👾
Как вы используете пагинацию в Laravel?

Laravel предоставляет простой способ постраничной обработки записей базы данных с помощью метода paginate.

В этом примере мы используем метод paginate для получения коллекции пользователей и разбивки результатов на страницы по 10 записей в каждой. Затем мы можем выполнить итерацию по пагинированной коллекции с помощью цикла foreach.

Чтобы отобразить ссылки на пагинацию в представлении, мы можем использовать метод links для пагинационной коллекции.
Что такое антипатерны? Приведите несколько примеров

Антипатерны (англ. antipatterns) — это плохие практики в программировании, дизайне и разработке, которые могут привести к проблемам, сложности в сопровождении кода, и общему ухудшению качества программного продукта.

1. Analytical paralysis
Аналитический паралич — считается классическим организационным антипаттерном. Его суть заключается в чрезмерном анализировании ситуации при планировании, так что решение или действие не предпринимаются, по сути парализуя разработку. Зачастую это случается в тех случаях, когда цель состоит в достижении совершенства и полной завершенности периода анализа. Этот антипаттерн характеризуется хождением по кругу (такой себе замкнутый цикл), пересмотром и созданием детальных моделей, что в свою очередь мешает рабочему процессу.

К примеру, вы пытаетесь предугадать вещи уровня: а что если вдруг пользователь захочет создать список сотрудников на основе четвертых и пятых букв их имени, с включением в список проектов, которым они уделили больше всего рабочих часов между Новым Годом и Восьмым марта за четыре предыдущих года? По сути это переизбыток анализа.

2. Spaghetti code
Спагетти-код — это антипаттерн, описывающий часть кода, которая является плохо структурированной, запутанной и трудной для понимания, содержащей много всяких переходов, каких как: оборачивание исключений, условий, циклов.

3.Magic numbers
Магическое числа — это антипаттерн, который затрагивает разнородные константы и переменные в программе без пояснения их цели, смысла. То есть, как правило нет адекватного имени или на крайний случай, комментария, поясняющего, что и зачем. Также как и спагетти код, является одним из наиболее распространённых антипаттернов.

Человек, который не является автором данного кода, с трудом может или вовсе не может объяснить, что это и как оно работает (да и сам автор со временем не сможет). В итоге при изменении этого числа или его удалении код магически перестает работать вовсе.
Какие различия между первичным и уникальным ключами?

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

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

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

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

NULL-значения:

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

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

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

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

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

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

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

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

Замыкание в PHP и JavaScript имеют некоторые сходства, но также имеют и некоторые различия.

В PHP:

1. Замыкание, так же как и функция, является объектом, который можно присвоить переменной.
2. В PHP замыкания создаются с использованием анонимных функций с помощью ключевого слова `function`.
3. Замыкания в PHP в основном используются для создания анонимных функций, которые могут захватывать и использовать переменные из объемлющего контекста.
4. Замыкания в PHP имеют доступ только к переменным, которые были явно переданы в них или объявлены в объемлющей функции с помощью ключевого слова `use`.
5. В PHP замыкания можно возвращать из других функций и передавать как аргументы в другие функции.

В JavaScript:

1. Замыкание в JavaScript создается при создании функции внутри другой функции.
2. Замыкания в JavaScript могут захватывать и использовать переменные из объемлющего контекста даже после завершения выполнения внешней функции.
3. В JavaScript замыкания используются для создания приватных переменных и функций,
Как вы используете систему событий в Laravel?

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

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

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

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

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

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

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

Примеры PHP-фреймворков и инструментов, предоставляющих возможности для работы с миграциями, включают Laravel (через механизм миграций Laravel), Symfony (Doctrine Migrations), Phinx и другие. В этих фреймворках миграции часто реализуются в виде кода на PHP, обеспечивая удобство в создании и управлении изменениями в базе данных.
💵⚡️ДАРИМ 40 000₽ ЗА ВИДЕО

Конкурс года в «Библиотеке программиста»: смонтируйте короткий вертикальный ролик формата Shorts/Reels* на тему программирования и разработки — лучший автор получит 40 тысяч рублей 🤑

Подробные условия:
➡️смонтируйте короткий смешной вертикальный ролик (можно и нужно использовать мемы)
➡️отправьте нам в бота @ProglibContest_bot
➡️лучшие ролики (по мнению редакции) мы будем выкладывать в канал и в наш инстаграм*
➡️тот, чей ролик соберет больше всего просмотров в инстаграм*, получит приз — 40 тысяч рублей

Какие ролики мы не принимаем:
😟не вашего авторства (проверим!)
😟длинные, невертикальные, несмешные

Таймлайн:
2 августа — заканчиваем принимать видео
⬇️
3 августа — начинаем загружать лучшие видео в инстаграм
⬇️
9 августа — подводим итоги

*Организация Meta признана экстремистской в РФ
Please open Telegram to view this post
VIEW IN TELEGRAM
Как очистить кэш Symfony?

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

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

app_clearer, system_clearer и global_clearer.
Опишите жизненный цикл HTTP-запроса.

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

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

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

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

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

5️⃣ Завершение обработки запроса: После отправки ответа PHP завершает обработку запроса, освобождает ресурсы, которые были использованы во время обработки, и завершает свое выполнение.
✍️ «Библиотека программиста» находится в поиске автора на написание книжных рецензий

Кто нужен?
● Энтузиасты (джуны и выше), которые которые разбираются в IT
● Любители книг, которые хотели бы получать деньги за чтение и написание рецензий
● Работаем с самозанятыми (компенсируем налог), ИП

Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴

✉️ Станьте частью нашей команды — присылайте резюме и примеры работ [email protected]
За и против: становиться ли айтишником в 2024 году

В 2024 году IT-специалисты остаются на пике популярности. Но стоит ли вам становиться одним из них? Рассмотрим основные аргументы, чтобы понять, стоит ли вам становиться IT-специалистом в нашей статье.👇

🔗 Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
Чем отличается 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: Может вызывать дополнительные затраты на производительность, так как объекты могут обращаться к локатору в любой момент выполнения программы.
Вопрос по Git. В чем разница между merge и rebase?

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

Merge:

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

Rebase:

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

Сравнение:

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

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

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

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

Мы также можем защитить определенные маршруты, применив промежуточное ПО auth, которое гарантирует, что только аутентифицированные пользователи смогут получить доступ к маршруту.
Расскажите о SPL-библиотеке (Reflection, autoload, структуры данных).

Стандартная библиотека PHP (Standard PHP Library, SPL) — коллекция классов и интерфейсов для решения стандартных проблем в PHP. Библиотека была введена в PHP 5 и доступна по умолчанию, начиная с PHP 5.0.0. Начиная с версии PHP 5.3.0 данное расширение не может быть отключено и доступно всегда.

1. Reflection
Reflection — это механизм, который предоставляет информацию о классах, интерфейсах, методах, свойствах и других элементах программы во время выполнения. Это мощный инструмент для анализа и манипуляции кода на уровне метаданных.

2. Autoload
Autoload в PHP позволяет автоматически подключать классы по мере их использования, что делает код более модульным и удобным для обслуживания.

3. Структуры данных в SPL
SPL предоставляет ряд стандартных структур данных, таких как очереди, стеки, кучи и т. д. Например, класс SplQueue представляет собой двусвязную очередь. Такие структуры данных предоставляют удобные методы для манипуляции данными, что может быть полезно в различных сценариях программирования.

Подробнее о различных структурах данных в SPL здесь.
Что такое куча и стек?

Куча (heap) и Стек (stack) — это две основных области в памяти программы, где хранятся данные, но они используются по-разному.

Стек (Stack):

Что это: Стек представляет собой линейную структуру данных, где операции выполняются в порядке Last In, First Out (LIFO).
Использование: В стеке хранятся локальные переменные функций, адреса возврата, параметры функций и прочая информация о выполнении функций.
Жизненный цикл: Стековая память выделяется и освобождается автоматически при входе и выходе из функций.
Ограничения: Ограниченный размер, быстрый доступ к данным.

Куча (Heap):

Что это: Куча — это динамическая область памяти, где хранятся данные, созданные во время выполнения программы.
Использование: В куче располагаются объекты, массивы и другие динамические данные, управляемые программистом.
Жизненный цикл: Ручное управление выделением и освобождением памяти (например, через new и delete в C++ или malloc и free в C).
Ограничения: Больший размер, более гибкое использование, но требует аккуратного управления памятью, чтобы избежать утечек или дефрагментации.
Какая разница между MyISAM и InnoDB? В каких случаях и что лучше применять?

MyISAM и InnoDB — это два самых распространенных типа таблиц в MySQL. Отличия между ними заключаются в следующем:

1. Система хранения данных: MyISAM использует таблицы с фиксированной длиной строк, в то время как InnoDB использует таблицы с переменной длиной строк. Это означает, что MyISAM обычно быстрее при выполнении операций чтения, а InnoDB более эффективен при выполнении операций записи.

2. Транзакции и целостность данных: InnoDB поддерживает ACID-транзакции (Atomicity, Consistency, Isolation, Durability — Атомарность, Согласованность, Изолированность, Устойчивость). Это означает, что в случае сбоя данных, InnoDB может откатить все изменения, сохраняя целостность данных. MyISAM не поддерживает транзакции и не обеспечивает такую же уровень целостности данных.

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

4. Внешние ключи: InnoDB поддерживает внешние ключи (foreign keys), что облегчает поддержку связей между таблицами и обеспечивает целостность данных. MyISAM не поддерживает внешние ключи.

Итак, в каких случаях что лучше использовать:

🔸 Если нагрузка на базу данных состоит главным образом из операций чтения, то MyISAM может быть предпочтительнее из-за его более высокой производительности.
🔸 Если приложение требует поддержку транзакций (например, при обработке платежей или других критически важных операций), или имеется необходимость в внешних ключах для поддержания целостности данных, то InnoDB является более подходящим выбором.

В отличие от MyISAM, InnoDB также более рекомендуется при работе с многопользовательскими приложениями, где одновременно выполняется много операций записи и требуется высокий уровень целостности данных.
Какие структуры данных поддерживает Redis?

Redis поддерживает следующие структуры данных:

1. Строки (Strings): Простейшая структура данных, хранит любую двоичную информацию до 512 Мб. Redis также предоставляет ряд операций для работы со строками, таких как получение, установка значения, инкрементирование и декрементирование числовых значений.

2. Списки (Lists): Упорядоченные коллекции элементов. Списки в Redis могут содержать до 4 миллиардов элементов, и обладают высокой производительностью при выполнении операций добавления, удаления и доступа к элементам из начала или конца списка.

3. Множества (Sets): Это наборы уникальных элементов, без повторов. Множества в Redis могут содержать до 4 миллиардов элементов, и обладают быстрой проверкой принадлежности элемента к множеству, операциями объединения, пересечения и разности множеств.

4. Сортированные множества (Sorted Sets): Это множества, в которых каждый элемент связан с числовым значением. Они используются для упорядочивания элементов внутри множества. Sorted Sets поддерживает эффективное выполнение операций добавления, удаления и обновления элементов, а также получение диапазонов элементов по их очкам.

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

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

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

8. Потоки (Streams): Структура данных, предоставляющая возможность хранения, приема и обработки потоков событий. Потоки позволяют выполнение операций добавления, удаления и обработки элементов потока в хронологическом порядке.

Каждая структура данных в Redis поддерживает свой набор операций, позволяющих эффективно работать с данными в соответствии с требованиями приложения.
Расскажите о утечки памяти в PHP. Приведите примеры.

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

Вот несколько примеров утечек памяти в PHP:

1. Неявное копирование больших данных:
В этом примере функция `str_replace` неявно выполняет копию большого файла в память, что приводит к утечке памяти. Рекомендуется использовать работу с файлами по частям или потоками (stream) для избежания этой проблемы.

2. Открытые ресурсы без явного закрытия:
В этом примере ресурс файла остается открытым после завершения программы, что приводит к утечке памяти. Рекомендуется всегда явно закрывать открытые ресурсы с помощью `fclose($handle);`.

3. Циклические ссылки:
В этом примере создаются два объекта `MyClass`, которые ссылаются друг на друга. Если эти объекты не освобождаются из памяти явным образом, то они продолжат существовать и приведут к утечке памяти. Рекомендуется обнулять ссылки перед выходом из области видимости или использовать сборку мусора (garbage collection) для автоматического удаления недоступных объектов.

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