Перейти к основному содержимому

1. Основы PHP и возможности языка

Числа с плавающей точкой (float)​

Junior

Ответ: Числа с плавающей точкой имеют ограниченную точность и хранятся в двоичном формате (IEEE 754). Это означает, что некоторые десятичные дроби (например, 0.1 или 0.2) не могут быть представлены точно. Подробнее о числах с плавающей точкой


Что означает аббревиатура PHP и каково его основное назначение?​

Junior

Ответ: Изначально PHP расшифровывался как «Personal Home Page», но сейчас это рекурсивный акроним «PHP: Hypertext Preprocessor». Это серверный скриптовый язык, предназначенный для веб-разработки. Его основное назначение — генерация динамического веб-контента, обработка данных форм, взаимодействие с базами данных, управление сессиями и многое другое.


PHP — регистрозависимый язык?​

Junior

Ответ: Да, PHP чувствителен к регистру в именах переменных. Однако имена функций, имена классов и встроенные конструкции (такие как echo, if и т.д.) не зависят от регистра.


Каковы правила именования переменных в PHP?​

Junior

Ответ:

  • Должна начинаться со знака $.
  • Далее следует буква или символ подчёркивания.
  • Может содержать только буквы, цифры и символы подчёркивания (A-z, 0-9 и _).
  • Не может начинаться с цифры.
  • Имена переменных чувствительны к регистру.

Какие типы данных существуют в PHP?​

Junior

Ответ:


В чём разница между empty(), is_null() и isset()?​

Junior

Ответ:

  • empty(): Возвращает true, если переменная является пустой строкой, 0, false, null или пустым массивом.
  • is_null(): Возвращает true, только если переменная равна null.
  • isset(): Возвращает true, если переменная определена и не равна null.

В чём разница между echo и print?​

Junior

Ответ:

  • echo — языковая конструкция, тогда как print — функция (хотя ведёт себя как конструкция).
  • echo немного быстрее и может принимать несколько параметров.
  • print всегда возвращает 1, поэтому может использоваться в выражениях.

Что такое include(), require(), include_once() и require_once()?​

Junior

Ответ:

  • include(): Подключает файл. В случае ошибки выводит предупреждение и продолжает выполнение.
  • require(): Подключает файл. В случае ошибки вызывает фатальную ошибку и останавливает выполнение.
  • *_once(): Аналогичны соответствующим функциям, но гарантируют, что файл будет подключён только один раз.

Какие типы массивов существуют в PHP?​

Junior

Ответ:

  • Индексированные массивы: Массивы с числовым индексом.
  • Ассоциативные массивы: Массивы с именованными ключами.
  • Многомерные массивы: Массивы, содержащие один или несколько других массивов.

В чём разница между строками в одинарных и двойных кавычках?​

Junior

Ответ:

  • Одинарные кавычки: Литералы. Переменные и большинство escape-последовательностей не интерпретируются.
  • Двойные кавычки: Переменные подставляются, escape-последовательности (такие как \n, \t) интерпретируются.

В чём разница между $message и $$message?​

Junior

Ответ: $message — обычная переменная. $$message — «переменная переменная», которая использует значение $message как имя другой переменной.


Что означает «переключение в режим PHP»?​

Junior

Ответ: Это встраивание PHP-кода в HTML с помощью тегов вида <?php ... ?>.


Каковы правила определения «истинности» любого значения (truthiness)?​

Junior

Ответ: В PHP значения считаются «истинными», если они не являются: null, false, 0, 0.0, "" (пустая строка), "0" или [] (пустой массив).


В чём разница между константами и переменными?​

Junior

Ответ: Константы определяются с помощью define() или const и не могут быть изменены или удалены после объявления. Переменные могут менять своё значение в любое время.


Назовите несколько встроенных констант PHP.​

Junior

Ответ: PHP_VERSION, PHP_OS, DEFAULT_INCLUDE_PATH, DIRECTORY_SEPARATOR, E_ERROR, E_WARNING.


Для чего используются explode() и implode()?​

Junior

Ответ:

  • explode(): Разбивает строку в массив по разделителю.
  • implode(): Объединяет элементы массива в строку с помощью разделителя.

Junior

Ответ:

  • unset(): Уничтожает переменную или элемент массива.
  • unlink(): Удаляет файл с сервера.

Что такое суперглобальные переменные в PHP?​

Junior

Ответ: Предопределённые переменные, которые всегда доступны во всех областях видимости на протяжении всего скрипта.

  • $_GET: Данные, переданные через параметры URL-запроса.
  • $_POST: Данные, переданные через метод HTTP POST (данные формы).
  • $_FILES: Данные о загруженных файлах.
  • $_COOKIE: Данные, хранящиеся в куках.
  • $_SESSION: Данные, хранящиеся в сессии.
  • $_SERVER: Информация о заголовках, путях и расположении скриптов.
  • $_ENV: Переменные окружения.
  • $_REQUEST: Содержит данные из $_GET, $_POST и $_COOKIE.
  • $GLOBALS: Ссылается на все переменные, доступные в глобальной области видимости.

Что такое магические константы в PHP?​

Middle

Ответ: Магические константы — это предопределённые константы, значение которых меняется в зависимости от места использования.

  • __LINE__, __FILE__, __DIR__, __FUNCTION__, __CLASS__, __TRAIT__, __METHOD__, __NAMESPACE__, ClassName::class.

Что такое генераторы?​

Middle

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


В чём разница между замыканием и анонимной функцией?​

Middle

Ответ: Анонимная функция — это функция без имени. Замыкание — это анонимная функция, которая может «захватывать» переменные из родительской области видимости с помощью ключевого слова use.


Что такое Type Hinting?​

Middle

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


Что такое сборка мусора (Garbage Collection) в PHP?​

Middle

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

  • Подсчёт ссылок: В PHP 7+ refcount был перенесён из самой структуры zval внутрь структур сложных значений (zend_string, zend_array и др.). Простые типы (например, int или bool) не используют подсчёт ссылок. Когда refcount достигает нуля, память освобождается.
  • Что такое «цикл»? Цикл возникает, когда два или более объектов ссылаются друг на друга (циклические ссылки), что не позволяет их refcount достичь нуля даже после удаления исходных переменных.
  • Как происходит очистка: Когда «корневой буфер» (предполагаемые циклы) достигает предела (по умолчанию 10 000), запускается сборщик. Он временно уменьшает refcount внутренних объектов; если refcount становится нулём, объект помечается как мусор и удаляется.
  • Производительность: Сборщик мусора предотвращает утечки памяти (что критически важно для долгоживущих скриптов), но создаёт некоторую нагрузку на процессор во время сборки. Его можно запускать вручную через gc_collect_cycles().

Подробное руководство по сборке мусора


Что такое zval и какова его базовая структура?​

Middle Important

Ответ: zval (Zend value) — это фундаментальная структура данных, используемая движком Zend Engine для представления любой переменной PHP. В PHP 7+ она была значительно оптимизирована для снижения потребления памяти (до 16 байт) и отказа от лишних аллокаций в куче.

Внутренняя структура (PHP 7+):

  1. value: 8-байтовое объединение (union), хранящее фактические данные (например, lval для целых чисел, dval для чисел с плавающей точкой или указатели, такие как *str, *arr, *obj).
  2. u1 (type_info): 4-байтовое объединение, содержащее тег типа (например, IS_STRING, IS_LONG) и флаги типа (указывающие, является ли значение ссылочно-зависимым или участвует ли оно в сборке мусора).
  3. u2: 4-байтовое объединение, используемое для вспомогательных данных (например, цепочки коллизий в хеш-таблицах массивов).

Основные отличия от PHP 5:

  • Размер: Уменьшен с 24/32 байт до 16 байт.
  • Подсчёт ссылок: Перенесён из самого zval внутрь структур сложных значений (zend_string, zend_array и т.д.).
  • Простые типы: Такие типы, как null, bool, int и float, хранятся непосредственно в zval и больше не требуют подсчёта ссылок или выделения памяти в куче.

Подробное руководство по структуре Zval


Что такое copy-on-write в PHP и когда передача по значению дублирует данные?​

Middle Important

Ответ: Copy-on-write (CoW, копирование при записи) — это оптимизация, при которой PHP разделяет один zval между несколькими переменными до тех пор, пока одна из них не будет изменена.

  • Только чтение: передача большого массива по значению лишь создает ссылку на тот же zval (память не дублируется).
  • Модификация: изменение массива вызывает «отщепление» (separation), создавая реальную копию в памяти.
  • Объекты: передаются по хэндлу, поэтому изменение свойств не вызывает дублирования всей структуры объекта, как у массивов.

Не используйте & только ради экономии памяти; CoW уже эффективно справляется с этой задачей при чтении. Подробное руководство по Copy-on-Write


Что такое OPCache?​

Middle

Ответ: OPCache — это кэширующий движок для PHP, который хранит предварительно скомпилированный байт-код скриптов в разделяемой памяти, устраняя необходимость загрузки и разбора скриптов при каждом запросе.


Как работает обработка ошибок в PHP?​

Middle

Ответ: PHP использует несколько механизмов:

  • Отчёт об ошибках: Настраивается через error_reporting() и display_errors в php.ini.
  • Блоки Try-Catch: Для обработки Exceptions и Errors (начиная с PHP 7).
  • Пользовательские обработчики ошибок: С помощью set_error_handler() и set_exception_handler().

Основные типы ошибок:

  • E_ERROR: Фатальные ошибки времени выполнения. Выполнение скрипта прекращается.
  • E_WARNING: Предупреждения времени выполнения (нефатальные ошибки).
  • E_NOTICE: Уведомления времени выполнения.
  • E_PARSE: Ошибки разбора на этапе компиляции.
  • E_DEPRECATED: Предупреждения о коде, который не будет работать в будущих версиях.

Каков жизненный цикл PHP-запроса?​

Middle

Ответ:

  1. Запрос: Веб-сервер (например, Nginx/Apache) получает HTTP-запрос.
  2. Передача: Сервер определяет, что это PHP-файл, и передаёт его процессору PHP (например, PHP-FPM) через CGI/FastCGI.
  3. Инициализация: PHP запускается, загружает конфигурацию (php.ini) и инициализирует подключённые расширения.
  4. Разбор и компиляция: PHP разбирает скрипт и компилирует его в опкоды (часто кэшируемые Opcache).
  5. Выполнение: Zend Engine выполняет опкоды.
  6. Вывод: Скрипт формирует HTTP-ответ (заголовки и тело).
  7. Завершение: PHP освобождает ресурсы, завершает работу расширений, а процесс может остаться активным (в FPM) для обработки следующего запроса.

Каковы риски использования PHP в качестве долгоживущего процесса (демона)?​

Senior

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


Как работает Opcache?​

Senior

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


Как работает Opcache начиная с версии 8.0 и новый JIT?​

Senior

Ответ: OpCache с JIT (начиная с версии 8.0) идёт ещё дальше, определяя «горячий» код и компилируя его в нативный машинный код, что позволяет процессору выполнять его напрямую, минуя цикл интерпретации Zend VM.

PHP JIT Chart


Что вы знаете о JIT?​

Senior

Ответ:

  • JIT (Just-In-Time) высокоэффективен для вычислительно ёмких задач (таких как математические операции или обработка изображений), но обычно даёт минимальный выигрыш для стандартных веб-приложений, ограниченных операциями ввода-вывода (база данных, файловая система).
  • Он открывает возможности для использования PHP за пределами веб-разработки, например, в машинном обучении или долгоживущих демонах с интенсивными вычислениями.

Подробное руководство по OpCache и JIT


Почему var_dump(0.1 + 0.2 == 0.3) возвращает bool(false)?​

Senior

Ответ: Это происходит потому, что числа с плавающей точкой в PHP (и большинстве других языков) следуют стандарту IEEE 754, который представляет их в двоичном формате. Многие десятичные дроби, такие как 0.1 и 0.2, не могут быть точно представлены как конечные двоичные дроби.

  • При сложении 0.1 + 0.2 внутренний результат немного отличается от точного значения 0.3 (приблизительно 0.30000000000000004).
  • Сравнение: Никогда не используйте == для сравнения чисел с плавающей точкой. Вместо этого используйте малый epsilon: abs(($a + $b) - $c) < 0.00001.

Точность в базах данных и финансовых расчётах:

  • В базах данных такие значения необходимо хранить как DECIMAL (или NUMERIC) вместо float или double.
  • Причина: DECIMAL хранит числа как значения с фиксированной точкой (или строки внутренне), обеспечивая точность вычислений, что критически важно для денежных значений. Типы с плавающей точкой предназначены для приблизительных научных вычислений, где скорость важнее абсолютной точности. Подробное руководство по типам данных