Библиотека собеса по PHP | вопросы с собеседований
Открыть в Telegram
Вопросы с собеседований по PHP и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/9f3affba Для обратной связи: @proglibrary_feeedback_bot
Больше3 151
Подписчики
Нет данных24 часа
-37 дней
-430 день
Архив постов
Объясните разницу между запросами GET и POST.
В веб-разработке с использованием PHP, запросы GET и POST представляют собой два основных метода передачи данных между клиентом (браузером) и сервером. Они различаются по способу передачи данных и некоторым другим аспектам. Вот основные различия между ними:
Параметры в URL:
GET: Параметры передаются в URL. Например: example.com/page.php?name=John&age=25.
POST: Параметры передаются в теле запроса и не видны в URL.
Безопасность:
GET: Менее безопасен, потому что параметры видны в URL, и они могут быть сохранены в истории браузера или логах сервера. Не следует использовать для передачи чувствительных данных.
POST: Более безопасен, так как данные передаются в теле запроса и не отображаются в URL.
Ограничение размера данных:
GET: Ограничен по размеру URL, и многие браузеры имеют ограничения на длину URL.
POST: Не имеет таких ограничений, и большие объемы данных могут быть переданы через этот метод.
Кэширование:
GET: Результаты запроса могут быть закэшированы браузером.
POST: Не кэшируется, и каждый запрос считается уникальным.
Использование:
GET: Обычно используется для получения данных от сервера. Параметры могут быть видны в URL.
POST: Часто используется для отправки данных на сервер, например, при отправке форм.
Что такое позднее связывание? Расскажите о поведении и применения static.
Позднее связывание (Late Binding) означает, что решение о том, какой метод или функция вызывается, принимается во время выполнения программы, а не во время компиляции. Это также называется динамическим связыванием или поздним связыванием методов. Позднее связывание часто используется в объектно-ориентированных языках программирования.
В PHP позднее связывание может быть проиллюстрировано при использовании ключевого слова static в контексте наследования и переопределения методов в классах.
В приведенном выше примере A::foo() и B::foo() демонстрируют позднее связывание для статических методов. Вызывается метод класса, который указан во время выполнения, в зависимости от типа объекта или класса.
Для методов экземпляра (нестатических методов) также может быть применено позднее связывание, как видно в вызовах $objA->bar() и $objB->bar(). Позднее связывание позволяет определить, какой метод вызывается в зависимости от типа объекта во время выполнения.
Использование static в PHP также применяется внутри классов для ссылки на статические элементы класса, такие как статические переменные и методы. Он может быть использован для обращения к статическим элементам как внутри класса, так и вне его, и оказывает влияние на область видимости.
Что такое Path Traversal?
Path Traversal (также известный как Directory Traversal или файловая трансверсия) в PHP — это уязвимость безопасности, при которой злоумышленник может попытаться получить доступ к файлам или директориям за пределами предназначенной области. Это может произойти, если приложение неправильно обрабатывает пользовательский ввод в пути файлов.
Например, если веб-приложение позволяет пользователю вводить путь к файлу или директории и не достаточно проверяет и фильтрует этот ввод, злоумышленник может использовать специально сформированные строки для «перехода» за пределы заданной директории и, таким образом, получить доступ к конфиденциальным файлам на сервере.
В приведенном выше коде, если параметр file передается через URL, злоумышленник может использовать символы "../" для перехода на уровень выше и получения доступа к файлам за пределами заданной директории.
Для предотвращения атак Path Traversal важно правильно обрабатывать и валидировать пользовательский ввод, особенно при работе с файловой системой. Рекомендуется использовать абсолютные пути и проверять, что запрошенные ресурсы находятся в пределах ожидаемой области файловой структуры. Также полезно ограничивать права доступа к файлам и директориям на сервере.
Что такое Memcache и Memcached? Можно ли использовать один экземпляр Memcache между несколькими проектами PHP?
Memcached — это эффективное сервис кэширования, разработанный специально для снижения нагрузки на базу данных в динамических веб-приложениях. Модуль Memcache предлагает удобный процедурный и объектно-ориентированный интерфейс для Memcached.
Memcache — это пространство для хранения данных, и Memcache можно запускать на одном или нескольких серверах. Следовательно, можно использовать один экземпляр Memcache в нескольких проектах.
Можно настроить клиент для взаимодействия с отдельным набором экземпляров. Таким образом, также допускается запуск двух разных процессов Memcache на одном хосте. Несмотря на то, что оба таких процесса выполняются на одном и том же хосте, они остаются независимыми, если только нет раздела данных.
Сравните исключения компиляции и рантайма. Как они называются?
Проверенное исключение — это исключение, возникающее во время компиляции. Поскольку игнорировать этот тип исключения невозможно, с ним необходимо обращаться осторожно. С другой стороны, непроверяемое исключение — это то, которое возникает во время выполнения. Если проверенное исключение не обрабатывается, оно становится непроверенным исключением.
Как работает Garbage Collector? Когда есть смысл вызвать?
Garbage Collector (GC) — это механизм в PHP, который автоматически освобождает память, занятую объектами, которые больше не используются в программе. Он следит за объектами в памяти и удаляет те, на которые нет ссылок или которые больше не доступны из текущего контекста программы.
GC работает путем использования алгоритма подсчета ссылок. Каждый раз, когда создается объект, счетчик ссылок на него увеличивается, и если нет ссылок на объект, счетчик уменьшается. Когда счетчик становится равным нулю, объект считается мусором и подлежит удалению GC.
При вызове GC есть несколько моментов, которые могут быть полезны:
1. Когда вы закончили использовать большой объем памяти, который является временным. Например, если вы обрабатываете большие файлы или создаете множество объектов в цикле, вызов GC после завершения таких операций поможет освободить память.
2. Когда у вас есть длительное время выполнения скрипта и вы опасаетесь, что память может исчерпаться. Хотя GC автоматически выполняет свою работу, вызов GC в явном виде может помочь освободить память раньше, чем это произойдет автоматически.
3. Когда вы создаете циклическую ссылку между объектами и планируете разорвать эти ссылки. В этом случае вызов GC может помочь устранить утечку памяти, освободив объекты с циклическими ссылками.
Важно отметить, что вызов GC не всегда является оптимальным решением и может повлиять на производительность. Поэтому обычно рекомендуется позволить GC работать автоматически и вызывать его только в особых случаях, когда это необходимо.
Что такое конструктор и деструктор в PHP?
Конструктор и деструктор PHP — это функции специального типа, которые автоматически вызываются при создании и уничтожении объекта класса. Конструктор является наиболее полезным из двух, поскольку он позволяет отправлять параметры при создании нового объекта, которые затем можно использовать для инициализации переменных объекта.
Что такое рефлексия?
Рефлексия в PHP — это механизм, который позволяет программе анализировать и изменять свое собственное поведение во время выполнения. Это позволяет получать информацию о классах, функциях и переменных во время выполнения программы, а также создавать новые объекты, вызывать методы и получать или устанавливать значения переменных динамически.
Рефлексия в PHP достигается с помощью встроенных классов и функций, таких как ReflectionClass, ReflectionMethod, ReflectionProperty и другие. Эти классы предоставляют методы для получения информации о классах, методах и свойствах, а также для создания новых объектов и вызова методов динамически.
Рефлексия может быть полезна во многих случаях, таких как автоматизация генерации кода, создание гибких и масштабируемых систем, отладка и тестирование приложений. Она позволяет программистам работать с классами и объектами во время выполнения, что дает большую гибкость и возможности для разработки приложений на PHP.
Что такое миграции?
Миграции (migrations) обозначают процесс изменения структуры базы данных. Этот процесс позволяет разработчикам эффективно управлять и обновлять схему базы данных в процессе развития приложения, минимизируя при этом потерю данных.
Основные концепции миграций в PHP включают:
1️⃣Создание миграции: Разработчик определяет, какие изменения нужно внести в базу данных, и записывает их в виде миграции. Это может быть создание новой таблицы, добавление/удаление столбца и т.д.
2️⃣Применение миграции: При необходимости разработчик применяет миграции к базе данных. Это приводит к выполнению всех определенных в миграциях SQL-запросов, изменяющих структуру базы данных.
3️⃣Откат миграции: В случае необходимости можно откатывать миграции, что означает отмену изменений, внесенных предыдущей миграцией. Это полезно, например, при отладке или при необходимости вернуть базу данных к предыдущему состоянию.
Примеры PHP-фреймворков и инструментов, предоставляющих возможности для работы с миграциями, включают Laravel (через механизм миграций Laravel), Symfony (Doctrine Migrations), Phinx и другие. В этих фреймворках миграции часто реализуются в виде кода на PHP, обеспечивая удобство в создании и управлении изменениями в базе данных.
Какая разница между замыканием в PHP и JavaScript?
Замыкание в PHP и JavaScript имеют некоторые сходства, но также имеют и некоторые различия.
В PHP:
1. Замыкание, так же как и функция, является объектом, который можно присвоить переменной.
2. В PHP замыкания создаются с использованием анонимных функций с помощью ключевого слова `function`.
3. Замыкания в PHP в основном используются для создания анонимных функций, которые могут захватывать и использовать переменные из объемлющего контекста.
4. Замыкания в PHP имеют доступ только к переменным, которые были явно переданы в них или объявлены в объемлющей функции с помощью ключевого слова `use`.
5. В PHP замыкания можно возвращать из других функций и передавать как аргументы в другие функции.
В JavaScript:
1. Замыкание в JavaScript создается при создании функции внутри другой функции.
2. Замыкания в JavaScript могут захватывать и использовать переменные из объемлющего контекста даже после завершения выполнения внешней функции.
3. В JavaScript замыкания используются для создания приватных переменных и функций,
Как определить, является ли число четным или нечетным, не используя никаких условий или циклов?
Для чего используется функция header()?
Функция header() в PHP используется для отправки HTTP-заголовков из сервера в браузер.
Основные случаи использования функции header() в PHP включают:
1. Установка статуса и заголовков ответа сервера:
В этом примере функция header() устанавливает статус ответа на «200 OK» и тип содержимого на «application/json».
2. Управление кешированием:
В этом примере функция header() устанавливает заголовки, которые предотвращают кеширование страницы в браузере.
3. Перенаправление пользователя на другую страницу:
В этом примере функция header() выполняет перенаправление пользователя на указанный URL.
4. Установка cookie:
В этом примере функция header() устанавливает cookie с именем «name» и значением «value», а также указывает срок и путь доступа к cookie.
Важно отметить, что функция header() должна быть вызвана до вывода любого другого содержимого на страницу, включая пробелы и переносы строк, чтобы гарантировать успешное отправление заголовков.
Что такое PEAR в PHP?
PEAR (PHP Extension and Application Repository) в PHP — это структурированный репозиторий, который предоставляет библиотеки и расширения для языка программирования PHP. PEAR упрощает установку, использование и распространение таких библиотек и расширений.
Основные компоненты PEAR включают в себя:
Пакеты (Packages): Это представляет собой библиотеки или расширения, которые могут быть установлены и использованы в PHP-приложениях.
Метаданные (Metadata): Информация о каждом пакете, такая как его зависимости, версии и описание.
Командный интерфейс (Command-Line Interface): Инструменты командной строки для управления пакетами, установки и обновления.
Репозиторий (Repository): Это хранилище, в котором хранятся все пакеты и метаданные, доступные для установки.
Следует отметить, что в последнее время PEAR утратил свою популярность в сообществе PHP в связи с появлением современных инструментов управления зависимостями, таких как Composer. Composer стал более распространенным выбором для управления зависимостями в PHP-проектах.
Расскажите о утечки памяти в PHP. Приведите примеры.
Утечка памяти в PHP происходит, когда память, выделенная для выполнения программы, не освобождается после завершения ее работы, что может привести к исчерпанию ресурсов и падению производительности. Это может происходить, когда объекты или переменные не удаляются из памяти после завершения их использования.
Вот несколько примеров утечек памяти в PHP:
1. Неявное копирование больших данных:
В этом примере функция `str_replace` неявно выполняет копию большого файла в память, что приводит к утечке памяти. Рекомендуется использовать работу с файлами по частям или потоками (stream) для избежания этой проблемы.
2. Открытые ресурсы без явного закрытия:
В этом примере ресурс файла остается открытым после завершения программы, что приводит к утечке памяти. Рекомендуется всегда явно закрывать открытые ресурсы с помощью `fclose($handle);`.
3. Циклические ссылки:
В этом примере создаются два объекта `MyClass`, которые ссылаются друг на друга. Если эти объекты не освобождаются из памяти явным образом, то они продолжат существовать и приведут к утечке памяти. Рекомендуется обнулять ссылки перед выходом из области видимости или использовать сборку мусора (garbage collection) для автоматического удаления недоступных объектов.
Чтобы предотвратить утечки памяти в PHP, рекомендуется проводить регулярный аудит кода, закрывать открытые ресурсы, освобождать объекты из памяти после завершения их использования и избегать формирования циклических ссылок. Использование инструментов анализа кода и профилирования также может помочь в обнаружении и исправлении утечек памяти.
Что такое куча и стек?
Куча (heap) и Стек (stack) — это две основных области в памяти программы, где хранятся данные, но они используются по-разному.
Стек (Stack):
Что это: Стек представляет собой линейную структуру данных, где операции выполняются в порядке Last In, First Out (LIFO).
Использование: В стеке хранятся локальные переменные функций, адреса возврата, параметры функций и прочая информация о выполнении функций.
Жизненный цикл: Стековая память выделяется и освобождается автоматически при входе и выходе из функций.
Ограничения: Ограниченный размер, быстрый доступ к данным.
Куча (Heap):
Что это: Куча — это динамическая область памяти, где хранятся данные, созданные во время выполнения программы.
Использование: В куче располагаются объекты, массивы и другие динамические данные, управляемые программистом.
Жизненный цикл: Ручное управление выделением и освобождением памяти (например, через new и delete в C++ или malloc и free в C).
Ограничения: Больший размер, более гибкое использование, но требует аккуратного управления памятью, чтобы избежать утечек или дефрагментации.
Какие строковые функции вы знаете?
echo() — Выводит одну или несколько строк
explode() — Разбить строку на массив
ltrim() — Удаляет лишние символы или пробелы с левой стороны строки.
parse_str() — Разбирает строку запроса на переменные
str_replace() — Заменяет указанные символы строки
str_split() — Разбивает строку на массив символов
str_word_count() — Количество слов в строке
strlen() — Вычисляет длину строки
strncmp() — Сравнивает первые несколько символов строки
Остальные функции можно посмотреть в документации.
Расскажите про функции defined и get_defined_constants
defined():
Функция defined() используется для проверки существования константы с заданным именем. Она возвращает true, если константа существует, и false, если нет.
get_defined_constants():
Функция get_defined_constants() возвращает ассоциативный массив, содержащий все определенные константы в текущем скрипте. Этот массив имеет два уровня: глобальные константы и локальные (если они определены внутри функции).
Что такое курсоры в базах данных?
В контексте PHP и баз данных, курсоры обычно ассоциируются с операциями работы с результатами запросов к базе данных. Курсор представляет собой механизм, который позволяет программе последовательно перебирать результаты запроса, обрабатывая их по одному элементу за раз.
Одним из типичных случаев использования курсоров в PHP является работа с результатами запроса, возвращаемыми, например, функцией mysqli_query() для MySQL базы данных или pg_query() для PostgreSQL. Эти функции возвращают ресурсный объект, который представляет собой результат выполнения SQL-запроса.
Чем отличается 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: Может вызывать дополнительные затраты на производительность, так как объекты могут обращаться к локатору в любой момент выполнения программы.
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
