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Ответ:
- Скалярные:
int,float,string,bool. - Составные:
array,object,callable,iterable. - Специальные:
resource,null. Подробное руководство по типам данных
В чём разница между 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(): Объединяет элементы массива в строку с помощью разделителя.
В чём разница между unset() и unlink()?
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+):
- value: 8-байтовое объединение (union), хранящее фактические данные (например,
lvalдля целых чисел,dvalдля чисел с плавающей точкой или указатели, такие как*str,*arr,*obj). - u1 (type_info): 4-байтовое объединение, содержащее тег типа (например,
IS_STRING,IS_LONG) и флаги типа (указывающие, является ли значение ссылочно-зависимым или участвует ли оно в сборке мусора). - 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, который хранит предварительно скомпилированный байт-код скриптов в разделяемой памяти, устраняя необходимость загрузки и разбора скриптов при каждом запросе.