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

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Какова цель расширения «PHP Data Objects» (PDO), и как его использовать?

Расширение PHP Data Objects (PDO) предназначено для абстрагирования доступа к базам данных в PHP. Основная цель PDO — предоставить единый интерфейс для работы с различными типами баз данных в PHP, включая MySQL, PostgreSQL, SQLite и другие, без необходимости писать специфичный код для каждой базы данных. PDO помогает улучшить безопасность, предоставляя подготовленные запросы и параметризованные запросы для предотвращения атак SQL-инъекций.

Вот базовый обзор того, как использовать PDO:

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

2️⃣Выполнение запросов: После установки соединения можно выполнять SQL-запросы с помощью метода query() или подготовленных запросов для параметризованных запросов.

3️⃣Получение результатов: Результаты запроса можно получить различными способами, такими как получение всех строк, получение одной строки или получение определенных столбцов.

4️⃣Обработка ошибок: Важно грамотно обрабатывать ошибки. PDO выбрасывает исключения для ошибок базы данных, поэтому можно использовать блоки try-catch для их обработки.

Используя PDO, можно писать более переносимый и безопасный код для работы с базами данных в PHP, поскольку оно предоставляет единый интерфейс независимо от используемой базы данных.
Как вы понимаете Special Case / Null Object и где его следует применять?

Special Case / Null Object — это шаблон проектирования, который используется для обработки специальных случаев или значений отсутствия объекта. Он позволяет разработчику избежать проверок на null и обрабатывать такое отсутствие объекта по-особенному.

Null Object — это класс, который реализует интерфейс или абстрактный класс, используемый вместо null. Он предоставляет реализацию методов, которые обрабатываются для отсутствующего объекта, и возвращает пустые значения или выполняет пустые действия.

Null Object можно применять, когда требуется обработать отсутствие объекта без использования проверок на null. Он может быть полезен в таких ситуациях:

1. Вместо проверки на null, можно использовать Null Object, чтобы избежать возникновения исключений или ошибок, связанных с отсутствием объекта и его методов.

2. Null Object может упростить код и избавить от необходимости писать дополнительные условия для обработки null значений.

3. Он также может быть полезен в шаблонном методе, когда необходимо иметь базовую реализацию методов, которые могут быть переопределены в подклассах, и одновременно обрабатывать отсутствие объекта.

Пример применения Null Object в PHP на фото выше

В этом примере, если использовать NullLogger, то метод log не выполняет никаких действий и не вызывает ошибок при отсутствии файла или других ресурсов, которые могут быть связаны с реальным логгером.
Иногда реально ощущение, что нас держат в Матрице.

Большинство сидит, читает статьи про ML, смотрит ролики «как это работает» — и всё.

Сегодня последний день промокода Lastcall (−5000 ₽).
Уже завтра стартует первый вебинар по Машинному обучению — полный набор для выхода из Матрицы.

Кто готов вырваться из симуляции и ворваться в сезон найма?

👾 — я уже в команде Нео
👍 — хочу красную таблетку
🤔 — пока думаю, но интересно

Забирай полный комплект для ML-разработки: Python + Математика + Машинное обучение.
🔥 Скидка 30% действует только до 9 сентября → забираем себе
В чем разница между «mysqli» и «PDO» в PHP?

Оба расширения PHP, mysqli (MySQL Improved) и PDO (PHP Data Objects), предоставляют интерфейс для взаимодействия с базами данных, особенно с MySQL. Однако между ними есть некоторые различия:

1️⃣Стиль интерфейса:

mysqli предоставляет как процедурный, так и объектно-ориентированный интерфейсы для взаимодействия с MySQL. Оно тесно интегрировано с MySQL и предлагает специфические функции, такие как хранимые процедуры и транзакции.
PDO, с другой стороны, предоставляет единый интерфейс для работы с различными базами данных, а не только с MySQL. Оно использует исключительно объектно-ориентированный подход.

2️⃣Поддержка баз данных:

mysqli специфично для баз данных MySQL. Оно оптимизировано для MySQL и предоставляет функции, специфичные для MySQL.
PDO не привязано к какой-либо конкретной базе данных. Оно поддерживает несколько баз данных, таких как MySQL, PostgreSQL, SQLite и т. д. Это делает PDO более гибким, если вам нужно переключаться между разными базами данных.

3️⃣Подготовленные запросы:

Оба расширения поддерживают подготовленные запросы (prepared statements), которые помогают предотвратить атаки SQL-инъекций, отделяя логику SQL от пользовательского ввода. Однако синтаксис реализации немного отличается.

4️⃣Обработка ошибок:

mysqli имеет специальные функции и константы для обработки ошибок MySQL.
PDO использует исключения для обработки ошибок, что делает обработку ошибок более последовательной для различных типов баз данных.

5️⃣API и функциональность:

mysqli предлагает некоторые специфические для MySQL функции, которых нет в PDO, например, возможность работы с несколькими наборами результатов из хранимых процедур.
PDO предоставляет дополнительные функции, такие как именованные заполнители, которые могут сделать запросы более читаемыми и поддерживаемыми.

6️⃣Переносимость:

PDO обеспечивает лучшую переносимость, потому что оно не привязано к конкретной базе данных. Если вам нужно переключить свое приложение на другую базу данных, вам может потребоваться изменить только настройки подключения, а не переписывать все взаимодействия с базой данных.
mysqli более тесно связан с MySQL, поэтому переход к другой базе данных может потребовать более значительных изменений в коде.
Что такое пространства имен в PHP и как их использовать?

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

Как использовать пространства имен в PHP:

1. Определение пространства имен:

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

2. Использование элементов в пространстве имен:

После определения пространства имен вы можете помещать классы, функции, интерфейсы или константы в это пространство имен.

3. Доступ к элементам в пространстве имен:

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

4. Использование псевдонимов:

Также можно определить псевдонимы для пространств имен или отдельных элементов, чтобы упростить их использование, особенно если имена пространств довольно длинные.
Какие способы оптимизации производительности баз данных знаете?

Существует несколько основных способов оптимизации баз данных:

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

Оптимизация запросов: Напишите запросы таким образом, чтобы они были эффективными. Используйте инструкции JOIN, WHERE и GROUP BY там, где это необходимо, чтобы снизить объем возвращаемых данных.

Кэширование: Используйте кэширование результатов запросов там, где это возможно. Например, результаты запросов к базе данных могут быть кэшированы в Redis или Memcached.

Ограничение объема данных: Загружайте только те данные, которые действительно нужны. Используйте LIMIT и OFFSET при запросах, чтобы извлекать только необходимое количество записей.

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

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

Масштабирование базы данных: При необходимости масштабируйте базу данных горизонтально или вертикально. Горизонтальное масштабирование (шардинг) позволяет распределить данные по нескольким серверам, а вертикальное масштабирование (разделение на таблицы) позволяет распределить данные по разным таблицам или базам данных.

Мониторинг и профилирование: Регулярно отслеживайте производительность запросов и операций базы данных с помощью инструментов мониторинга и профилирования. Это позволяет идентифицировать узкие места и проводить дальнейшую оптимизацию.
🔥 Последняя неделя перед стартом курса по AI-агентам

Старт курса уже 15го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место

На курсе:
разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах

📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями

И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»

Промокод на 5.000₽: LASTCALL

👉 Курс здесь
Какие версии PHP до сих пор поддерживаются?

На данный момент поддерживаются лишь версии вышедшие после 8.0.

8.1, 8.2: Выходят лишь обновления безопасности. Это будет продолжаться до 31 декабря 2025 года для 8.1 и до 31 декабря 2026 года для 8.2

8.3, 8.4: Релиз, который активно поддерживается. Сообщаемые ошибки и проблемы безопасности исправляются, и выпускаются регулярные точечные обновления.

Актуальную информацию всегда можно узнать на официальном сайте
Что такое middleware? Зачем это? На каком этапе выполняется?

Middleware в контексте Laravel — это промежуточное программное обеспечение, которое обрабатывает HTTP-запросы, прежде чем они достигнут конечного обработчика запросов (например, контроллера). Они представляют собой слои обработки, через которые проходят все запросы, и позволяют выполнять дополнительные операции до или после выполнения основной логики обработки запроса.

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

Когда запрос поступает на сервер Laravel, он проходит через список зарегистрированных middleware перед тем, как попасть в соответствующий контроллер или замыкание маршрута. После прохождения через все зарегистрированные middleware запрос обрабатывается конечным обработчиком.
Как обеспечить безопасность приложения на PHP от атак SQL-инъекций?

Обеспечение безопасности приложения на PHP от атак SQL-инъекций включает в себя реализацию нескольких практик для снижения риска вредоносных попыток SQL-инъекций.

Вот руководство, как это сделать:

Использование подготовленных выражений (параметризованные запросы): Вместо вставки пользовательского ввода прямо в SQL-запросы используйте подготовленные выражения с параметризованными запросами. Подготовленные выражения разделяют SQL-код от пользовательского ввода, что делает невозможным внедрение зловредного SQL-кода.

Использование хранимых процедур: Если ваша база данных поддерживает хранимые процедуры, используйте их, так как они могут предотвратить SQL-инъекции, разделяя логику SQL от пользовательского ввода.

Валидация ввода: Проверяйте и очищайте все пользовательские данные перед использованием их в SQL-запросах. Убедитесь, что ввод соответствует ожидаемым форматам и отклоняйте любой ввод, который не соответствует критериям валидации.

Экранирование: Если вам необходимо объединять пользовательский ввод в SQL-запросах (что следует избегать всякий раз, когда это возможно), убедитесь, что вы правильно экранируете специальные символы, используя функции, такие как mysqli_real_escape_string() или PDO::quote().

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

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

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

Внедрение брандмауэров для веб-приложений (WAF): Рассмотрите возможность использования WAF для выявления и блокировки потенциальных атак SQL-инъекций на сетевом уровне, прежде чем они достигнут вашего приложения.

Безопасная конфигурация: Убедитесь, что ваше приложение на PHP и сервер настроены безопасно. Отключите функции и возможности, которые не требуются и могут быть использованы злоумышленниками.

Аудиты безопасности и тестирование: Регулярно проводите аудиты безопасности и тестирование на проникновение вашего приложения на PHP, чтобы выявить и устранить любые уязвимости, включая уязвимости SQL-инъекций.
Что такое идемпотентность метода? Какие HTTP-методы являются идемпотентными для REST?

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

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

1. GET: Получение информации с сервера. Повторный запрос GET не должен иметь никакого влияния на состояние сервера.
2. HEAD: Аналогично методу GET, но без тела ответа. Повторный запрос HEAD также не должен иметь никакого влияния на состояние сервера.
3. PUT: Обновление (или создание) ресурса на сервере. Если запросы PUT повторяются с теми же параметрами, они должны иметь такое же состояние ресурса после каждого выполнения.
4. DELETE: Удаление ресурса на сервере. Повторное выполнение DELETE с теми же параметрами должно иметь то же состояние.

Эти методы идемпотентны, потому что их повторная отправка не изменяет состояние сервера или ресурсов. Это важно для однозначной и предсказуемой работы сервера и клиента при обработке запросов.
[Git] Какой командой отправить изменения в удаленный репозиторий?

Чтобы отправить изменения в удалённый репозиторий, используется команда:

git push


Полный синтаксис:
git push <remote> <branch>


<remote> — имя удалённого репозитория (например, origin).

<branch> — имя ветки, в которую нужно отправить изменения (например, main или master).

Примечания:

Если вы работаете с новым репозиторием или веткой, может потребоваться задать удалённую ветку для отслеживания:
git push --set-upstream origin <branch>
👏2
Чем отличается require от require-dev?

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

require-dev: Этот раздел определяет зависимости, необходимые исключительно для разработки и тестирования вашего приложения. Обычно это инструменты для тестирования (например, PHPUnit), фиктивные данные для тестирования (например, Faker), инструменты для отладки (например, Xdebug) и т. д. Эти зависимости не включаются в окружение продакшена (production environment), чтобы уменьшить размер и сложность установки.

Когда вы устанавливаете пакет с помощью Composer, по умолчанию устанавливаются зависимости из обоих разделов require и require-dev. Однако при использовании опции --no-dev в команде composer install или composer update, Composer устанавливает только зависимости из раздела require, пропуская require-dev. Это особенно полезно при развертывании приложения в продакшен окружении, когда не нужны инструменты и зависимости, предназначенные только для разработки.
🥱31
Куда делась 6 версия PHP?

Официально, версия PHP 6 была отменена из-за серьезных проблем и препятствий во время разработки. PHP 6 должен был представлять новую функциональность, включая поддержку Unicode и новый движок для работы с строками. Однако разработка PHP 6 столкнулась с техническими и организационными трудностями, вызванными внесением изменений в код базового ядра, которые затронули большую часть существующих библиотек и приложений.

11 марта 2010 команда разработчиков приняла решение об отмене выпуска PHP 6 в текущем его виде. В результате транк с PHP 6 был перенесён в бранч, а в транке образовалась новая версия — 5.4, в которую разработчики перенесли все наработки из PHP 6, кроме юникода.
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
📅 24 сентября в 19:00 МСК — бесплатный вебинар с Максимом Шаланкиным.

Тема: «ИИ-агенты: новая фаза развития искусственного интеллекта».

🔹 Почему все говорят про ИИ-агентов и куда вливаются миллиарды инвестиций.
🔹 Чем они отличаются от ChatGPT и обычных ботов.
🔹 Как работает цикл агента: восприятие → планирование → действие → обучение.
🔹 Живое демо простого агента.
🔹 Потенциал для бизнеса: автоматизация процессов и ROI до 80%.

Не придёшь — будешь потом рассказывать, что «агенты — это как чат-боты», и ловить косые взгляды от коллег 😏

👉 Регистрируйтесь через форму на лендинге
⚡️ Бесплатный вебинар — ИИ-агенты: новая фаза развития AI

24 сентября в 19:00 МСК состоится бесплатный вебинар с Максимом Шаланкиным — Data Science Team Lead в финтех-команде MWS, а познакомиться с ним ближе можно в его тг-канале.

Тема:
«ИИ-агенты: новая фаза развития искусственного интеллекта».


На вебинаре разберёмся, почему агенты — это следующий шаг после ChatGPT, чем они отличаются от обычных моделей и как уже приносят бизнесу ROI до 80%. А дальше я покажу, как эта тема ложится в наш курс по ИИ-агентам, который разработан под руководством Никиты Зелинского.

Подробности рассказываем в гс выше — включай, чтобы не пропустить.
Что такое Symfony Flex?

Symfony Flex — это инструмент, который упрощает и улучшает работу разработчиков при создании приложений на основе фреймворка Symfony. Он выполняет функции менеджера пакетов и конфигураций, значительно упрощая процесс добавления, управления и настройки бандлов и зависимостей.

Основные особенности Symfony Flex:

🔸Автоматическое управление зависимостями:
При установке пакета с помощью Composer, Symfony Flex автоматически настраивает приложение для работы с этим пакетом.
Например, при установке Doctrine ORM бандла Flex создаёт необходимые файлы и добавляет стандартные настройки.

🔸Система рецептов:

Symfony Flex использует рецепты — шаблоны конфигураций, предоставляемые сообществом и Symfony, которые описывают, как интегрировать пакет в проект.
Рецепты могут включать файлы конфигурации, структуру каталогов и скрипты, чтобы пакет сразу заработал.

🔸Улучшенный рабочий процесс:

Команды Flex, такие как composer require, composer remove и composer update, делают больше, чем просто управление зависимостями: они также автоматически обновляют конфигурации и настройки окружения.

🔸Настраиваемость и расширяемость:

Вы можете создавать собственные рецепты или использовать рецепты от Symfony Recipe Server, созданные сообществом.

🔸Минимальный и чистый код:

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

🔸Поддержка сокращений и алиасов:

Symfony Flex позволяет использовать алиасы для пакетов, делая команды короче и понятнее.
Например, вместо composer require symfony/console можно просто написать composer require console.

🔸Поддержка переменных окружения и Dotenv:

Flex интегрируется с компонентом Symfony Dotenv, упрощая работу с переменными окружения.