Библиотека собеса по PHP | вопросы с собеседований
رفتن به کانال در Telegram
Вопросы с собеседований по PHP и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/9f3affba Для обратной связи: @proglibrary_feeedback_bot
نمایش بیشتر3 150
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-37 روز
-430 روز
آرشیو پست ها
Расскажите о Unit Tests (required), Functional Tests (optional). Моки и стаб в PHP.
Unit Tests (тесты модульности) и Functional Tests (функциональные тесты) являются частями процесса тестирования программного обеспечения.
Unit Tests:
Определение: Тесты модульности проверяют отдельные компоненты программного обеспечения, такие как функции, классы или методы, чтобы убедиться, что они работают ожидаемым образом.
Пример: Если у вас есть функция в PHP, которая складывает два числа, вы можете написать юнит-тест для проверки, что эта функция возвращает правильный результат для различных входных данных.
Инструменты: Для написания и запуска юнит-тестов в PHP часто используются фреймворки, такие как PHPUnit.
Functional Tests:
Определение: Функциональные тесты проверяют работу всей системы или ее части в соответствии с требованиями функциональной спецификации.
Пример: Функциональный тест веб-приложения может включать в себя имитацию действий пользователя, таких как заполнение формы, отправка запросов и проверка результата.
Инструменты: Для функционального тестирования в PHP можно использовать инструменты, такие как Codeception или Behat.
Моки и стабы:
Моки (Mocks): Это объекты, которые имитируют поведение реальных объектов в системе и используются для тестирования других объектов.
Стабы (Stubs): Это объекты, которые предоставляют жестко определенные ответы на запросы, предназначенные для тестирования других объектов.
Вы можете использовать различные библиотеки, такие как PHPUnit, для создания моков и стабов. Например, PHPUnit предоставляет средства для создания моков и стабов с помощью функций getMockBuilder() и getMock().
Какова цель функции «spl_autoload_register» в PHP?
Функция spl_autoload_register в PHP используется для автоматической загрузки классов гибким и эффективным способом. Она часто используется в объектно-ориентированных приложениях PHP, где классы организованы в соответствии со стандартом PSR-4 или аналогичными соглашениями.
Когда PHP встречает класс, который еще не был определен, он запускает механизм автозагрузки. Раньше разработчики должны были вручную включать или требовать каждый файл класса, что могло быть неудобным в больших проектах. spl_autoload_register упрощает этот процесс, позволяя разработчикам регистрировать собственные функции автозагрузки.
Как это работает:
1️⃣Вы определяете одну или несколько функций автозагрузки, которые сопоставляют имена классов с путями к файлам.
2️⃣Регистрируете эти функции автозагрузки с помощью spl_autoload_register.
3️⃣Когда класс создается или ссылается, и его определение еще не загружено, PHP вызывает зарегистрированные функции автозагрузки через spl_autoload_register, чтобы попытаться загрузить определение класса.
4️⃣Этот процесс позволяет более организованной и эффективной загрузке классов в приложениях PHP, уменьшая необходимость вручную включать файлы классов.
Как реализовать постраничное отображение (пагинацию) в PHP?
Пагинация — это метод управления большим объемом данных, разбивая их на небольшие части и отображая постранично. Для реализации пагинации в PHP вы можете использовать пример кода на картинке
В данном примере используется MySQL база данных, и вы можете адаптировать код под свою собственную среду данных. Ключевой момент — это использование оффсета и лимита в SQL-запросе для выборки нужных записей, а также отображение ссылок на страницы для навигации.
Что такое анонимная функция в PHP и как её использовать?
В PHP анонимные функции, также известные как замыкания (closures), это функции без указанного имени. Они определяются с использованием ключевого слова function, за которым следуют необходимые параметры и тело функции, без указания имени функции. Анонимные функции могут быть назначены переменным, переданы в качестве аргументов другим функциям или использованы как возвращаемые значения из других функций. Они особенно полезны для определения небольших, самодостаточных логических блоков, которые могут использоваться только один раз или в ограниченном контексте.
Какие знаете принципы ООП?
1. Инкапсуляция: принцип, согласно которому объекты должны скрывать свою внутреннюю реализацию и предоставлять только определенный интерфейс для взаимодействия с внешним миром.
2. Наследование: возможность создавать новые классы на основе уже существующих, наследуя их свойства и методы. Это позволяет переиспользовать код и создавать иерархию классов.
3. Полиморфизм: возможность объектов с одинаковым интерфейсом иметь различную реализацию. Он позволяет вызывать один и тот же метод у разных объектов и получать разные результаты в зависимости от типа объекта.
4. Абстракция: процесс выделения общих характеристик и свойств объектов и объединение их в абстрактные классы или интерфейсы. Позволяет скрыть детали реализации и сосредоточиться на важных аспектах объекта.
Куда делась 6 версия PHP?
Официально, версия PHP 6 была отменена из-за серьезных проблем и препятствий во время разработки. PHP 6 должен был представлять новую функциональность, включая поддержку Unicode и новый движок для работы с строками. Однако разработка PHP 6 столкнулась с техническими и организационными трудностями, вызванными внесением изменений в код базового ядра, которые затронули большую часть существующих библиотек и приложений.
11 марта 2010 команда разработчиков приняла решение об отмене выпуска PHP 6 в текущем его виде. В результате транк с PHP 6 был перенесён в бранч, а в транке образовалась новая версия — 5.4, в которую разработчики перенесли все наработки из PHP 6, кроме юникода.
Чем отличается 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. Это особенно полезно при развертывании приложения в продакшен окружении, когда не нужны инструменты и зависимости, предназначенные только для разработки.
Как обеспечить безопасность приложения на 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-инъекций.
Реализуя эти меры, вы можете значительно снизить риск атак SQL-инъекций и улучшить безопасность вашего приложения на PHP.
Какие версии PHP до сих пор поддерживаются?
На данный момент поддерживаются лишь версии вышедшие после 8.0.
8.1: Выходят лишь обновления безопасности. Это будет продолжаться до 25 ноября 2024 года.
8.2, 8.3: Релиз, который активно поддерживается. Сообщаемые ошибки и проблемы безопасности исправляются, и выпускаются регулярные точечные выпуски.
Актуальную информацию всегда можно узнать на официальном сайте
Какие способы оптимизации производительности баз данных знаете?
Существует несколько основных способов оптимизации баз данных:
Индексирование: Убедитесь, что ваша база данных имеет правильные индексы для часто используемых запросов. Индексы позволяют ускорить поиск данных.
Оптимизация запросов: Напишите запросы таким образом, чтобы они были эффективными. Используйте инструкции JOIN, WHERE и GROUP BY там, где это необходимо, чтобы снизить объем возвращаемых данных.
Кэширование: Используйте кэширование результатов запросов там, где это возможно. Например, результаты запросов к базе данных могут быть кэшированы в Redis или Memcached.
Ограничение объема данных: Загружайте только те данные, которые действительно нужны. Используйте LIMIT и OFFSET при запросах, чтобы извлекать только необходимое количество записей.
Оптимизация структуры таблиц: Проведите анализ структуры таблиц и убедитесь, что она оптимально сбалансирована для ваших запросов. Иногда изменение типов данных, уменьшение размера полей или нормализация таблиц может улучшить производительность.
Использование транзакций: Используйте транзакции для группировки нескольких операций в одну единицу работы. Это помогает уменьшить накладные расходы на управление транзакциями и обеспечить целостность данных.
Масштабирование базы данных: При необходимости масштабируйте базу данных горизонтально или вертикально. Горизонтальное масштабирование (шардинг) позволяет распределить данные по нескольким серверам, а вертикальное масштабирование (разделение на таблицы) позволяет распределить данные по разным таблицам или базам данных.
Мониторинг и профилирование: Регулярно отслеживайте производительность запросов и операций базы данных с помощью инструментов мониторинга и профилирования. Это позволяет идентифицировать узкие места и проводить дальнейшую оптимизацию.
Что такое пространства имен в PHP и как их использовать?
В PHP пространства имен представляют собой способ организации кода путем группировки связанных классов, интерфейсов, функций и констант под определенным именем. Это помогает избежать конфликтов имен между различными компонентами приложения или различными библиотеками. Пространства имен предоставляют иерархическую систему именования, аналогичную каталогам в файловой системе.
Как использовать пространства имен в PHP:
1. Определение пространства имен:
Пространство имен определяется с использованием ключевого слова namespace, за которым следует имя пространства имен. Это объявление должно быть первым оператором в файле PHP перед любым другим кодом.
2. Использование элементов в пространстве имен:
После определения пространства имен вы можете помещать классы, функции, интерфейсы или константы в это пространство имен.
3. Доступ к элементам в пространстве имен:
Для доступа к элементам внутри пространства имен можно использовать их полностью квалифицированные имена (включая пространство имен) или импортировать пространство имен с использованием ключевого слова use.
4. Использование псевдонимов:
Также можно определить псевдонимы для пространств имен или отдельных элементов, чтобы упростить их использование, особенно если имена пространств довольно длинные.
В чем разница между «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 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, поскольку оно предоставляет единый интерфейс независимо от используемой базы данных.
Что такое рекурсия?
Рекурсия в программировании — это процесс, когда функция вызывает саму себя для выполнения определенной задачи.
В PHP рекурсия может использоваться для решения задач, которые могут быть разбиты на более простые подзадачи. Когда функция вызывается сама с сокращенными параметрами, она решает подзадачу, а затем вызывает саму себя снова для решения оставшейся части задачи.
Это может быть полезно, например, при обходе древовидных структур данных, алгоритмах перебора и т.д.
Что может содержать интерфейс?
В PHP интерфейс является объявлением, которое определяет список методов, которые должны быть реализованы классами, которые реализуют этот интерфейс. Интерфейс не содержит реализации методов, он просто указывает, какие методы должны быть доступны в классе.
Интерфейс может содержать следующие элементы:
Объявления методов: Это основной компонент интерфейса. Методы в интерфейсе объявляются без тела функции, то есть без реализации.
Константы: Интерфейс также может содержать константы, которые автоматически являются публичными, статическими и неизменяемыми (final).
Область видимости методов: Методы в интерфейсе могут быть объявлены с различными уровнями доступа, такими как public, protected или private. Обычно методы интерфейса объявляются как public, так как они должны быть доступны из классов, реализующих интерфейс.
Наследование интерфейсов: Интерфейсы могут наследовать другие интерфейсы, что позволяет создавать иерархии интерфейсов.
Интерфейсы могут быть пустыми: Интерфейс может быть пустым, то есть не содержать ни одного метода. Это полезно в случае, если вы хотите убедиться, что класс реализует определенный интерфейс, но не требует реализации каких-либо конкретных методов.
Интерфейсы в PHP предоставляют гибкую и мощную возможность для определения контрактов между различными частями кода и обеспечивают возможность полиморфного поведения, что способствует упрощению и улучшению структуры вашего приложения.
Что такое Docker? Каков принцип его работы?
Docker — это платформа для разработки, доставки и запуска приложений с использованием контейнеризации. Контейнеризация позволяет упаковывать приложения и все их зависимости в единое окружение, изолированное от операционной системы хоста, что делает приложения переносимыми и обеспечивает консистентность их работы в различных средах.
Принцип работы Docker основан на использовании контейнеров. Контейнер — это стандартизированная упаковка программного обеспечения, которая включает в себя код приложения, его зависимости, исполняемое окружение и настройки. Docker использует технологии изоляции ядра операционной системы (например, cgroups и namespaces в Linux), чтобы обеспечить каждому контейнеру свое собственное изолированное пространство и ресурсы.
Принцип работы Docker включает следующие шаги:
Упаковка приложения: Разработчик создает Docker-образ, который содержит все необходимое для запуска приложения, включая код, зависимости и настройки.
Создание контейнера: Из Docker-образа создается контейнер, который представляет собой экземпляр запущенного приложения. Контейнер содержит изолированное исполняемое окружение и ресурсы, необходимые для работы приложения.
Запуск контейнера: Контейнер запускается на хостовой операционной системе с использованием Docker Engine. Docker Engine управляет жизненным циклом контейнеров, включая их запуск, остановку, масштабирование и удаление.
Работа с контейнером: После запуска контейнера приложение доступно для использования, и его можно управлять и масштабировать с помощью Docker.
Преимущества Docker включают упрощение развертывания приложений, обеспечение консистентности среды выполнения, увеличение эффективности использования ресурсов и ускорение процесса разработки и доставки приложений.
Что такое middleware? Зачем это? На каком этапе выполняется?
Middleware в контексте Laravel — это промежуточное программное обеспечение, которое обрабатывает HTTP-запросы, прежде чем они достигнут конечного обработчика запросов (например, контроллера). Они представляют собой слои обработки, через которые проходят все запросы, и позволяют выполнять дополнительные операции до или после выполнения основной логики обработки запроса.
Middleware может выполнять различные задачи, такие как аутентификация пользователя, проверка доступа, запись логов, манипуляции с запросами и ответами и многое другое.
Когда запрос поступает на сервер Laravel, он проходит через список зарегистрированных middleware перед тем, как попасть в соответствующий контроллер или замыкание маршрута. После прохождения через все зарегистрированные middleware запрос обрабатывается конечным обработчиком.
В чем разница между функциями «htmlentities» и «htmlspecialchars» в PHP?
В PHP функции «htmlentities()» и «htmlspecialchars()» используются для кодирования HTML-сущностей, но они имеют разные цели:
«htmlspecialchars()»: Эта функция в основном используется для экранирования символов HTML, которые имеют специальное значение в HTML, таких как <, >, &, и «. Она преобразует эти символы в соответствующие HTML-сущности (<, >, &, «). Это часто используется для предотвращения атак XSS (межсайтового скриптинга), гарантируя, что пользовательский ввод отображается «как есть», без интерпретации как HTML.
«htmlentities()»: Эта функция преобразует все применимые символы в соответствующие HTML-сущности. В дополнение к символам, экранируемым «htmlspecialchars()», она также преобразует символы, такие как не-ASCII символы и различные символы. Эта функция часто используется, когда необходимо гарантировать безопасное кодирование всех символов для вывода HTML, особенно при работе с многоязычным контентом.
Что такое Composer?
Composer — это инструмент для управления зависимостями в PHP-приложениях. Он позволяет легко устанавливать, обновлять и управлять библиотеками и фреймворками, которые используются в проекте.
Основные функции Composer:
Установка зависимостей: Composer позволяет определить необходимые библиотеки и их версии в файле composer.json, а затем установить их с помощью команды composer install.
Обновление зависимостей: После установки библиотек, можно обновить их до последних версий, указанных в файле composer.json, с помощью команды composer update.
Автозагрузка классов: Composer автоматически создает файл автозагрузки, который позволяет использовать классы из установленных зависимостей без необходимости явного подключения файлов.
Автоматическое разрешение зависимостей: Composer управляет разрешением зависимостей, учитывая совместимость версий между различными библиотеками.
Создание собственных пакетов: Composer позволяет создавать собственные пакеты для повторного использования в различных проектах и их публикации в репозитории Packagist для общего использования.
Использование Composer значительно упрощает управление зависимостями в PHP-проектах и помогает поддерживать их актуальность и безопасность.
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
