Карта знаний PHP — medgemma:27b, run-05 · think: off

Оценка: PHP 74.0% · PHP+версии 67.9% · Symfony 78.1% · Symfony+версии 75.0% · БД и ORM 75.0% · Архитектура 68.8% · Фронтенд 81.2% · HTTP 87.5% · Безопасность 75.0% · Тесты 62.5% · Глубина 62.5% · Всего 71.7%
Разобрано JSON: 99.7% (295 из 296)
По зонам: База 75.0% · PHP 8.4–8.5 31.2% · Будущее 68.8% · Глубина 62.5%
Точность: 172 / 240 (+ глубина 35 / 56)
Разобрано ответов: 294 / 240 (не по JSON-формату: 1 · без вердикта: -54)
Ответов «да»: 53.8% (баланс вопросника 50/50, базлайн константного ответа — 50%)
Время: 4.0 мин (0.73 c на клетку — медиана)
Цена: $0.028
Токены: 41075 вх / 16682 вых (кэш: 0)
вопросник v8 + deep v4 (L9/L10)
Пример запроса (первая клетка). System одинаковый во всех запросах прогона, user — свой вопрос для каждой клетки:
system
Ты проходишь тест на знание PHP. Каждое сообщение — один вопрос. Отвечай строго в JSON: {"answer": ..., "пояснение": "..."}. Для вопроса «Верно или неверно?» answer — "да" или "нет"; для вопроса о результате answer — число, строка или да/нет. Пояснение — одно короткое предложение. Никакого текста вне JSON.
user
Строки в двойных и одинарных кавычках обрабатываются одинаково, разница только в скорости.

Верно или неверно?

Карта

верно неверно
наведите — вопрос и ответ модели · клик — строка с деталями в «Все утверждения»
L1
L2
L3
L4
L5
L6
L7
L8
L9
L10
итог
Синтаксис и операторы
T01-L1 · Синтаксис и операторы
Строки в двойных и одинарных кавычках обрабатываются одинаково, разница только в скорости.
Модель: «да»
Верный ответ: нет
T01-L2 · Синтаксис и операторы
Оператор ?? работает по семантике isset и не порождает предупреждений для неопределённых переменных.
Модель: «да»
Верный ответ: да
T01-L3 · Синтаксис и операторы
Что выведет: echo 'a', 'b';
Модель: «ab»
Верный ответ: ab
T01-L4 · Синтаксис и операторы
print возвращает значение 1 и может использоваться внутри выражения.
Модель: «да»
Верный ответ: да
T01-L5 · Синтаксис и операторы
Оператор ?: (элвис) возвращает левый операнд, если он ложный.
Модель: «нет»
Верный ответ: нет
T01-L6 · Синтаксис и операторы
В PHP 8 приоритет оператора конкатенации (.) ниже, чем у сложения и вычитания.
Модель: «нет»
Верный ответ: да
T01-L7 · Синтаксис и операторы
Выражение 2 ** 3 ** 2 в PHP вычисляется как (2 ** 3) ** 2, то есть 64.
Модель: «нет»
Верный ответ: нет
T01-L8 · Синтаксис и операторы
Какую строку выведет: echo 'сумма: ' . 2 + 3; (PHP 8)?
Модель: «сумма: 5»
Верный ответ: сумма: 5
T01-L9 · Синтаксис и операторы
Что выведет этот код? ```php echo intdiv(7, 2) . intdiv(-7, 2); ```
Модель: «3-4»
Верный ответ: 3-3
T01-L10 · Синтаксис и операторы
Что выведет этот код? ```php echo -3 ** 2; ```
Модель: «9»
Верный ответ: -9
6/10
Типы и сравнения
T02-L1 · Типы и сравнения
Массивы при строгом сравнении === считаются равными независимо от порядка элементов.
Модель: «нет»
Верный ответ: нет
T02-L2 · Типы и сравнения
Сравнение 0 == false возвращает false, потому что это строгое сравнение.
Модель: «нет»
Верный ответ: нет
T02-L3 · Типы и сравнения
В PHP 8 выражение "abc" == 0 возвращает true.
Модель: «нет»
Верный ответ: нет
T02-L4 · Типы и сравнения
Значение null при нестрогом сравнении равно одновременно 0, пустой строке и false.
Модель: «нет»
Верный ответ: да
T02-L5 · Типы и сравнения
Что вернёт выражение: (int) '42abc'?
Модель: «42»
Верный ответ: 42
T02-L6 · Типы и сравнения
Что вернёт выражение: '5' + 5?
Модель: «55»
Верный ответ: 10
T02-L7 · Типы и сравнения
При приведении к строке значение false превращается в "0".
Модель: «да»
Верный ответ: нет
T02-L8 · Типы и сравнения
Сравнение 0.1 + 0.2 === 0.3 возвращает false.
Модель: «да»
Верный ответ: да
T02-L9 · Типы и сравнения
Что выведет этот код? ```php echo '1e1' == '10' ? 'true' : 'false'; ```
Модель: «true»
Верный ответ: true
T02-L10 · Типы и сравнения
Что выведет этот код? ```php switch ('a') { case 0: echo 'zero'; break; default: echo 'other'; } ```
Модель: «other»
Верный ответ: other
7/10
Строки
T03-L1 · Строки
strrev() корректно переворачивает строку в UTF-8.
Модель: «нет»
Верный ответ: нет
T03-L2 · Строки
str_contains('Hello world', 'world') возвращает true.
Модель: «да»
Верный ответ: да
T03-L3 · Строки
str_pad() умеет дополнять строку только справа.
Модель: «нет»
Верный ответ: нет
T03-L4 · Строки
По умолчанию trim() срезает только пробелы, не трогая табы и переводы строк.
Модель: «нет»
Верный ответ: нет
T03-L5 · Строки
Сколько БАЙТ вернёт strlen('привет') для строки в UTF-8?
Модель: «6»
Верный ответ: 12
T03-L6 · Строки
Что вернёт substr('abcdef', -3)?
Модель: «def»
Верный ответ: def
T03-L7 · Строки
ucfirst() изменяет строку, переданную ей, на месте.
Модель: «нет»
Верный ответ: нет
T03-L8 · Строки
В heredoc работают интерполяция переменных, а в nowdoc — нет.
Модель: «да»
Верный ответ: да
T03-L9 · Строки
Что выведет этот код? ```php echo strtr('abc', ['a' => '1', 'ab' => '2']); ```
Модель: «1bc»
Верный ответ: 2c
T03-L10 · Строки
Что выведет этот код? ```php echo '[' . substr('hello', -10) . ']'; ```
Модель: «[o]»
Верный ответ: [hello]
7/10
Массивы
T04-L1 · Массивы
Функция sort() сохраняет связь ключей и значений массива.
Модель: «нет»
Верный ответ: нет
T04-L2 · Массивы
Строковый ключ '5' в массиве сохраняется как целое число 5.
Модель: «да»
Верный ответ: да
T04-L3 · Массивы
Функция in_array() по умолчанию использует строгое сравнение (===).
Модель: «нет»
Верный ответ: нет
T04-L4 · Массивы
array_filter() без колбэка удаляет из массива все «пустые» (falsy) элементы.
Модель: «да»
Верный ответ: да
T04-L5 · Массивы
Функция array_slice() по умолчанию сохраняет исходные числовые ключи массива.
Модель: «нет»
Верный ответ: нет
T04-L6 · Массивы
Что вернёт array_slice([10, 20, 30, 40], 1, 2)?
Модель: «json»
Верный ответ: [20,30]
T04-L7 · Массивы
Сколько элементов будет в count(['a' => 1] + ['a' => 9, 'b' => 2])?
Модель: «2»
Верный ответ: 2
T04-L8 · Массивы
Spread-оператор [...$a, ...$b] с PHP 8.1 поддерживает массивы со строковыми ключами.
Модель: «нет»
Верный ответ: да
T04-L9 · Массивы
Что выведет этот код? ```php $a = ['k' => 1, 'n' => 2]; $b = ['k' => 9, 'm' => 3]; echo implode(',', array_keys($a + $b)); ```
Модель: «k,n,m»
Верный ответ: k,n,m
T04-L10 · Массивы
Что выведет этот код? ```php $a = [[1, 'x', 2], [2, 'y', 1], [3, 'z', 2]]; usort($a, fn($p, $q) => $p[2] <=> $q[2]); echo implode('', array_column($a, 1)); ```
Модель: «zyx»
Верный ответ: yxz
7/10
Функции и замыкания
T05-L1 · Функции и замыкания
Именованные аргументы нельзя комбинировать с распаковкой массива ...$args в одном вызове.
Модель: «да»
Верный ответ: нет
T05-L2 · Функции и замыкания
Анонимная функция без use видит переменные внешней области видимости.
Модель: «нет»
Верный ответ: нет
T05-L3 · Функции и замыкания
Что вернёт func_num_args() внутри function f($a) { return func_num_args(); } при вызове f(1, 2, 3)?
Модель: «2»
Верный ответ: 3
T05-L4 · Функции и замыкания
Тело стрелочной функции fn может состоять из нескольких выражений в фигурных скобках.
Модель: «нет»
Верный ответ: нет
T05-L5 · Функции и замыкания
Стрелочная функция fn захватывает внешние переменные по ссылке (лениво, при использовании).
Модель: «да»
Верный ответ: нет
T05-L6 · Функции и замыкания
Замыкание, объявленное как static function () {}, не захватывает $this.
Модель: «да»
Верный ответ: да
T05-L7 · Функции и замыкания
Что выведет: $x = 5; $f = function () use ($x) { return $x; }; $x = 7; echo $f();
Модель: «5»
Верный ответ: 5
T05-L8 · Функции и замыкания
В «слабом» режиме типизации (без strict_types) передача строки "5" в параметр с типом int допустима.
Модель: «да»
Верный ответ: да
T05-L9 · Функции и замыкания
Что выведет этот код? ```php class P { private int $v = 3; public function g(): int { return $this->v; } } $p = new P; $f = $p->g(...); $p = null; echo $f(); ```
Модель: «3»
Верный ответ: 3
T05-L10 · Функции и замыкания
Что выведет этот код? ```php function f(int $a, int $b): int { return $a - $b; } echo f(...['b' => 1, 'a' => 5]); ```
Модель: «4»
Верный ответ: 4
7/10
ООП: классы и наследование
T06-L1 · ООП: классы и наследование
PHP поддерживает promotion свойств в конструкторе: public function __construct(private int $x) {}.
Модель: «да»
Верный ответ: да
T06-L2 · ООП: классы и наследование
Какое ключевое слово запрещает переопределять метод в подклассах?
Модель: «final»
Верный ответ: final
T06-L3 · ООП: классы и наследование
Метод, объявленный как final, нельзя переопределить в подклассе.
Модель: «да»
Верный ответ: да
T06-L4 · ООП: классы и наследование
Свойства родителя с видимостью private доступны в подклассе.
Модель: «нет»
Верный ответ: нет
T06-L5 · ООП: классы и наследование
Что вернёт get_class(new class {})? Ответь частью имени до нулевого байта (без пути к файлу).
Модель: «anonymous»
Верный ответ: class@anonymous
T06-L6 · ООП: классы и наследование
private-метод родителя не входит в контракт наследования: потомок может объявить метод с тем же именем с любой видимостью.
Модель: «да»
Верный ответ: да
T06-L7 · ООП: классы и наследование
Магический метод __get() вызывается только для несуществующих свойств.
Модель: «нет»
Верный ответ: нет
T06-L8 · ООП: классы и наследование
Что бросит повторное присваивание readonly-свойства — Exception или Error?
Модель: «exception»
Верный ответ: error
T06-L9 · ООП: классы и наследование
Что выведет этот код? ```php class A { public function who(): string { return static::class; } } class B extends A {} echo (new B)->who(); ```
Модель: «b»
Верный ответ: b
T06-L10 · ООП: классы и наследование
Что выведет этот код на PHP 8.5? ```php class C { public int $x = 0 { set { $this->x = $value * 2; } } } $c = new C; $c->x = 5; echo $c->x; ```
Модель: «10»
Верный ответ: 10
8/10
Интерфейсы, трейты, enum
T07-L1 · Интерфейсы, трейты, enum
Интерфейс может объявлять константы.
Модель: «нет»
Верный ответ: да
T07-L2 · Интерфейсы, трейты, enum
Какой оператор проверяет, что объект реализует класс или интерфейс?
Модель: «instanceof»
Верный ответ: instanceof
T07-L3 · Интерфейсы, трейты, enum
Интерфейс может объявлять статические методы.
Модель: «нет»
Верный ответ: да
T07-L4 · Интерфейсы, трейты, enum
Оператор instanceof проверяет только наследование классов: интерфейсы он не учитывает.
Модель: «нет»
Верный ответ: нет
T07-L5 · Интерфейсы, трейты, enum
Метод интерфейса может иметь реализацию по умолчанию, как метод трейта.
Модель: «да»
Верный ответ: нет
T07-L6 · Интерфейсы, трейты, enum
Абстрактный метод в абстрактном классе может иметь видимость protected.
Модель: «нет»
Верный ответ: да
T07-L7 · Интерфейсы, трейты, enum
Сколько элементов вернёт Foo::cases() для enum Foo { case A; case B; case C; }?
Модель: «3»
Верный ответ: 3
T07-L8 · Интерфейсы, трейты, enum
Трейт может объявлять константы.
Модель: «да»
Верный ответ: да
T07-L9 · Интерфейсы, трейты, enum
Что выведет этот код? ```php trait TA { public function f(): string { return 'A'; } } trait TB { public function f(): string { return 'B'; } } class TC { use TA, TB { TB::f insteadof TA; TA::f as g; } } echo (new TC)->f() . (new TC)->g(); ```
Модель: «ba»
Верный ответ: ba
T07-L10 · Интерфейсы, трейты, enum
Что выведет этот код? ```php trait Counter { public static int $n = 0; } class CX { use Counter; } class CY { use Counter; } CX::$n = 1; echo CY::$n; ```
Модель: «1»
Верный ответ: 0
5/10
Исключения и ошибки
T08-L1 · Исключения и ошибки
Интерфейс Throwable — общий предок и для Exception, и для Error.
Модель: «да»
Верный ответ: да
T08-L2 · Исключения и ошибки
Блок catch (Exception $e) перехватит и TypeError, потому что TypeError в итоге наследуется от Exception.
Модель: «да»
Верный ответ: нет
T08-L3 · Исключения и ошибки
Оператор @ подавляет и исключения тоже.
Модель: «да»
Верный ответ: нет
T08-L4 · Исключения и ошибки
Какой класс ошибки бросит intdiv(5, 0)?
Модель: «zerodivisionerror»
Верный ответ: divisionbyzeroerror
T08-L5 · Исключения и ошибки
Блок finally выполняется только если исключение было поймано блоком catch.
Модель: «нет»
Верный ответ: нет
T08-L6 · Исключения и ошибки
Исключение, выброшенное внутри блока finally, никак не влияет на результат try-блока.
Модель: «да»
Верный ответ: нет
T08-L7 · Исключения и ошибки
Что вернёт выражение: (bool) new Exception('x')?
Модель: «да»
Верный ответ: true
T08-L8 · Исключения и ошибки
Функции, зарегистрированные через register_shutdown_function(), выполняются при вызове exit.
Модель: «да»
Верный ответ: да
T08-L9 · Исключения и ошибки
Что выведет этот код? ```php try { try { throw new RuntimeException('first'); } finally { throw new LogicException('second'); } } catch (LogicException $e) { echo $e->getMessage(); } ```
Модель: «second»
Верный ответ: second
T08-L10 · Исключения и ошибки
Что выведет этот код? ```php function f(): int { try { return 1; } finally { return 2; } } echo f(); ```
Модель: «2»
Верный ответ: 2
6/10
Пространства имён и автозагрузка
T09-L1 · Пространства имён и автозагрузка
Директива use App\Service\Mailer; сама по себе подключает файл с классом.
Модель: «нет»
Верный ответ: нет
T09-L2 · Пространства имён и автозагрузка
Что пишут после use, чтобы импортировать функцию (а не класс): слово function или const?
Модель: «function»
Верный ответ: function
T09-L3 · Пространства имён и автозагрузка
В какой файл (путь от src/) PSR-4 «App\ → src/» положит класс App\Controller\Api\UserController?
Модель: «src/controller/api/usercontroller.php»
Верный ответ: src/controller/api/usercontroller.php
T09-L4 · Пространства имён и автозагрузка
Подключение vendor/autoload.php регистрирует обработчики через spl_autoload_register().
Модель: «да»
Верный ответ: да
T09-L5 · Пространства имён и автозагрузка
Магическая константа __NAMESPACE__ содержит имя текущего пространства имён.
Модель: «да»
Верный ответ: да
T09-L6 · Пространства имён и автозагрузка
Относительное имя класса (без ведущего \) в new резолвится от глобального корня.
Модель: «нет»
Верный ответ: нет
T09-L7 · Пространства имён и автозагрузка
При маппинге PSR-4 «App\ → src/» класс App\Model\User лежит в файле src/Model/User.php.
Модель: «да»
Верный ответ: да
T09-L8 · Пространства имён и автозагрузка
Директиву use можно писать внутри тела функции — импорт будет действовать для этой функции.
Модель: «нет»
Верный ответ: нет
T09-L9 · Пространства имён и автозагрузка
Что выведет этот код? ```php namespace N; use App\Foo as Baz; echo Baz::class . '|' . \Baz::class; ```
Модель: «n\baz|app\foo»
Верный ответ: app\foo|baz
T09-L10 · Пространства имён и автозагрузка
Что выведет этот код? ```php namespace Ns; class Foo {} $c = 'Foo'; echo (class_exists($c) ? 'yes' : 'no') . (class_exists(__NAMESPACE__ . '\\' . $c) ? 'yes' : 'no'); ```
Модель: «yesyes»
Верный ответ: noyes
8/10
Ссылки и область видимости
T10-L1 · Ссылки и область видимости
Массивы при присваивании копируются, а не передаются по ссылке.
Модель: «нет»
Верный ответ: да
T10-L2 · Ссылки и область видимости
Что выведет: $a = [1, 2]; $b = $a; $b[] = 3; echo count($a);
Модель: «3»
Верный ответ: 2
T10-L3 · Ссылки и область видимости
Внутри функции пользовательские переменные глобальной области недоступны без global, $GLOBALS или передачи параметром.
Модель: «да»
Верный ответ: да
T10-L4 · Ссылки и область видимости
unset($GLOBALS['x']) внутри функции удаляет глобальную переменную только для этой функции.
Модель: «нет»
Верный ответ: нет
T10-L5 · Ссылки и область видимости
Что выведет: function inc(&$x) { $x++; } $n = 5; inc($n); echo $n;
Модель: «6»
Верный ответ: 6
T10-L6 · Ссылки и область видимости
Foreach по массиву (по значению) работает с «живым» массивом: изменения массива внутри цикла видны в этом же проходе.
Модель: «нет»
Верный ответ: нет
T10-L7 · Ссылки и область видимости
Статическое свойство класса у каждого экземпляра своё: изменения в одном объекте не видны в других.
Модель: «нет»
Верный ответ: нет
T10-L8 · Ссылки и область видимости
Массив может иметь булев ключ true, и он сохранится как bool.
Модель: «да»
Верный ответ: нет
T10-L9 · Ссылки и область видимости
Что выведет этот код? ```php $a = [1, 2, 3]; foreach ($a as &$v) {} $v = 99; echo implode(',', $a); ```
Модель: «1,2,99»
Верный ответ: 1,2,99
T10-L10 · Ссылки и область видимости
Что выведет этот код? ```php class A { public function inc(): int { static $n = 0; return ++$n; } } class B extends A {} $a = new A; $b = new B; $a->inc(); $b->inc(); echo $a->inc(); ```
Модель: «2»
Верный ответ: 3
6/10
Генераторы, итераторы, SPL
T11-L1 · Генераторы, итераторы, SPL
Внутри генератора можно использовать return со значением, и оно попадёт в $gen->getReturn().
Модель: «да»
Верный ответ: да
T11-L2 · Генераторы, итераторы, SPL
Полностью пройденный генератор можно «перемотать» через rewind() и пройти снова.
Модель: «да»
Верный ответ: нет
T11-L3 · Генераторы, итераторы, SPL
Конструкция yield from делегирует проход другому генератору или итерируемому объекту.
Модель: «да»
Верный ответ: да
T11-L4 · Генераторы, итераторы, SPL
Что вернёт get_class(g()) для function g() { yield 1; }?
Модель: «generator»
Верный ответ: generator
T11-L5 · Генераторы, итераторы, SPL
Сколько элементов вернёт count(iterator_to_array((function () { yield from [1, 2, 3]; })()));
Модель: «3»
Верный ответ: 3
T11-L6 · Генераторы, итераторы, SPL
Класс SplStack реализует очередь FIFO.
Модель: «нет»
Верный ответ: нет
T11-L7 · Генераторы, итераторы, SPL
ArrayIterator позволяет обернуть массив и обходить его через интерфейс Iterator.
Модель: «да»
Верный ответ: да
T11-L8 · Генераторы, итераторы, SPL
Объект класса ArrayObject нельзя обойти через foreach.
Модель: «нет»
Верный ответ: нет
T11-L9 · Генераторы, итераторы, SPL
Что выведет этот код? ```php function g(): Generator { $x = yield 1; return $x + 1; } $g = g(); $g->send(10); echo $g->getReturn(); ```
Модель: «11»
Верный ответ: 11
T11-L10 · Генераторы, итераторы, SPL
Что выведет этот код? ```php function inner(): Generator { yield 1; yield 2; return 'ok'; } function outer(): Generator { $r = yield from inner(); yield $r; } echo implode(',', iterator_to_array(outer())); ```
Модель: «1,2,ok»
Верный ответ: ok,2
8/10
Конфигурация и безопасность
T12-L1 · Конфигурация и безопасность
password_hash() генерирует соль автоматически — передавать её отдельно не нужно.
Модель: «да»
Верный ответ: да
T12-L2 · Конфигурация и безопасность
Алгоритм PASSWORD_DEFAULT в PHP 8 — это md5 с автоматически добавленной солью.
Модель: «нет»
Верный ответ: нет
T12-L3 · Конфигурация и безопасность
Что вернёт password_verify('secret', password_hash('secret', PASSWORD_DEFAULT))?
Модель: «да»
Верный ответ: true
T12-L4 · Конфигурация и безопасность
Функция strip_tags() защищает от SQL-инъекций.
Модель: «нет»
Верный ответ: нет
T12-L5 · Конфигурация и безопасность
Функция session_regenerate_id() используется для защиты от фиксации сессии при входе пользователя.
Модель: «да»
Верный ответ: да
T12-L6 · Конфигурация и безопасность
Какая встроенная функция возвращает имя SAPI (например, cli)?
Модель: «php_sapi_name()»
Верный ответ: php_sapi_name
T12-L7 · Конфигурация и безопасность
session_destroy() удаляет данные сессии на сервере, но не cookie в браузере пользователя.
Модель: «да»
Верный ответ: да
T12-L8 · Конфигурация и безопасность
Без вызова session_start() массив $_SESSION автоматически загружается данными сессии.
Модель: «нет»
Верный ответ: нет
T12-L9 · Конфигурация и безопасность
Что выведет этот код? ```php $hash = password_hash('x', PASSWORD_BCRYPT, ['cost' => 4]); echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 4]) ? 'yes' : 'no'; echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 5]) ? 'yes' : 'no'; ```
Модель: «noyes»
Верный ответ: noyes
T12-L10 · Конфигурация и безопасность
Что выведет этот код на PHP 8.5? ```php echo (E_ALL & 2048) === 0 ? 'strict-out' : 'strict-in'; ```
Модель: «strict-in»
Верный ответ: strict-out
9/10
PHP 8.4–8.5
VC-L1 · PHP 8.4–8.5
В какой версии PHP появилась функция array_find()?
Модель: «php 7.2»
Верный ответ: 8.4
VC-L2 · PHP 8.4–8.5
Property hooks (get/set прямо в объявлении свойства) вошли в PHP 8.4.
Модель: «нет»
Верный ответ: да
VC-L3 · PHP 8.4–8.5
Асимметричная видимость (public private(set) string $name) появилась в PHP 8.4.
Модель: «нет»
Верный ответ: да
VC-L4 · PHP 8.4–8.5
В какой версии PHP впервые появился атрибут #[\NoDiscard]? Ответь номером версии.
Модель: «8.1»
Верный ответ: 8.5
VC-L5 · PHP 8.4–8.5
В какой версии PHP впервые появился оператор конвейера |> (pipe)? Ответь номером версии.
Модель: «8.0»
Верный ответ: 8.5
VC-L6 · PHP 8.4–8.5
В какой версии PHP появился clone-with — синтаксис clone($obj, ['x' => 1])? Ответь номером версии.
Модель: «7.4»
Верный ответ: 8.5
VC-L7 · PHP 8.4–8.5
В какой версии PHP появились функции array_first() и array_last()?
Модель: «8.1»
Верный ответ: 8.5
VC-L8 · PHP 8.4–8.5
Для какой версии PHP был принят RFC Partial Function Application v2 (по состоянию на 07.11.2026)? Ответь номером версии.
Модель: «8.2»
Верный ответ: 8.6
VC-L9 · PHP 8.4–8.5
Что выведет этот код на PHP 8.5? ```php class C { public function hi(): string { return 'hi'; } } echo new C()->hi(); ```
Модель: «hi»
Верный ответ: hi
VC-L10 · PHP 8.4–8.5
Что выведет этот код на PHP 8.5? ```php class Heavy { public int $v = 0; } $r = new ReflectionClass(Heavy::class); $o = $r->newLazyGhost(function (Heavy $obj) { $obj->v = 21; }); echo $r->isUninitializedLazyObject($o) ? 'yes' : 'no'; $o->v; echo $r->isUninitializedLazyObject($o) ? 'yes' : 'no'; ```
Модель: «noyes»
Верный ответ: yesno
1/10
PHP: 8.6+ и будущее
VF-L1 · PHP: 8.6+ и будущее
Для какой версии PHP реализован RFC clamp_v2 (функция clamp()) по состоянию на 07.11.2026? Ответь номером версии.
Модель: «8.1»
Верный ответ: 8.6
VF-L2 · PHP: 8.6+ и будущее
RFC Context Managers v2 уже принят в PHP (на 07.11.2026).
Модель: «нет»
Верный ответ: нет
VF-L3 · PHP: 8.6+ и будущее
RFC Bound-Erased Generic Types (generics) был отклонён в 2026 году.
Модель: «нет»
Верный ответ: да
VF-L4 · PHP: 8.6+ и будущее
На 07.11.2026 RFC о включении многопоточности (ZTS) по умолчанию уже принят в PHP.
Модель: «нет»
Верный ответ: нет
VF-L5 · PHP: 8.6+ и будущее
В PHP 8.5 дженериков (параметризованных типов) по-прежнему нет.
Модель: «да»
Верный ответ: да
VF-L6 · PHP: 8.6+ и будущее
На 07.11.2026 последняя стабильная версия PHP — 8.5, а PHP 8.6 ещё не выпущена (GA — 19.11.2026).
Модель: «нет»
Верный ответ: да
VF-L7 · PHP: 8.6+ и будущее
Ветка PHP 6 так и не вышла: после PHP 5.6 вышел сразу PHP 7.0.
Модель: «да»
Верный ответ: да
VF-L8 · PHP: 8.6+ и будущее
RFC о добавлении атрибута #[\Deprecated] в ядро был принят.
Модель: «да»
Верный ответ: да
5/8
Чистая архитектура
T25-L1 · Чистая архитектура
Правило зависимостей в чистой и луковичной архитектурах: внутренние слои не знают о внешних — зависимости направлены к центру.
Модель: «да»
Верный ответ: да
T25-L2 · Чистая архитектура
Сущности домена не импортируют ни Doctrine, ни Symfony — только язык и, возможно, стандартную библиотеку.
Модель: «— (нет ответа)»
Верный ответ: да
T25-L3 · Чистая архитектура
Контроллеры и Twig-шаблоны относятся к слою бизнес-логики, потому что именно они вызывают use cases.
Модель: «нет»
Верный ответ: нет
T25-L4 · Чистая архитектура
Что находится в самом центре луковичной архитектуры?
Модель: «бизнес-логика»
Верный ответ: доменная модель
T25-L5 · Чистая архитектура
Нарушение границ слоёв можно поймать автоматикой: анализатор зависимостей между слоями (например, deptrac) падает на запрещённом вызове.
Модель: «да»
Верный ответ: да
T25-L6 · Чистая архитектура
Use case (interactor) может принимать HTTP-запрос или EntityManager как аргументы — так проще.
Модель: «да»
Верный ответ: нет
T25-L7 · Чистая архитектура
Как называется компонент, предоставляющий коллекцию агрегатов/сущностей, скрывая механизм хранения за интерфейсом?
Модель: «репозиторий»
Верный ответ: репозиторий
T25-L8 · Чистая архитектура
Замена PostgreSQL на другую БД в чистой архитектуре затрагивает только внешний слой — домен и use cases не меняются.
Модель: «да»
Верный ответ: да
T25-L9 · Чистая архитектура
Слои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class OrderService { public function __construct( private PlaceOrder $handler, private Db $db, ) {} } ```
Модель: «2»
Верный ответ: 2
T25-L10 · Чистая архитектура
Слои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class BillingService { public function __construct( private PlaceOrder $handler, private Db $db, private \App\Infrastructure\Logger $logger, ) {} } ```
Модель: «2»
Верный ответ: 3
6/10
DDD
T26-L1 · DDD
Агрегат в DDD — это просто другое название таблицы базы данных.
Модель: «нет»
Верный ответ: нет
T26-L2 · DDD
Value Object неизменяем и сравнивается по значениям полей, а не по идентификатору.
Модель: «да»
Верный ответ: да
T26-L3 · DDD
Как называется единственная точка внешнего входа в агрегат, через которую проходят все изменения?
Модель: «точка входа»
Верный ответ: aggregate root
T26-L4 · DDD
В DDD репозиторий объявляется на агрегат (его корень), а не на каждую сущность.
Модель: «да»
Верный ответ: да
T26-L5 · DDD
Ubiquitous language — единый язык модели, общий для разработчиков и предметных экспертов.
Модель: «да»
Верный ответ: да
T26-L6 · DDD
Как называется граница, внутри которой модель и её язык едины, а снаружи те же понятия — другие модели?
Модель: «границы языка»
Верный ответ: bounded context
T26-L7 · DDD
Анемичная модель (объекты только с геттерами/сеттерами, логика в сервисах) — рекомендуемый стиль DDD.
Модель: «нет»
Верный ответ: нет
T26-L8 · DDD
Bounded context означает, что у каждого контекста своя модель: одно и то же понятие в разных контекстах — разные классы.
Модель: «да»
Верный ответ: да
T26-L9 · DDD
Что выведет этот код? ```php final class Order { private array $items = []; public function add(string $sku): void { $this->items[$sku] = true; } public function count(): int { return count($this->items); } public function remove(string $sku): void { if (count($this->items) === 1) { throw new DomainException('last item'); } unset($this->items[$sku]); } } $o = new Order; $o->add('a'); try { $o->remove('a'); } catch (DomainException) { } echo $o->count(); ```
Модель: «0»
Верный ответ: 1
T26-L10 · DDD
Что выведет этот код? ```php final class Money { public function __construct(public readonly int $amount) {} public function add(Money $o): Money { return new self($this->amount + $o->amount); } } $a = new Money(10); $c = $a->add(new Money(5)); echo $a->amount . ',' . $c->amount; ```
Модель: «10,15»
Верный ответ: 10,15
7/10
Symfony
T13-L1 · Symfony
Сервисы в DI-контейнере Symfony по умолчанию создаются лениво — при первом обращении к ним.
Модель: «да»
Верный ответ: да
T13-L2 · Symfony
Какая консольная команда Symfony выводит список всех зарегистрированных маршрутов?
Модель: «bin/console router:debug»
Верный ответ: debug:router
T13-L3 · Symfony
Autowiring в Symfony требует вручную перечислять каждый сервис в конфигурации services.yaml.
Модель: «нет»
Верный ответ: нет
T13-L4 · Symfony
Twig-шаблоны компилируются в PHP-классы и кэшируются между запросами.
Модель: «да»
Верный ответ: да
T13-L5 · Symfony
Контейнер DI в dev-окружении Symfony пересобирается только после изменения отслеживаемых файлов, а не при каждом запросе.
Модель: «да»
Верный ответ: да
T13-L6 · Symfony
Какая переменная окружения выбирает активное окружение Symfony (dev/prod)?
Модель: «app_env»
Верный ответ: app_env
T13-L7 · Symfony
Метод контроллера может быть private — маршрутизация Symfony работает с любыми методами класса.
Модель: «да»
Верный ответ: нет
T13-L8 · Symfony
Подписчики событий (EventSubscriber) всегда получают события раньше слушателей (listeners), потому что интерфейс даёт им приоритет.
Модель: «нет»
Верный ответ: нет
T13-L9 · Symfony
Что выведет этот код? ```php use Symfony\Component\HttpFoundation\Request; $r = Request::create('/demo', 'GET', [], [], [], ['HTTP_X_TOKEN' => 'abc']); echo $r->headers->get('X-Token') === 'abc' ? 'mapped' : 'missing'; ```
Модель: «mapped»
Верный ответ: mapped
T13-L10 · Symfony
Что выведет этот код? ```php use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Contracts\EventDispatcher\Event; $d = new EventDispatcher(); $out = ''; $d->addListener('e', function () use (&$out) { $out .= 'B'; }, 10); $d->addListener('e', function () use (&$out) { $out .= 'A'; }); $d->addListener('e', function () use (&$out) { $out .= 'C'; }, 5); $d->dispatch(new Event(), 'e'); echo $out; ```
Модель: «cab»
Верный ответ: bca
7/10
Symfony: Security и формы
T22-L1 · Symfony: Security и формы
В современном Symfony (6.0+) аутентификация строится на классах-authenticator (AuthenticatorInterface); прежняя система guard удалена.
Модель: «да»
Верный ответ: да
T22-L2 · Symfony: Security и формы
Какой атрибут Symfony проверяет роль/право прямо на методе контроллера (без него — 403)?
Модель: «require_role»
Верный ответ: isgranted
T22-L3 · Symfony: Security и формы
Voters (голосующие) — механизм Symfony для проверки доступа к конкретному объекту: isGranted('EDIT', $post).
Модель: «да»
Верный ответ: да
T22-L4 · Symfony: Security и формы
Ограничения валидации в современных Symfony (7+) объявляются PHP-атрибутами (#[Assert\NotBlank]); аннотации-докблоки больше не поддерживаются.
Модель: «нет»
Верный ответ: да
T22-L5 · Symfony: Security и формы
CSRF-защита форм в Symfony включена по умолчанию: форма проверяет токен при отправке.
Модель: «да»
Верный ответ: да
T22-L6 · Symfony: Security и формы
Валидация формы в Symfony выполняется на сервере, даже если клиентская (HTML5) проверка прошла.
Модель: «да»
Верный ответ: да
T22-L7 · Symfony: Security и формы
Какая команда Symfony maker генерирует класс формы (FormType)?
Модель: «make:form»
Верный ответ: make:form
T22-L8 · Symfony: Security и формы
Symfony хранит пароль пользователя в сессии в открытом виде (plaintext).
Модель: «нет»
Верный ответ: нет
T22-L9 · Symfony: Security и формы
Что выведет этот код? ```php use Symfony\Component\Validator\Validation; use Symfony\Component\Validator\Constraints as Assert; $v = Validation::createValidator(); echo count($v->validate([''], [new Assert\NotBlank()])); ```
Модель: «1»
Верный ответ: 0
T22-L10 · Symfony: Security и формы
Что выведет этот код? ```php use Symfony\Component\Form\Forms; use Symfony\Component\Form\Extension\Core\Type\TextType; $factory = Forms::createFormFactoryBuilder()->getFormFactory(); $form = $factory->create(TextType::class); try { echo $form->isValid() ? 'valid' : 'invalid'; } catch (Throwable $e) { echo get_class($e); } ```
Модель: «invalid»
Верный ответ: symfony\component\form\exception\logicexception
6/10
Symfony: конфигурация и сервисы
T23-L1 · Symfony: конфигурация и сервисы
Конфигурация бандлов Symfony лежит в config/packages — по одному файлу на бандл или тему.
Модель: «да»
Верный ответ: да
T23-L2 · Symfony: конфигурация и сервисы
Файл .env с dev-дефолтами коммитится в репозиторий, а настоящие секреты живут в некоммитимом .env.local.
Модель: «— (нет ответа)»
Верный ответ: да
T23-L3 · Symfony: конфигурация и сервисы
Какая команда Symfony выводит зарегистрированные сервисы контейнера и их алиасы?
Модель: «bin/console debug:container»
Верный ответ: debug:container
T23-L4 · Symfony: конфигурация и сервисы
Контейнер Symfony позволяет менять параметры в рантайме: $container->setParameter() работает из контроллера.
Модель: «нет»
Верный ответ: нет
T23-L5 · Symfony: конфигурация и сервисы
По умолчанию сервисы в Symfony публичны (public: true) — их достают из контейнера напрямую.
Модель: «нет»
Верный ответ: нет
T23-L6 · Symfony: конфигурация и сервисы
Без конфигурационного файла в config/packages бандл не заработает — настройки обязательны для каждого бандла.
Модель: «нет»
Верный ответ: нет
T23-L7 · Symfony: конфигурация и сервисы
Значения переменных окружения подставляются в services.yaml синтаксисом %env(VAR)%.
Модель: «да»
Верный ответ: да
T23-L8 · Symfony: конфигурация и сервисы
Какая переменная окружения Symfony включает режим отладки (влияет на профайлер и отладку Twig)?
Модель: «app_debug»
Верный ответ: app_debug
T23-L9 · Symfony: конфигурация и сервисы
Что выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->register('a', stdClass::class)->setPublic(true); $c->compile(); echo spl_object_id($c->get('a')) === spl_object_id($c->get('a')) ? 'same' : 'diff'; ```
Модель: «same»
Верный ответ: same
T23-L10 · Symfony: конфигурация и сервисы
Что выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->setParameter('name', 'Bob'); $c->setParameter('greeting', 'hi %name%'); $c->setParameter('message', '%greeting%!'); $c->compile(); echo $c->getParameter('message'); ```
Модель: «hi bob!»
Верный ответ: hi bob!
9/10
Symfony: Messenger
T16-L1 · Symfony: Messenger
Одно сообщение в Symfony Messenger может обрабатывать только один обработчик (handler).
Модель: «нет»
Верный ответ: нет
T16-L2 · Symfony: Messenger
Транспорт sync в Messenger ставит сообщение в очередь и обрабатывает его воркером, как и async.
Модель: «нет»
Верный ответ: нет
T16-L3 · Symfony: Messenger
Какой консольной командой запускается воркер, обрабатывающий сообщения из очередей Messenger?
Модель: «php artisan queue:work --queue=messenger»
Верный ответ: messenger:consume
T16-L4 · Symfony: Messenger
Повторы неудачных сообщений (retry_strategy) настраиваются на уровне транспорта Messenger.
Модель: «да»
Верный ответ: да
T16-L5 · Symfony: Messenger
По умолчанию Messenger сериализует сообщения в JSON.
Модель: «да»
Верный ответ: нет
T16-L6 · Symfony: Messenger
Symfony Scheduler по расписанию порождает сообщения и отправляет их через Messenger.
Модель: «да»
Верный ответ: да
T16-L7 · Symfony: Messenger
Какой встроенный транспорт Messenger хранит сообщения в таблицах БД через Doctrine?
Модель: «doctrine messenger»
Верный ответ: doctrine
T16-L8 · Symfony: Messenger
Пайплайн Messenger можно расширять собственными middleware, встраивая их до или после встроенных.
Модель: «да»
Верный ответ: да
T16-L9 · Symfony: Messenger
Что выведет этот код? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\StackInterface; use Symfony\Component\Messenger\Envelope; final class Trace implements MiddlewareInterface { public function __construct(private string $tag) {} public function handle(Envelope $e, StackInterface $stack): Envelope { echo $this->tag; return $stack->next()->handle($e, $stack); } } $bus = new MessageBus([new Trace('M1'), new Trace('M2')]); $bus->dispatch(new Envelope(new stdClass())); ```
Модель: «m1m2»
Верный ответ: m1m2
T16-L10 · Symfony: Messenger
Что выведет этот код? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; use Symfony\Component\Messenger\Handler\HandlersLocator; use Symfony\Component\Messenger\Handler\HandlerDescriptor; use Symfony\Component\Messenger\Envelope; class Ping {} $n = 0; $d1 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 1; }, ['alias' => 'h1']); $d2 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 10; }, ['alias' => 'h2']); $bus = new MessageBus([ new HandleMessageMiddleware(new HandlersLocator([Ping::class => [$d1, $d2]])), ]); $bus->dispatch(new Envelope(new Ping())); echo $n; ```
Модель: «11»
Верный ответ: 11
8/10
Symfony: версии
T28-L1 · Symfony: версии
Мажорные релизы Symfony выходят раз в два года, минорные — каждые шесть месяцев (в мае и ноябре).
Модель: «да»
Верный ответ: да
T28-L2 · Symfony: версии
Какой минимальной версии PHP требует Symfony 8?
Модель: «8.1»
Верный ответ: 8.4
T28-L3 · Symfony: версии
Symfony 7.0 сохранила поддержку аннотаций в докблоках (валидация, маршруты).
Модель: «да»
Верный ответ: нет
T28-L4 · Symfony: версии
AssetMapper позволяет управлять CSS/JS без node и webpack — через importmap.php.
Модель: «да»
Верный ответ: да
T28-L5 · Symfony: версии
Symfony 6.4 — обычный релиз без длительной поддержки.
Модель: «нет»
Верный ответ: нет
T28-L6 · Symfony: версии
При переходе на новую мажорную версию Symfony деприкейшены прошлой ветки продолжают работать — мажорные релизы их не удаляют.
Модель: «нет»
Верный ответ: нет
T28-L7 · Symfony: версии
Каждый мажорный релиз Symfony сопровождается UPGRADE-гайдом со списком изменений.
Модель: «да»
Верный ответ: да
T28-L8 · Symfony: версии
Какой компонент Symfony управляет ассетами и importmap без node/webpack?
Модель: «assetic»
Верный ответ: asset-mapper
T28-L9 · Symfony: версии
Проект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Security\Guard\AbstractGuardAuthenticator::class) ? 'yes' : 'no'; ```
Модель: «yes»
Верный ответ: no
T28-L10 · Symfony: версии
Проект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Routing\Loader\AnnotationClassLoader::class) ? 'yes' : 'no'; echo class_exists(\Symfony\Component\Routing\Loader\AttributeClassLoader::class) ? 'yes' : 'no'; ```
Модель: «yesyes»
Верный ответ: noyes
5/10
Symfony: 8.2 и будущее
T29-L1 · Symfony: 8.2 и будущее
На 07.11.2026 Symfony 8.2 уже выпущена.
Модель: «нет»
Верный ответ: нет
T29-L2 · Symfony: 8.2 и будущее
По состоянию на 07.11.2026 Symfony 8.2 запланирована на ноябрь 2026 — в обычном шестимесячном цикле.
Модель: «да»
Верный ответ: да
T29-L3 · Symfony: 8.2 и будущее
Какая версия Symfony выйдет следующей после 8.1 (по состоянию на 07.11.2026)?
Модель: «symfony 9»
Верный ответ: 8.2
T29-L4 · Symfony: 8.2 и будущее
Symfony 8.2 — мажорный релиз, требующий переписывания приложений под новые API.
Модель: «нет»
Верный ответ: нет
T29-L5 · Symfony: 8.2 и будущее
Обновление внутри мажорной ветки (8.1 → 8.2) не должно требовать изменений кода — обратная совместимость сохраняется.
Модель: «да»
Верный ответ: да
T29-L6 · Symfony: 8.2 и будущее
Какая минорная версия ветки 8.x выйдет последней перед Symfony 9.0?
Модель: «82»
Верный ответ: 8.4
T29-L7 · Symfony: 8.2 и будущее
Symfony 8.2 потребует обновления PHP до 8.5 — придётся обновлять PHP вместе с ней.
Модель: «нет»
Верный ответ: нет
T29-L8 · Symfony: 8.2 и будущее
Deprecations, добавленные в ветке 8.x, будут удалены не раньше Symfony 9.0.
Модель: «да»
Верный ответ: да
6/8
Twig
T21-L1 · Twig
Внутри {{ }} в Twig можно вызывать произвольный PHP-код напрямую.
Модель: «нет»
Верный ответ: нет
T21-L2 · Twig
Twig по умолчанию автоматически экранирует выводимые переменные.
Модель: «да»
Верный ответ: да
T21-L3 · Twig
Фильтр |e в Twig экранирует строку для безопасного вывода в HTML-контексте.
Модель: «да»
Верный ответ: да
T21-L4 · Twig
Какой фильтр из twig/intl-extra форматирует число с учётом локали?
Модель: «number_format»
Верный ответ: format_number
T21-L5 · Twig
Фильтр |raw отключает автоэкранирование для значения.
Модель: «да»
Верный ответ: да
T21-L6 · Twig
В Twig {{ }} выводит значение выражения, а {% %} выполняет теги — условия, циклы, set.
Модель: «да»
Верный ответ: да
T21-L7 · Twig
В Twig нельзя объявить переменную в шаблоне — значения только передаются из контроллера.
Модель: «да»
Верный ответ: нет
T21-L8 · Twig
Какая функция Twig выводит отладочную структуру переменной (массива, объекта)?
Модель: «dump»
Верный ответ: dump
T21-L9 · Twig
Что выведет этот шаблон Twig? ```twig {{ false|default(2) * 3 }} ```
Модель: «6»
Верный ответ: 6
T21-L10 · Twig
Какой класс исключения выбросит render() этого шаблона? ```twig {{ 'a' ~ 1 + 2 }} ```
Модель: «нет»
Верный ответ: runtimeerror
7/10
Bootstrap
T24-L1 · Bootstrap
Bootstrap — это CSS/JS-библиотека готовых компонентов интерфейса, а не SPA-фреймворк.
Модель: «да»
Верный ответ: да
T24-L2 · Bootstrap
Какой класс Bootstrap задаёт адаптивный контейнер с фиксированной максимальной шириной по брейкпоинтам?
Модель: «container»
Верный ответ: container
T24-L3 · Bootstrap
Сетка Bootstrap построена на CSS float и делит строку на 16 колонок.
Модель: «нет»
Верный ответ: нет
T24-L4 · Bootstrap
Именованные брейкпоинты Bootstrap (с инфиксом в классах) — sm, md, lg, xl, xxl; их пять.
Модель: «да»
Верный ответ: да
T24-L5 · Bootstrap
Утилиты вроде .mt-3 или .px-2 используют шаг spacing-шкалы: число — множитель $spacer.
Модель: «да»
Верный ответ: нет
T24-L6 · Bootstrap
Какой data-атрибут Bootstrap 5 включает интерактивный компонент (например, dropdown) на элементе?
Модель: «data-bs-toggle»
Верный ответ: data-bs-toggle
T24-L7 · Bootstrap
Компоненты Bootstrap 5 работают без jQuery — на чистом vanilla JS.
Модель: «да»
Верный ответ: да
T24-L8 · Bootstrap
Тёмную тему в Bootstrap включают классом .dark на корневом элементе.
Модель: «нет»
Верный ответ: нет
T24-L9 · Bootstrap
Какая max-width у .container в Bootstrap 5.3 при ширине окна 992px?
Модель: «960»
Верный ответ: 960
T24-L10 · Bootstrap
Какая утилита определит цвет текста в Bootstrap 5.3: `<p class="text-danger text-primary">…</p>`? Ответь именем класса-победителя.
Модель: «text-danger»
Верный ответ: text-danger
9/10
Doctrine
T14-L1 · Doctrine
Doctrine ORM сам создаёт таблицы в базе при первом обращении к сущности в рантайме.
Модель: «нет»
Верный ответ: нет
T14-L2 · Doctrine
Какой метод EntityManager помечает новый объект как управляемый, не выполняя SQL до flush()?
Модель: «persist»
Верный ответ: persist
T14-L3 · Doctrine
В Doctrine ORM 3 метод EntityManager::merge() доступен и делает переданный объект управляемым.
Модель: «да»
Верный ответ: нет
T14-L4 · Doctrine
DQL-запросы пишутся в терминах сущностей и их полей, а не таблиц и столбцов.
Модель: «да»
Верный ответ: да
T14-L5 · Doctrine
Что вернёт $repository->find(999), если записи с идентификатором 999 нет?
Модель: «нет»
Верный ответ: null
T14-L6 · Doctrine
DoctrineBundle в Symfony автоматически вызывает flush() в конце каждого запроса.
Модель: «нет»
Верный ответ: нет
T14-L7 · Doctrine
Для управляемой сущности достаточно изменить свойство: flush() зафиксирует изменение без вызова persist() — Unit of Work отслеживает изменения.
Модель: «да»
Верный ответ: да
T14-L8 · Doctrine
remove() выполняет SQL DELETE сразу, не дожидаясь flush().
Модель: «нет»
Верный ответ: нет
T14-L9 · Doctrine
Дано: Doctrine ORM 3, EntityManager на SQLite in-memory, entity User с автоинкрементным первичным ключом. Таблица users пуста. Что выведет этот код? ```php $u = new User(name: 'B'); $em->persist($u); $em->remove($u); $em->flush(); echo count($em->getConnection()->fetchAllAssociative('SELECT * FROM users')); ```
Модель: «0»
Верный ответ: 0
T14-L10 · Doctrine
Дано: Doctrine ORM 3, EntityManager на SQLite in-memory, entity User с автоинкрементным первичным ключом. Таблица users пуста. Что выведет этот код? ```php $u = new User(name: 'A'); $em->persist($u); $em->flush(); $a = $em->find(User::class, $u->getId()); $b = $em->find(User::class, $u->getId()); echo spl_object_id($a) === spl_object_id($b) ? 'same' : 'diff'; ```
Модель: «same»
Верный ответ: same
8/10
PostgreSQL
T15-L1 · PostgreSQL
PostgreSQL использует MVCC, поэтому читатели блокируют писателей, а писатели — читателей.
Модель: «нет»
Верный ответ: нет
T15-L2 · PostgreSQL
Какая команда SQL показывает план выполнения запроса, не выполняя сам запрос?
Модель: «explain»
Верный ответ: explain
T15-L3 · PostgreSQL
SERIAL и GENERATED ... AS IDENTITY — это два названия одного и того же механизма.
Модель: «нет»
Верный ответ: нет
T15-L4 · PostgreSQL
UNIQUE-ограничение PostgreSQL по умолчанию допускает только одну строку с NULL в столбце.
Модель: «нет»
Верный ответ: нет
T15-L5 · PostgreSQL
Какая агрегатная функция PostgreSQL склеивает строки с разделителем?
Модель: «string_agg»
Верный ответ: string_agg
T15-L6 · PostgreSQL
Обычный VACUUM возвращает место, занятое «мёртвыми» кортежами, операционной системе.
Модель: «да»
Верный ответ: нет
T15-L7 · PostgreSQL
Какое ключевое слово в определении window-функции разбивает строки на группы, для которых считается функция?
Модель: «over»
Верный ответ: partition by
T15-L8 · PostgreSQL
Уровень изоляции READ COMMITTED защищает от неповторяющегося чтения (non-repeatable read).
Модель: «да»
Верный ответ: нет
T15-L9 · PostgreSQL
Что вернёт этот SQL-запрос (PostgreSQL 17)? ```sql CREATE TEMP TABLE t (id int, x int); INSERT INTO t VALUES (1, 10), (2, 20), (3, 30); SELECT string_agg(s::text, ',' ORDER BY id) FROM ( SELECT id, sum(x) OVER (ORDER BY id) AS s FROM t ) q; ```
Модель: «10,30,60»
Верный ответ: 10,30,60
T15-L10 · PostgreSQL
Что вернёт этот SQL-запрос (PostgreSQL 17)? ```sql CREATE TEMP TABLE t (x int); INSERT INTO t VALUES (1), (NULL); SELECT count(x) FROM t; ```
Модель: «1»
Верный ответ: 1
7/10
PostgreSQL: транзакции и индексы
T17-L1 · PostgreSQL: транзакции и индексы
По умолчанию PostgreSQL выполняет каждый отдельный SQL-оператор в собственной неявной транзакции (autocommit).
Модель: «нет»
Верный ответ: да
T17-L2 · PostgreSQL: транзакции и индексы
Какая SQL-команда завершает транзакцию, сохраняя все её изменения?
Модель: «commit»
Верный ответ: commit
T17-L3 · PostgreSQL: транзакции и индексы
Индексы ускоряют не только SELECT: UPDATE и DELETE с поиском по индексированному столбцу тоже выигрывают.
Модель: «да»
Верный ответ: да
T17-L4 · PostgreSQL: транзакции и индексы
Для отката части операторов внутри транзакции PostgreSQL использует SAVEPOINT.
Модель: «да»
Верный ответ: да
T17-L5 · PostgreSQL: транзакции и индексы
EXPLAIN ANALYZE показывает план запроса, не выполняя сам запрос.
Модель: «нет»
Верный ответ: нет
T17-L6 · PostgreSQL: транзакции и индексы
Какое расширение PostgreSQL добавляет векторные типы и индексы для поиска по эмбеддингам?
Модель: «pgvector»
Верный ответ: vector
T17-L7 · PostgreSQL: транзакции и индексы
Частичный индекс (CREATE INDEX ... WHERE ...) строится только по строкам, удовлетворяющим условию.
Модель: «да»
Верный ответ: да
T17-L8 · PostgreSQL: транзакции и индексы
Уровень SERIALIZABLE в PostgreSQL реализован блокировкой строк, которые читает транзакция.
Модель: «нет»
Верный ответ: нет
T17-L9 · PostgreSQL: транзакции и индексы
Что вернёт этот SQL-запрос (PostgreSQL 17)? ```sql CREATE TEMP TABLE t (a int); CREATE UNIQUE INDEX ON t (a); INSERT INTO t VALUES (1) ON CONFLICT DO NOTHING; INSERT INTO t VALUES (1) ON CONFLICT DO NOTHING; SELECT count(*) FROM t; ```
Модель: «1»
Верный ответ: 1
T17-L10 · PostgreSQL: транзакции и индексы
Что выведет эта последовательность команд psql? ```sql BEGIN; CREATE TEMP TABLE t (a int, UNIQUE (a) DEFERRABLE INITIALLY DEFERRED); INSERT INTO t VALUES (1); INSERT INTO t VALUES (1); SELECT count(*) FROM t; ```
Модель: «1»
Верный ответ: 2
8/10
HTTP и REST API
T19-L1 · HTTP и REST API
HTTP-статус 201 означает, что в результате запроса создан новый ресурс.
Модель: «да»
Верный ответ: да
T19-L2 · HTTP и REST API
Какой HTTP-статус означает успешный запрос с пустым телом ответа (например, после DELETE)?
Модель: «204»
Верный ответ: 204
T19-L3 · HTTP и REST API
Метод DELETE идемпотентен по спецификации HTTP: повторный запрос по тому же ресурсу не меняет результат.
Модель: «да»
Верный ответ: да
T19-L4 · HTTP и REST API
Заголовок Access-Control-Allow-Origin отправляет клиент, чтобы сервер разрешил принимать запросы с другого origin.
Модель: «нет»
Верный ответ: нет
T19-L5 · HTTP и REST API
Код 429 Too Many Requests используется, когда клиент превысил лимит запросов (rate limiting).
Модель: «да»
Верный ответ: да
T19-L6 · HTTP и REST API
Коды 5xx означают ошибку клиента, а 4xx — ошибку на стороне сервера.
Модель: «нет»
Верный ответ: нет
T19-L7 · HTTP и REST API
Какой HTTP-заголовок указывает MIME-тип тела запроса или ответа?
Модель: «content-type»
Верный ответ: content-type
T19-L8 · HTTP и REST API
PATCH не обязан быть идемпотентным по RFC 5789, в отличие от PUT.
Модель: «нет»
Верный ответ: да
T19-L9 · HTTP и REST API
Какой HTTP-метод отправит эта команда? ```bash curl -s -d 'a=1' http://demo.local/api ```
Модель: «post»
Верный ответ: post
T19-L10 · HTTP и REST API
Какой HTTP-метод отправит эта команда? ```bash curl -s -G -d 'a=1' http://demo.local/api ```
Модель: «get»
Верный ответ: get
9/10
Безопасность и OAuth
T20-L1 · Безопасность и OAuth
Проверить пароль достаточно сравнением его хеша с хешем из базы обычным оператором ==.
Модель: «нет»
Верный ответ: нет
T20-L2 · Безопасность и OAuth
CSRF-токен выдаётся сервером (привязан к сессии) и проверяется на сервере при unsafe-запросах (POST и т.п.).
Модель: «да»
Верный ответ: да
T20-L3 · Безопасность и OAuth
Какой HTTP-заголовок включает политику CSP (Content Security Policy)?
Модель: «content-security-policy»
Верный ответ: content-security-policy
T20-L4 · Безопасность и OAuth
OAuth 2.0 — протокол аутентификации: access-токен сообщает, кто именно пользователь.
Модель: «нет»
Верный ответ: нет
T20-L5 · Безопасность и OAuth
XSS предотвращается валидацией ввода на сервере перед записью в базу.
Модель: «да»
Верный ответ: нет
T20-L6 · Безопасность и OAuth
В authorization code flow OAuth 2.0 какой параметр приходит в redirect_uri и обменивается на access-токен?
Модель: «code»
Верный ответ: code
T20-L7 · Безопасность и OAuth
Refresh-токен живёт дольше access-токена и позволяет получить новый access-токен без повторного входа пользователя.
Модель: «да»
Верный ответ: да
T20-L8 · Безопасность и OAuth
Соль пароля нужно держать в секрете: без неё хеш нельзя проверить.
Модель: «да»
Верный ответ: нет
T20-L9 · Безопасность и OAuth
Клиент обращается к токен-эндпоинту (RFC 6749) с несуществующим client_id. Какое значение поля error вернёт эндпоинт?
Модель: «invalid_client»
Верный ответ: invalid_client
T20-L10 · Безопасность и OAuth
OAuth 2.0: клиент начал поток с response_type=token. В какой части redirect_uri авторизационный сервер передаёт access_token?
Модель: «fragment»
Верный ответ: fragment
8/10
Тестирование: PHPUnit
T18-L1 · Тестирование: PHPUnit
PHPUnit выполняет тестовые методы любого класса — наследовать TestCase не обязательно.
Модель: «нет»
Верный ответ: нет
T18-L2 · Тестирование: PHPUnit
Метод setUp() в PHPUnit вызывается один раз перед всеми тестами класса.
Модель: «нет»
Верный ответ: нет
T18-L3 · Тестирование: PHPUnit
Поставщик данных (data provider) позволяет прогнать тест ровно с одним набором аргументов.
Модель: «да»
Верный ответ: нет
T18-L4 · Тестирование: PHPUnit
Какой метод PHPUnit объявляет ожидание исключения определённого класса?
Модель: «expectsexception»
Верный ответ: expectexception
T18-L5 · Тестирование: PHPUnit
В PHPUnit стаб (stub) проверяет, какие методы на нём вызывали, а мок (mock) только подставляет данные.
Модель: «нет»
Верный ответ: нет
T18-L6 · Тестирование: PHPUnit
В PHPUnit 10+ рекомендуемый способ передачи данных в тест — атрибут #[DataProvider] (аннотация @dataProvider устарела).
Модель: «да»
Верный ответ: да
T18-L7 · Тестирование: PHPUnit
В PHPUnit нельзя объявить зависимость одного теста от результата другого.
Модель: «нет»
Верный ответ: нет
T18-L8 · Тестирование: PHPUnit
Какая опция командной строки PHPUnit включает случайный порядок выполнения тестов?
Модель: «--randomize»
Верный ответ: --order-by=random
T18-L9 · Тестирование: PHPUnit
Сколько тестов выполнит эта команда? ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class CalcTest extends TestCase { public static function prov(): array { return [[1], [2], [3]]; } #[DataProvider('prov')] public function test_sum(int $x): void { $this->assertTrue($x > 0); } #[DataProvider('prov')] public function test_sum_abs(int $x): void { $this->assertTrue($x > 0); } public function test_other(): void { $this->assertTrue(true); } } ``` Команда: `phpunit CalcTest.php --filter test_sum` (PHPUnit 10.5)
Модель: «6»
Верный ответ: 6
T18-L10 · Тестирование: PHPUnit
Сколько тестов выполнит эта команда и сколько из них завершится failure? Ответь двумя числами через запятую (выполнено, упало). ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class Calc2Test extends TestCase { public function prov(): array { return [[1], [-1]]; } #[DataProvider('prov')] public function test_x(int $x): void { $this->assertTrue($x > 0); } } ``` Команда: `phpunit Calc2Test.php` (PHPUnit 10.5)
Модель: «2,1»
Верный ответ: 2,1
7/10

Все утверждения

КлеткаТемаУтверждениеОтвет РезультатОбоснование
T01-L1
3.21 c
Синтаксис и операторыСтроки в двойных и одинарных кавычках обрабатываются одинаково, разница только в скорости.«да»
Пояснение: PHP - это язык сценариев общего назначения, особенно подходящий для веб-разработки.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "PHP - это язык сценариев общего назначения, особенно подходящий для веб-разработки." ⏎ } ⏎ ```
неверно
верный: «нет»
В двойных кавычках работают интерполяция переменных и escape-последовательности, в одинарных — нет.
T01-L2
0.99 c
Синтаксис и операторыОператор ?? работает по семантике isset и не порождает предупреждений для неопределённых переменных.«да»
Пояснение: Оператор null coalescing (??) возвращает первый операнд, если он существует и не равен NULL, иначе возвращает второй операнд, и не генерирует предупреждений E_NOTICE для неопределённых переменных.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Оператор null coalescing (??) возвращает первый операнд, если он существует и не равен NULL, иначе возвращает второй операнд, и не генерирует предупреждений E_NOTICE для неопределённых переменных." ⏎ } ⏎ ```
верно?? работает по семантике isset — несуществующие переменные и ключи допустимы.
T01-L3
0.61 c
Синтаксис и операторыЧто выведет: echo 'a', 'b';«ab»
Пояснение: Оператор echo выводит переданные аргументы последовательно без разделителей, если не указано иное.
Raw
```json ⏎ {"answer": "ab", "пояснение": "Оператор echo выводит переданные аргументы последовательно без разделителей, если не указано иное."} ⏎ ```
верноecho принимает список аргументов: ab.
T01-L4
0.7 c
Синтаксис и операторыprint возвращает значение 1 и может использоваться внутри выражения.«да»
Пояснение: Функция print возвращает количество символов, которые она успешно вывела, что является целым числом, и ее можно использовать в выражениях.
Raw
```json ⏎ {"answer": "да", "пояснение": "Функция print возвращает количество символов, которые она успешно вывела, что является целым числом, и ее можно использовать в выражениях."} ⏎ ```
верноprint — выражение со значением 1, в отличие от echo, который значения не возвращает.
T01-L5
0.81 c
Синтаксис и операторыОператор ?: (элвис) возвращает левый операнд, если он ложный.«нет»
Пояснение: Оператор ?: (тернарный оператор) возвращает левый операнд, если он истинный, и правый операнд, если он ложный.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Оператор ?: (тернарный оператор) возвращает левый операнд, если он истинный, и правый операнд, если он ложный." ⏎ } ⏎ ```
верноНаоборот: $a ?: $b возвращает $a, если он истинный, иначе $b.
T01-L6
0.57 c
Синтаксис и операторыВ PHP 8 приоритет оператора конкатенации (.) ниже, чем у сложения и вычитания.«нет»
Пояснение: Оператор конкатенации (.) имеет более высокий приоритет, чем сложение и вычитание.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Оператор конкатенации (.) имеет более высокий приоритет, чем сложение и вычитание."} ⏎ ```
неверно
верный: «да»
С PHP 8 (RFC concat precedence) '.' имеет приоритет ниже арифметики: 'сумма: ' . 2 + 3 → 'сумма: 5' (в PHP 7 было иначе).
T01-L7
1.05 c
Синтаксис и операторыВыражение 2 ** 3 ** 2 в PHP вычисляется как (2 ** 3) ** 2, то есть 64.«нет»
Пояснение: В PHP оператор возведения в степень (**) имеет право-ассоциативность, поэтому 2 ** 3 ** 2 вычисляется как 2 ** (3 ** 2), то есть 2 ** 9 = 512.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В PHP оператор возведения в степень (**) имеет право-ассоциативность, поэтому 2 ** 3 ** 2 вычисляется как 2 ** (3 ** 2), то есть 2 ** 9 = 512." ⏎ } ⏎ ```
верно** право-ассоциативен: 2 ** (3 ** 2) = 2 ** 9 = 512.
T01-L8
0.77 c
Синтаксис и операторыКакую строку выведет: echo 'сумма: ' . 2 + 3; (PHP 8)?«сумма: 5»
Пояснение: Оператор конкатенации '.' объединяет строку 'сумма: ' с результатом сложения чисел 2 и 3.
Raw
```json ⏎ { ⏎   "answer": "сумма: 5", ⏎   "пояснение": "Оператор конкатенации '.' объединяет строку 'сумма: ' с результатом сложения чисел 2 и 3." ⏎ } ⏎ ```
верноПарная к verify-клетке про приоритет: 'сумма: 5'.
T02-L1
0.77 c
Типы и сравненияМассивы при строгом сравнении === считаются равными независимо от порядка элементов.«нет»
Пояснение: Строгое сравнение (===) требует, чтобы массивы имели одинаковые ключи и значения в том же порядке, чтобы считаться равными.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Строгое сравнение (===) требует, чтобы массивы имели одинаковые ключи и значения в том же порядке, чтобы считаться равными." ⏎ } ⏎ ```
верно=== для массивов требует совпадения и значений, и их порядка.
T02-L2
0.83 c
Типы и сравненияСравнение 0 == false возвращает false, потому что это строгое сравнение.«нет»
Пояснение: 0 == false возвращает true, потому что PHP выполняет нестрогое сравнение (==) между числом 0 и логическим значением false, приводя false к числу 0.
Raw
```json ⏎ {"answer": "нет", "пояснение": "0 == false возвращает true, потому что PHP выполняет нестрогое сравнение (==) между числом 0 и логическим значением false, приводя false к числу 0."} ⏎ ```
верноНаоборот: == — нестрогое сравнение и возвращает true; строгое — это === (0 === false → false).
T02-L3
0.67 c
Типы и сравненияВ PHP 8 выражение "abc" == 0 возвращает true.«нет»
Пояснение: В PHP строка "abc" не равна нулю, поэтому сравнение "abc" == 0 возвращает false.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В PHP строка \"abc\" не равна нулю, поэтому сравнение \"abc\" == 0 возвращает false." ⏎ } ⏎ ```
верноС PHP 8 нечисловая строка сравнивается как строка: "abc" == "0" → false (в PHP 7 было true).
T02-L4
0.77 c
Типы и сравненияЗначение null при нестрогом сравнении равно одновременно 0, пустой строке и false.«нет»
Пояснение: Значение null при нестрогом сравнении (==) равно 0, пустой строке ('') и false, но не одновременно всем трем.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Значение null при нестрогом сравнении (==) равно 0, пустой строке ('') и false, но не одновременно всем трем." ⏎ } ⏎ ```
неверно
верный: «да»
null == 0, null == "" и null == false — все true.
T02-L5
0.66 c
Типы и сравненияЧто вернёт выражение: (int) '42abc'?«42»
Пояснение: Приведение строки к типу int отбросит все символы после первого нецифрового символа.
Raw
```json ⏎ { ⏎   "answer": 42, ⏎   "пояснение": "Приведение строки к типу int отбросит все символы после первого нецифрового символа." ⏎ } ⏎ ```
верноВедущая числовая часть: 42, без ошибок и warning.
T02-L6
0.66 c
Типы и сравненияЧто вернёт выражение: '5' + 5?«55»
Пояснение: PHP выполняет неявное преобразование типов, преобразуя число 5 в строку '5' перед конкатенацией.
Raw
```json ⏎ {"answer": "55", "пояснение": "PHP выполняет неявное преобразование типов, преобразуя число 5 в строку '5' перед конкатенацией."} ⏎ ```
неверно
верный: «10»
Числовая строка приводится: int 10.
T02-L7
0.61 c
Типы и сравненияПри приведении к строке значение false превращается в "0".«да»
Пояснение: При приведении булевого значения `false` к строке, оно преобразуется в строку "0".
Raw
```json ⏎ {"answer": "да", "пояснение": "При приведении булевого значения `false` к строке, оно преобразуется в строку \"0\"."} ⏎ ```
неверно
верный: «нет»
false → "", true → "1".
T02-L8
0.86 c
Типы и сравненияСравнение 0.1 + 0.2 === 0.3 возвращает false.«да»
Пояснение: В PHP, из-за особенностей представления чисел с плавающей точкой, 0.1 + 0.2 часто не равно 0.3, поэтому сравнение возвращает false.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В PHP, из-за особенностей представления чисел с плавающей точкой, 0.1 + 0.2 часто не равно 0.3, поэтому сравнение возвращает false." ⏎ } ⏎ ```
верноДвоичная погрешность float: 0.1 + 0.2 = 0.30000000000000004.
T03-L1
0.78 c
Строкиstrrev() корректно переворачивает строку в UTF-8.«нет»
Пояснение: Функция strrev() работает неправильно с многобайтовыми символами, такими как UTF-8, и может перепутать порядок байтов.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Функция strrev() работает неправильно с многобайтовыми символами, такими как UTF-8, и может перепутать порядок байтов." ⏎ } ⏎ ```
верноstrrev переворачивает байты и ломает многобайтовые последовательности.
T03-L2
0.69 c
Строкиstr_contains('Hello world', 'world') возвращает true.«да»
Пояснение: Функция str_contains() проверяет, содержится ли указанная подстрока в строке, и возвращает true, если она содержится.
Raw
```json ⏎ {"answer": "да", "пояснение": "Функция str_contains() проверяет, содержится ли указанная подстрока в строке, и возвращает true, если она содержится."} ⏎ ```
верноstr_contains с PHP 8.0 проверяет вхождение подстроки.
T03-L3
0.69 c
Строкиstr_pad() умеет дополнять строку только справа.«нет»
Пояснение: Функция str_pad() может дополнять строку как слева, так и справа, в зависимости от значения параметра side.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Функция str_pad() может дополнять строку как слева, так и справа, в зависимости от значения параметра side." ⏎ } ⏎ ```
верноSTR_PAD_LEFT / STR_PAD_BOTH меняют сторону дополнения.
T03-L4
1.07 c
СтрокиПо умолчанию trim() срезает только пробелы, не трогая табы и переводы строк.«нет»
Пояснение: По умолчанию функция trim() удаляет все символы, указанные в параметре (по умолчанию - whitespace), включая пробелы, табы (\t), переводы строк (\n), возвраты каретки (\r) и вертикальные табуляции (\v).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "По умолчанию функция trim() удаляет все символы, указанные в параметре (по умолчанию - whitespace), включая пробелы, табы (\\t), переводы строк (\\n), возвраты каретки (\\r) и вертикальные табуляции (\\v)." ⏎ } ⏎ ```
верноСписок символов по умолчанию: « \t\n\r\0\x0B» — пробелы, табы, переводы строк, возврат каретки, null-байт, вертикальный таб. Проверено php -r.
T03-L5
0.9 c
СтрокиСколько БАЙТ вернёт strlen('привет') для строки в UTF-8?«6»
Пояснение: Функция strlen() в PHP считает количество байт в строке, а не количество символов в кодировке UTF-8, где каждый символ кириллицы занимает 1 байт.
Raw
```json ⏎ { ⏎   "answer": 6, ⏎   "пояснение": "Функция strlen() в PHP считает количество байт в строке, а не количество символов в кодировке UTF-8, где каждый символ кириллицы занимает 1 байт." ⏎ } ⏎ ```
неверно
верный: «12»
6 букв по 2 байта: 12.
T03-L6
0.69 c
СтрокиЧто вернёт substr('abcdef', -3)?«def»
Пояснение: Функция substr() извлекает подстроку. Отрицательный индекс отсчитывается с конца строки.
Raw
```json ⏎ { ⏎   "answer": "def", ⏎   "пояснение": "Функция substr() извлекает подстроку. Отрицательный индекс отсчитывается с конца строки." ⏎ } ⏎ ```
верноОтрицательное смещение — с конца: def.
T03-L7
0.7 c
Строкиucfirst() изменяет строку, переданную ей, на месте.«нет»
Пояснение: Функция ucfirst() возвращает новую строку с первой буквой в верхнем регистре, исходная строка не изменяется.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Функция ucfirst() возвращает новую строку с первой буквой в верхнем регистре, исходная строка не изменяется." ⏎ } ⏎ ```
верноСтроки неизменяемы; ucfirst возвращает новую строку.
T03-L8
0.66 c
СтрокиВ heredoc работают интерполяция переменных, а в nowdoc — нет.«да»
Пояснение: Heredoc позволяет интерполировать переменные, в то время как nowdoc рассматривает все символы буквально.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Heredoc позволяет интерполировать переменные, в то время как nowdoc рассматривает все символы буквально." ⏎ } ⏎ ```
верноNowdoc — «одинарные кавычки» в тройном синтаксисе: текст как есть.
T04-L1
0.65 c
МассивыФункция sort() сохраняет связь ключей и значений массива.«нет»
Пояснение: Функция sort() переиндексирует массив, теряя связь исходных ключей и значений.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Функция sort() переиндексирует массив, теряя связь исходных ключей и значений." ⏎ } ⏎ ```
верноsort перенумеровывает ключи; связь сохраняет asort.
T04-L2
0.75 c
МассивыСтроковый ключ '5' в массиве сохраняется как целое число 5.«да»
Пояснение: В PHP ключи массивов могут быть строками, которые при необходимости автоматически преобразуются в целые числа, если строка представляет собой число.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В PHP ключи массивов могут быть строками, которые при необходимости автоматически преобразуются в целые числа, если строка представляет собой число." ⏎ } ⏎ ```
верноКаноничные десятичные строковые ключи приводятся к int.
T04-L3
0.61 c
МассивыФункция in_array() по умолчанию использует строгое сравнение (===).«нет»
Пояснение: Функция in_array() по умолчанию использует нестрогое сравнение (==).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Функция in_array() по умолчанию использует нестрогое сравнение (==)." ⏎ } ⏎ ```
верноПо умолчанию сравнение нестрогое; строгое — третий аргумент true.
T04-L4
0.71 c
Массивыarray_filter() без колбэка удаляет из массива все «пустые» (falsy) элементы.«да»
Пояснение: Функция array_filter() по умолчанию удаляет из массива все элементы, которые оцениваются как FALSE, если ей не передана функция обратного вызова.
Raw
```json ⏎ {"answer": "да", "пояснение": "Функция array_filter() по умолчанию удаляет из массива все элементы, которые оцениваются как FALSE, если ей не передана функция обратного вызова."} ⏎ ```
верноУбирает 0, "", null, false и пустые массивы.
T04-L5
0.6 c
МассивыФункция array_slice() по умолчанию сохраняет исходные числовые ключи массива.«нет»
Пояснение: По умолчанию функция array_slice() возвращает массив с новыми числовыми ключами, начинающимися с нуля.
Raw
```json ⏎ {"answer": "нет", "пояснение": "По умолчанию функция array_slice() возвращает массив с новыми числовыми ключами, начинающимися с нуля."} ⏎ ```
верноПо умолчанию ключи перенумеровываются; сохранение — preserve_keys = true.
T04-L6
0.72 c
МассивыЧто вернёт array_slice([10, 20, 30, 40], 1, 2)?«json»
Пояснение: ```json {"answer": [20, 30], "пояснение": "Функция array_slice возвращает срез массива, начиная с индекса 1 (второй элемент) и длиной 2."} ```
Raw
```json ⏎ {"answer": [20, 30], "пояснение": "Функция array_slice возвращает срез массива, начиная с индекса 1 (второй элемент) и длиной 2."} ⏎ ```
неверно
верный: «[20,30]»
парсинг: текст (фолбэк)
[20,30]; ключи перенумеровываются.
T04-L7
0.76 c
МассивыСколько элементов будет в count(['a' => 1] + ['a' => 9, 'b' => 2])?«2»
Пояснение: Оператор + для массивов объединяет их. Если ключи совпадают, значение из правого массива перезаписывает значение из левого.
Raw
```json ⏎ { ⏎   "answer": 2, ⏎   "пояснение": "Оператор + для массивов объединяет их. Если ключи совпадают, значение из правого массива перезаписывает значение из левого." ⏎ } ⏎ ```
верноОператор + : по ключу 'a' побеждает левый; итого 2.
T04-L8
0.62 c
МассивыSpread-оператор [...$a, ...$b] с PHP 8.1 поддерживает массивы со строковыми ключами.«нет»
Пояснение: Spread-оператор работает только с массивами, индексированными целыми числами.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Spread-оператор работает только с массивами, индексированными целыми числами." ⏎ } ⏎ ```
неверно
верный: «да»
В 8.0 — только числовые ключи; 8.1 снял ограничение.
T05-L1
0.76 c
Функции и замыканияИменованные аргументы нельзя комбинировать с распаковкой массива ...$args в одном вызове.«да»
Пояснение: Именованные аргументы определяют аргументы по имени, а распаковка массива передает элементы массива как отдельные аргументы, что несовместимо.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Именованные аргументы определяют аргументы по имени, а распаковка массива передает элементы массива как отдельные аргументы, что несовместимо." ⏎ } ⏎ ```
неверно
верный: «нет»
Можно: f(...$args, имя: значение). Нельзя только позиционный аргумент после распаковки.
T05-L2
0.72 c
Функции и замыканияАнонимная функция без use видит переменные внешней области видимости.«нет»
Пояснение: Анонимная функция без `use` не имеет доступа к переменным внешней области видимости, кроме глобальных и статических.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Анонимная функция без `use` не имеет доступа к переменным внешней области видимости, кроме глобальных и статических." ⏎ } ⏎ ```
верноБез use внешние переменные недоступны; авто-захват только у fn.
T05-L3
2.95 c
Функции и замыканияЧто вернёт func_num_args() внутри function f($a) { return func_num_args(); } при вызове f(1, 2, 3)?«2»
Пояснение: func_num_args() возвращает количество аргументов, переданных в функцию, исключая аргументы, передаваемые по значению по умолчанию. Внутри функции f($a) передается только один обязательный аргумент $a, поэтому func_num_args() вернет 1. Но вопрос спрашивает что вернет func_num_args() *внутри* функции f, то есть, сколько аргументов *фактически* передано функции f при её вызове f(1, 2, 3). Функция f определена с одним параметром ($a), но при вызове ей передается три аргумента (1, 2, 3). func_num_args() внутри f будет считать количество аргументов, которые были фактически переданы функции f при её вызове, а не количество параметров, которые она ожидает. Следовательно, func_num_args() вернет 3, а не 1 или 2.
Raw
```json ⏎ { ⏎   "answer": 2, ⏎   "пояснение": "func_num_args() возвращает количество аргументов, переданных в функцию, исключая аргументы, передаваемые по значению по умолчанию. Внутри функции f($a) передается только один обязательный аргумент $a, поэтому func_num_args() вернет 1. Но вопрос спрашивает что вернет func_num_args() *внутри* функции f, то есть, сколько аргументов *фактически* передано функции f при её вызове f(1, 2, 3). Функция f определена с одним параметром ($a), но при вызове ей передается три аргумента (1, 2, 3). func_num_args() внутри f будет считать количество аргументов, которые были фактически переданы функции f при её вызове, а не количество параметров, которые она ожидает. Следовательно, func_num_args() вернет 3, а не 1 или 2." ⏎ } ⏎ ```
неверно
верный: «3»
Считает переданные аргументы: 3.
T05-L4
0.69 c
Функции и замыканияТело стрелочной функции fn может состоять из нескольких выражений в фигурных скобках.«нет»
Пояснение: Тело стрелочной функции (arrow function) может содержать только одно выражение, которое неявно возвращается.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Тело стрелочной функции (arrow function) может содержать только одно выражение, которое неявно возвращается." ⏎ } ⏎ ```
верноfn — всегда одно выражение; блок операторов делает обычная анонимная функция.
T05-L5
0.82 c
Функции и замыканияСтрелочная функция fn захватывает внешние переменные по ссылке (лениво, при использовании).«да»
Пояснение: Стрелочные функции в PHP захватывают переменные из внешней области видимости по ссылке, а не по значению, что означает, что изменения в этих переменных будут видны внутри функции.
Raw
```json ⏎ {"answer": "да", "пояснение": "Стрелочные функции в PHP захватывают переменные из внешней области видимости по ссылке, а не по значению, что означает, что изменения в этих переменных будут видны внутри функции."} ⏎ ```
неверно
верный: «нет»
fn захватывает только по значению, автоматически; по ссылке — только &$var в use у обычной функции (fn так не умеет).
T05-L6
0.57 c
Функции и замыканияЗамыкание, объявленное как static function () {}, не захватывает $this.«да»
Пояснение: Статические методы не связаны с конкретным экземпляром класса, поэтому $this недоступен внутри них.
Raw
```json ⏎ {"answer": "да", "пояснение": "Статические методы не связаны с конкретным экземпляром класса, поэтому $this недоступен внутри них."} ⏎ ```
верноstatic-замыкание отвязано от объекта: $this внутри недоступен.
T05-L7
1.09 c
Функции и замыканияЧто выведет: $x = 5; $f = function () use ($x) { return $x; }; $x = 7; echo $f();«5»
Пояснение: Функция $f использует переменную $x из внешней области видимости по значению (use ($x)). Значение $x было 5, когда функция была определена, и изменение $x после этого не повлияет на значение, сохраненное внутри замыкания.
Raw
```json ⏎ { ⏎   "answer": 5, ⏎   "пояснение": "Функция $f использует переменную $x из внешней области видимости по значению (use ($x)). Значение $x было 5, когда функция была определена, и изменение $x после этого не повлияет на значение, сохраненное внутри замыкания." ⏎ } ⏎ ```
верноuse захватывает по значению в момент создания: 5.
T05-L8
0.9 c
Функции и замыканияВ «слабом» режиме типизации (без strict_types) передача строки "5" в параметр с типом int допустима.«да»
Пояснение: В PHP без включенного strict_types, типы параметров функций не проверяются строго, и строка "5" будет автоматически преобразована в число 5 при передаче параметру типа int.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В PHP без включенного strict_types, типы параметров функций не проверяются строго, и строка \"5\" будет автоматически преобразована в число 5 при передаче параметру типа int." ⏎ } ⏎ ```
верноCoercive typing приводит "5" к 5; strict_types=1 требует точного типа.
T06-L1
0.56 c
ООП: классы и наследованиеPHP поддерживает promotion свойств в конструкторе: public function __construct(private int $x) {}.«да»
Пояснение: PHP поддерживает promotion свойств, позволяя объявлять и инициализировать свойства непосредственно в конструкторе.
Raw
```json ⏎ {"answer": "да", "пояснение": "PHP поддерживает promotion свойств, позволяя объявлять и инициализировать свойства непосредственно в конструкторе."} ⏎ ```
верноС PHP 8.0 параметр с модификатором создаёт свойство и присваивание.
T06-L2
0.69 c
ООП: классы и наследованиеКакое ключевое слово запрещает переопределять метод в подклассах?«final»
Пояснение: Ключевое слово `final` перед объявлением метода запрещает его переопределение в дочерних классах.
Raw
```json ⏎ { ⏎   "answer": "final", ⏎   "пояснение": "Ключевое слово `final` перед объявлением метода запрещает его переопределение в дочерних классах." ⏎ } ⏎ ```
верноfinal.
T06-L3
0.62 c
ООП: классы и наследованиеМетод, объявленный как final, нельзя переопределить в подклассе.«да»
Пояснение: Ключевое слово 'final' запрещает переопределение метода в производных классах.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Ключевое слово 'final' запрещает переопределение метода в производных классах." ⏎ } ⏎ ```
верноfinal запрещает переопределение метода и наследование класса.
T06-L4
0.59 c
ООП: классы и наследованиеСвойства родителя с видимостью private доступны в подклассе.«нет»
Пояснение: Свойства с видимостью private доступны только внутри класса, в котором они объявлены.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Свойства с видимостью private доступны только внутри класса, в котором они объявлены." ⏎ } ⏎ ```
верноВ подклассе видны protected и public; private — только внутри своего класса.
T06-L5
0.59 c
ООП: классы и наследованиеЧто вернёт get_class(new class {})? Ответь частью имени до нулевого байта (без пути к файлу).«anonymous»
Пояснение: Анонимный класс создаёт объект, имя класса которого по умолчанию 'anonymous'.
Raw
```json ⏎ { ⏎   "answer": "anonymous", ⏎   "пояснение": "Анонимный класс создаёт объект, имя класса которого по умолчанию 'anonymous'." ⏎ } ⏎ ```
неверно
верный: «class@anonymous»
get_class анонимного класса печатает class@anonymous\0<файл>:<строка>$n; короткая форма — часть до NUL-байта. Проверено php -r (hex).
T06-L6
0.65 c
ООП: классы и наследованиеprivate-метод родителя не входит в контракт наследования: потомок может объявить метод с тем же именем с любой видимостью.«да»
Пояснение: Private методы родительского класса недоступны для наследования, поэтому потомок может переопределить их с любой видимостью.
Raw
```json ⏎ {"answer": "да", "пояснение": "Private методы родительского класса недоступны для наследования, поэтому потомок может переопределить их с любой видимостью."} ⏎ ```
верноprivate-члены не наследуются — правила совместимости подписей не действуют.
T06-L7
0.7 c
ООП: классы и наследованиеМагический метод __get() вызывается только для несуществующих свойств.«нет»
Пояснение: Магический метод __get() вызывается при попытке доступа к несуществующему или недоступному свойству объекта.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Магический метод __get() вызывается при попытке доступа к несуществующему или недоступному свойству объекта." ⏎ } ⏎ ```
верно__get срабатывает и для существующих, но недоступных (private/protected извне).
T06-L8
0.62 c
ООП: классы и наследованиеЧто бросит повторное присваивание readonly-свойства — Exception или Error?«exception»
Пояснение: Попытка изменить readonly-свойство после инициализации выбрасывает исключение TypeError.
Raw
```json ⏎ { ⏎   "answer": "Exception", ⏎   "пояснение": "Попытка изменить readonly-свойство после инициализации выбрасывает исключение TypeError." ⏎ } ⏎ ```
неверно
верный: «error»
Error (readonly с 8.1); оговорка: в __clone() переинициализация допустима (8.3+).
T07-L1
0.62 c
Интерфейсы, трейты, enumИнтерфейс может объявлять константы.«нет»
Пояснение: Интерфейсы в PHP определяют структуру, которую должны реализовать классы, но не могут содержать константы.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Интерфейсы в PHP определяют структуру, которую должны реализовать классы, но не могут содержать константы."} ⏎ ```
неверно
верный: «да»
Константы интерфейса наследуются реализациями.
T07-L2
0.71 c
Интерфейсы, трейты, enumКакой оператор проверяет, что объект реализует класс или интерфейс?«instanceof»
Пояснение: Оператор `instanceof` используется для проверки, является ли объект экземпляром определенного класса или реализует определенный интерфейс.
Raw
```json ⏎ { ⏎   "answer": "instanceof", ⏎   "пояснение": "Оператор `instanceof` используется для проверки, является ли объект экземпляром определенного класса или реализует определенный интерфейс." ⏎ } ⏎ ```
верноinstanceof.
T07-L3
0.56 c
Интерфейсы, трейты, enumИнтерфейс может объявлять статические методы.«нет»
Пояснение: Статические методы не могут быть объявлены в интерфейсах PHP, начиная с версии 5.0.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Статические методы не могут быть объявлены в интерфейсах PHP, начиная с версии 5.0."} ⏎ ```
неверно
верный: «да»
Реализация обязана дать статический метод с той же сигнатурой.
T07-L4
0.6 c
Интерфейсы, трейты, enumОператор instanceof проверяет только наследование классов: интерфейсы он не учитывает.«нет»
Пояснение: Оператор instanceof проверяет, является ли объект экземпляром заданного класса или реализует ли он заданный интерфейс.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Оператор instanceof проверяет, является ли объект экземпляром заданного класса или реализует ли он заданный интерфейс."} ⏎ ```
верноinstanceof возвращает true и для интерфейсов объекта.
T07-L5
0.59 c
Интерфейсы, трейты, enumМетод интерфейса может иметь реализацию по умолчанию, как метод трейта.«да»
Пояснение: Начиная с PHP 5.4, интерфейсы могут содержать методы с реализацией по умолчанию.
Raw
```json ⏎ {"answer": "да", "пояснение": "Начиная с PHP 5.4, интерфейсы могут содержать методы с реализацией по умолчанию."} ⏎ ```
неверно
верный: «нет»
Методы интерфейса — только сигнатуры; тело даёт реализующий класс.
T07-L6
0.65 c
Интерфейсы, трейты, enumАбстрактный метод в абстрактном классе может иметь видимость protected.«нет»
Пояснение: Абстрактные методы в PHP всегда должны быть объявлены как public или static, но не protected.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Абстрактные методы в PHP всегда должны быть объявлены как public или static, но не protected." ⏎ } ⏎ ```
неверно
верный: «да»
В абстрактном классе — любая видимость; в интерфейсе — только public.
T07-L7
0.9 c
Интерфейсы, трейты, enumСколько элементов вернёт Foo::cases() для enum Foo { case A; case B; case C; }?«3»
Пояснение: Метод `cases()` возвращает массив со всеми вариантами перечисления, поэтому для enum Foo с тремя вариантами (A, B, C) он вернёт массив из 3 элементов.
Raw
```json ⏎ { ⏎   "answer": 3, ⏎   "пояснение": "Метод `cases()` возвращает массив со всеми вариантами перечисления, поэтому для enum Foo с тремя вариантами (A, B, C) он вернёт массив из 3 элементов." ⏎ } ⏎ ```
верноСтатический метод cases(): 3.
T07-L8
0.64 c
Интерфейсы, трейты, enumТрейт может объявлять константы.«да»
Пояснение: Трейты в PHP позволяют объявлять константы, используя ключевое слово `const`.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Трейты в PHP позволяют объявлять константы, используя ключевое слово `const`." ⏎ } ⏎ ```
верноС PHP 8.2 трейты могут объявлять константы (RFC constants_in_traits); до 8.2 — нет.
T08-L1
0.56 c
Исключения и ошибкиИнтерфейс Throwable — общий предок и для Exception, и для Error.«да»
Пояснение: Throwable является общим интерфейсом для всех классов, которые могут быть брошены, включая Exception и Error.
Raw
```json ⏎ {"answer": "да", "пояснение": "Throwable является общим интерфейсом для всех классов, которые могут быть брошены, включая Exception и Error."} ⏎ ```
верноИерархия с PHP 7: Throwable → Exception и Throwable → Error.
T08-L2
0.71 c
Исключения и ошибкиБлок catch (Exception $e) перехватит и TypeError, потому что TypeError в итоге наследуется от Exception.«да»
Пояснение: Класс TypeError наследуется от класса Exception, поэтому блок catch(Exception $e) перехватит исключения типа TypeError.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Класс TypeError наследуется от класса Exception, поэтому блок catch(Exception $e) перехватит исключения типа TypeError." ⏎ } ⏎ ```
неверно
верный: «нет»
TypeError наследуется от Error; catch (Exception) его не ловит.
T08-L3
0.62 c
Исключения и ошибкиОператор @ подавляет и исключения тоже.«да»
Пояснение: Оператор @ в PHP подавляет ошибки, включая исключения, при выполнении выражения.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Оператор @ в PHP подавляет ошибки, включая исключения, при выполнении выражения." ⏎ } ⏎ ```
неверно
верный: «нет»
@ глушит диагностику (warnings/notices), исключения не перехватывает.
T08-L4
0.66 c
Исключения и ошибкиКакой класс ошибки бросит intdiv(5, 0)?«zerodivisionerror»
Пояснение: Функция `intdiv()` вызывает ошибку `ZeroDivisionError`, если делитель равен нулю.
Raw
```json ⏎ { ⏎   "answer": "ZeroDivisionError", ⏎   "пояснение": "Функция `intdiv()` вызывает ошибку `ZeroDivisionError`, если делитель равен нулю." ⏎ } ⏎ ```
неверно
верный: «divisionbyzeroerror»
DivisionByZeroError (иерархия Error, не Exception); php-грейдер объективен.
T08-L5
0.67 c
Исключения и ошибкиБлок finally выполняется только если исключение было поймано блоком catch.«нет»
Пояснение: Блок finally выполняется всегда, независимо от того, было ли выброшено исключение и было ли оно поймано.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Блок finally выполняется всегда, независимо от того, было ли выброшено исключение и было ли оно поймано." ⏎ } ⏎ ```
верноНаоборот: finally выполняется всегда — даже когда исключение не поймано и уходит выше. Проверено php -r.
T08-L6
0.94 c
Исключения и ошибкиИсключение, выброшенное внутри блока finally, никак не влияет на результат try-блока.«да»
Пояснение: Исключение, выброшенное в блоке finally, не влияет на то, было ли исключение выброшено в блоках try или catch, и не предотвращает выполнение кода, который должен завершиться в finally.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Исключение, выброшенное в блоке finally, не влияет на то, было ли исключение выброшено в блоках try или catch, и не предотвращает выполнение кода, который должен завершиться в finally." ⏎ } ⏎ ```
неверно
верный: «нет»
Исключение из finally перекрывает исходное и уходит вместо него.
T08-L7
0.71 c
Исключения и ошибкиЧто вернёт выражение: (bool) new Exception('x')?«да»
Пояснение: Приведение объекта Exception к булевому типу возвращает true, так как любой объект является "истинным" значением в булевом контексте.
Raw
```json ⏎ {"answer": "да", "пояснение": "Приведение объекта Exception к булевому типу возвращает true, так как любой объект является \"истинным\" значением в булевом контексте."} ⏎ ```
верноЛюбой объект при приведении к bool — true. Формы ответа: true или да.
T08-L8
0.68 c
Исключения и ошибкиФункции, зарегистрированные через register_shutdown_function(), выполняются при вызове exit.«да»
Пояснение: Функции, зарегистрированные с помощью register_shutdown_function(), вызываются при нормальном завершении работы скрипта, включая вызов exit().
Raw
```json ⏎ {"answer": "да", "пояснение": "Функции, зарегистрированные с помощью register_shutdown_function(), вызываются при нормальном завершении работы скрипта, включая вызов exit()."} ⏎ ```
верноexit завершает скрипт, но shutdown-функции отрабатывают.
T09-L1
0.84 c
Пространства имён и автозагрузкаДиректива use App\Service\Mailer; сама по себе подключает файл с классом.«нет»
Пояснение: Директива `use` импортирует класс, пространство имен или константу, делая их доступными в текущем файле, но не подключает файл.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Директива `use` импортирует класс, пространство имен или константу, делая их доступными в текущем файле, но не подключает файл." ⏎ } ⏎ ```
верноuse — псевдоним на этапе компиляции; файл грузит автозагрузчик при первом обращении.
T09-L2
0.66 c
Пространства имён и автозагрузкаЧто пишут после use, чтобы импортировать функцию (а не класс): слово function или const?«function»
Пояснение: Для импорта функции из пространства имен используется ключевое слово `use` с указанием `function`.
Raw
```json ⏎ { ⏎   "answer": "function", ⏎   "пояснение": "Для импорта функции из пространства имен используется ключевое слово `use` с указанием `function`." ⏎ } ⏎ ```
верноuse function ...; (и use const для констант).
T09-L3
0.94 c
Пространства имён и автозагрузкаВ какой файл (путь от src/) PSR-4 «App\ → src/» положит класс App\Controller\Api\UserController?«src/controller/api/usercontroller.php»
Пояснение: PSR-4 определяет, что пространство имен App\Controller\Api соответствует директории src/Controller/Api, а класс UserController.php будет расположен в этой директории.
Raw
```json ⏎ { ⏎   "answer": "src/Controller/Api/UserController.php", ⏎   "пояснение": "PSR-4 определяет, что пространство имен App\\Controller\\Api соответствует директории src/Controller/Api, а класс UserController.php будет расположен в этой директории." ⏎ } ⏎ ```
верноОстаток имени после префикса, \ → /.
T09-L4
0.69 c
Пространства имён и автозагрузкаПодключение vendor/autoload.php регистрирует обработчики через spl_autoload_register().«да»
Пояснение: Composer использует autoload.php, который вызывает spl_autoload_register() для регистрации обработчиков автозагрузки.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Composer использует autoload.php, который вызывает spl_autoload_register() для регистрации обработчиков автозагрузки." ⏎ } ⏎ ```
верноComposer ставит автозагрузчик именно на spl_autoload_register.
T09-L5
0.56 c
Пространства имён и автозагрузкаМагическая константа __NAMESPACE__ содержит имя текущего пространства имён.«да»
Пояснение: __NAMESPACE__ - это предопределенная константа в PHP, которая содержит имя текущего пространства имен.
Raw
```json ⏎ {"answer": "да", "пояснение": "__NAMESPACE__ - это предопределенная константа в PHP, которая содержит имя текущего пространства имен."} ⏎ ```
верноВ корневом пространстве — пустая строка.
T09-L6
0.84 c
Пространства имён и автозагрузкаОтносительное имя класса (без ведущего \) в new резолвится от глобального корня.«нет»
Пояснение: Относительное имя класса в `new` резолвится относительно текущего пространства имен (namespace) или глобального пространства имен, если текущее не определено, а не от глобального корня.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Относительное имя класса в `new` резолвится относительно текущего пространства имен (namespace) или глобального пространства имен, если текущее не определено, а не от глобального корня."} ⏎ ```
верноРезолвится относительно текущего namespace (с учётом импортов).
T09-L7
0.81 c
Пространства имён и автозагрузкаПри маппинге PSR-4 «App\ → src/» класс App\Model\User лежит в файле src/Model/User.php.«да»
Пояснение: PSR-4 автозагрузчик преобразует пространство имен в структуру каталогов, заменяя `\` на `/` и добавляя `.php`.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "PSR-4 автозагрузчик преобразует пространство имен в структуру каталогов, заменяя `\` на `/` и добавляя `.php`." ⏎ } ⏎ ```
верноОстаток имени после префикса переносится в путь как есть.
T09-L8
0.7 c
Пространства имён и автозагрузкаДирективу use можно писать внутри тела функции — импорт будет действовать для этой функции.«нет»
Пояснение: Директива `use` предназначена для импорта пространств имен в текущий файл, а не внутри функции.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Директива `use` предназначена для импорта пространств имен в текущий файл, а не внутри функции." ⏎ } ⏎ ```
верноuse внутри тела функции — parse error; импорты файловые и компиляционные.
T10-L1
0.85 c
Ссылки и область видимостиМассивы при присваивании копируются, а не передаются по ссылке.«нет»
Пояснение: Массивы в PHP передаются по ссылке, если явно не указано копирование (например, с помощью оператора `clone` или при создании нового массива из частей старого).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Массивы в PHP передаются по ссылке, если явно не указано копирование (например, с помощью оператора `clone` или при создании нового массива из частей старого)." ⏎ } ⏎ ```
неверно
верный: «да»
Присваивание массива — копия (в движке — copy-on-write).
T10-L2
0.78 c
Ссылки и область видимостиЧто выведет: $a = [1, 2]; $b = $a; $b[] = 3; echo count($a);«3»
Пояснение: Переменные $a и $b ссылаются на один и тот же массив, поэтому добавление элемента в $b изменяет и $a.
Raw
```json ⏎ { ⏎   "answer": 3, ⏎   "пояснение": "Переменные $a и $b ссылаются на один и тот же массив, поэтому добавление элемента в $b изменяет и $a." ⏎ } ⏎ ```
неверно
верный: «2»
Присваивание — копия: в $a по-прежнему 2 элемента.
T10-L3
0.87 c
Ссылки и область видимостиВнутри функции пользовательские переменные глобальной области недоступны без global, $GLOBALS или передачи параметром.«да»
Пояснение: В PHP переменные, объявленные вне функции, не видны внутри нее по умолчанию, для доступа к ним требуется использовать ключевое слово `global`, массив `$GLOBALS` или передачу переменной как аргумента функции.
Raw
```json ⏎ {"answer": "да", "пояснение": "В PHP переменные, объявленные вне функции, не видны внутри нее по умолчанию, для доступа к ним требуется использовать ключевое слово `global`, массив `$GLOBALS` или передачу переменной как аргумента функции."} ⏎ ```
верноОбласть видимости функций изолирована; исключение — суперглобалы ($_GET и др.).
T10-L4
0.93 c
Ссылки и область видимостиunset($GLOBALS['x']) внутри функции удаляет глобальную переменную только для этой функции.«нет»
Пояснение: unset($GLOBALS['x']) удаляет глобальную переменную $x из области видимости $GLOBALS, делая ее недоступной для всех частей скрипта, включая функцию, в которой была выполнена команда unset.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "unset($GLOBALS['x']) удаляет глобальную переменную $x из области видимости $GLOBALS, делая ее недоступной для всех частей скрипта, включая функцию, в которой была выполнена команда unset." ⏎ } ⏎ ```
верно$GLOBALS — прямое окно в глобальную область: unset удалит её по-настоящему.
T10-L5
0.79 c
Ссылки и область видимостиЧто выведет: function inc(&$x) { $x++; } $n = 5; inc($n); echo $n;«6»
Пояснение: Функция inc принимает переменную по ссылке, увеличивает её значение на 1, и это изменение отражается на исходной переменной $n.
Raw
```json ⏎ { ⏎   "answer": 6, ⏎   "пояснение": "Функция inc принимает переменную по ссылке, увеличивает её значение на 1, и это изменение отражается на исходной переменной $n." ⏎ } ⏎ ```
верноСсылка меняет оригинал: 6.
T10-L6
0.7 c
Ссылки и область видимостиForeach по массиву (по значению) работает с «живым» массивом: изменения массива внутри цикла видны в этом же проходе.«нет»
Пояснение: Foreach по значению (value) создает копию каждого элемента, поэтому изменения оригинального массива внутри цикла не видны.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Foreach по значению (value) создает копию каждого элемента, поэтому изменения оригинального массива внутри цикла не видны." ⏎ } ⏎ ```
верноПо значению foreach итерирует копию-снимок.
T10-L7
0.67 c
Ссылки и область видимостиСтатическое свойство класса у каждого экземпляра своё: изменения в одном объекте не видны в других.«нет»
Пояснение: Статические свойства принадлежат классу, а не его экземплярам, поэтому все экземпляры разделяют одно и то же статическое свойство.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Статические свойства принадлежат классу, а не его экземплярам, поэтому все экземпляры разделяют одно и то же статическое свойство."} ⏎ ```
верноНаоборот: статическое свойство общее для всех экземпляров класса. Проверено php -r.
T10-L8
0.74 c
Ссылки и область видимостиМассив может иметь булев ключ true, и он сохранится как bool.«да»
Пояснение: Вопрос сформулирован неполностью, но предполагается, что я должен ответить на любой вопрос, заданный в формате теста по PHP.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Вопрос сформулирован неполностью, но предполагается, что я должен ответить на любой вопрос, заданный в формате теста по PHP." ⏎ } ⏎ ```
неверно
верный: «нет»
Булев ключ приводится к int: true → 1, false → 0.
T11-L1
0.48 c
Генераторы, итераторы, SPLВнутри генератора можно использовать return со значением, и оно попадёт в $gen->getReturn().«да»
Пояснение: Этот запрос является инструкцией для начала взаимодействия.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Этот запрос является инструкцией для начала взаимодействия." ⏎ } ⏎ ```
верноreturn-значение генератора доступно через getReturn() после прохода.
T11-L2
0.44 c
Генераторы, итераторы, SPLПолностью пройденный генератор можно «перемотать» через rewind() и пройти снова.«да»
Пояснение: Я готов отвечать на вопросы по PHP в формате JSON.
Raw
```json ⏎ {"answer": "да", "пояснение": "Я готов отвечать на вопросы по PHP в формате JSON."} ⏎ ```
неверно
верный: «нет»
Генератор одноразовый: rewind после начала итерации бросает Exception.
T11-L3
0.6 c
Генераторы, итераторы, SPLКонструкция yield from делегирует проход другому генератору или итерируемому объекту.«да»
Пояснение: Конструкция yield from позволяет делегировать итерацию другому генератору или итерируемому объекту.
Raw
```json ⏎ {"answer": "да", "пояснение": "Конструкция yield from позволяет делегировать итерацию другому генератору или итерируемому объекту."} ⏎ ```
верноyield from проксирует значения, ключи и return-значение внутреннего генератора.
T11-L4
0.7 c
Генераторы, итераторы, SPLЧто вернёт get_class(g()) для function g() { yield 1; }?«generator»
Пояснение: Функция, использующая `yield`, является генератором, и `get_class()` вернёт строку 'Generator'.
Raw
```json ⏎ { ⏎   "answer": "Generator", ⏎   "пояснение": "Функция, использующая `yield`, является генератором, и `get_class()` вернёт строку 'Generator'." ⏎ } ⏎ ```
верноФункция с yield возвращает Generator.
T11-L5
0.94 c
Генераторы, итераторы, SPLСколько элементов вернёт count(iterator_to_array((function () { yield from [1, 2, 3]; })()));«3»
Пояснение: Функция возвращает генератор, который выдает элементы [1, 2, 3]. iterator_to_array преобразует генератор в массив, а count считает количество элементов в массиве.
Raw
```json ⏎ { ⏎   "answer": 3, ⏎   "пояснение": "Функция возвращает генератор, который выдает элементы [1, 2, 3]. iterator_to_array преобразует генератор в массив, а count считает количество элементов в массиве." ⏎ } ⏎ ```
верноyield from делегирует все 3 элемента.
T11-L6
0.77 c
Генераторы, итераторы, SPLКласс SplStack реализует очередь FIFO.«нет»
Пояснение: Класс SplStack реализует стек LIFO (Last-In, First-Out), а не очередь FIFO (First-In, First-Out).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Класс SplStack реализует стек LIFO (Last-In, First-Out), а не очередь FIFO (First-In, First-Out)." ⏎ } ⏎ ```
верноSplStack — стек LIFO; очередь FIFO — SplQueue.
T11-L7
0.71 c
Генераторы, итераторы, SPLArrayIterator позволяет обернуть массив и обходить его через интерфейс Iterator.«да»
Пояснение: ArrayIterator - это класс PHP, реализующий интерфейс Iterator, который позволяет использовать функциональность итераторов для обхода элементов массива.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "ArrayIterator - это класс PHP, реализующий интерфейс Iterator, который позволяет использовать функциональность итераторов для обхода элементов массива." ⏎ } ⏎ ```
верноОбъектная обёртка над массивом.
T11-L8
0.62 c
Генераторы, итераторы, SPLОбъект класса ArrayObject нельзя обойти через foreach.«нет»
Пояснение: Объект класса ArrayObject реализует интерфейс Iterator и может быть обойден через foreach.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Объект класса ArrayObject реализует интерфейс Iterator и может быть обойден через foreach." ⏎ } ⏎ ```
верноArrayObject реализует IteratorAggregate — foreach по нему работает.
T12-L1
0.68 c
Конфигурация и безопасностьpassword_hash() генерирует соль автоматически — передавать её отдельно не нужно.«да»
Пояснение: Функция password_hash() автоматически генерирует случайную соль, если она не указана в качестве аргумента.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Функция password_hash() автоматически генерирует случайную соль, если она не указана в качестве аргумента." ⏎ } ⏎ ```
верноСоль встраивается в строку результата; параметр salt устарел.
T12-L2
0.59 c
Конфигурация и безопасностьАлгоритм PASSWORD_DEFAULT в PHP 8 — это md5 с автоматически добавленной солью.«нет»
Пояснение: Алгоритм PASSWORD_DEFAULT в PHP 8 использует bcrypt, а не md5.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Алгоритм PASSWORD_DEFAULT в PHP 8 использует bcrypt, а не md5." ⏎ } ⏎ ```
верноPASSWORD_DEFAULT — bcrypt; md5 для паролей непригоден (перебирается массово).
T12-L3
0.72 c
Конфигурация и безопасностьЧто вернёт password_verify('secret', password_hash('secret', PASSWORD_DEFAULT))?«да»
Пояснение: Функция password_verify сравнивает хэш пароля с исходным паролем и возвращает true, если они совпадают.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Функция password_verify сравнивает хэш пароля с исходным паролем и возвращает true, если они совпадают." ⏎ } ⏎ ```
верноСоль и хеш в одной строке: true (форма ответа: true или да).
T12-L4
0.79 c
Конфигурация и безопасностьФункция strip_tags() защищает от SQL-инъекций.«нет»
Пояснение: Функция strip_tags() удаляет HTML-теги, но не экранирует специальные символы, необходимые для защиты от SQL-инъекций.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Функция strip_tags() удаляет HTML-теги, но не экранирует специальные символы, необходимые для защиты от SQL-инъекций." ⏎ } ⏎ ```
верноstrip_tags режет HTML-теги (помощник против XSS), к параметризации SQL отношения не имеет.
T12-L5
0.77 c
Конфигурация и безопасностьФункция session_regenerate_id() используется для защиты от фиксации сессии при входе пользователя.«да»
Пояснение: Функция session_regenerate_id() создает новый идентификатор сессии, что помогает предотвратить атаки, связанные с фиксацией сессии.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Функция session_regenerate_id() создает новый идентификатор сессии, что помогает предотвратить атаки, связанные с фиксацией сессии." ⏎ } ⏎ ```
верноНовый ID сессии после логина — стандартная защита от session fixation.
T12-L6
0.73 c
Конфигурация и безопасностьКакая встроенная функция возвращает имя SAPI (например, cli)?«php_sapi_name()»
Пояснение: Встроенная функция php_sapi_name() возвращает имя используемого Server API (SAPI).
Raw
```json ⏎ { ⏎   "answer": "php_sapi_name()", ⏎   "пояснение": "Встроенная функция php_sapi_name() возвращает имя используемого Server API (SAPI)." ⏎ } ⏎ ```
верноphp_sapi_name().
T12-L7
0.79 c
Конфигурация и безопасностьsession_destroy() удаляет данные сессии на сервере, но не cookie в браузере пользователя.«да»
Пояснение: Функция session_destroy() удаляет данные сессии с сервера, но не удаляет cookie сессии, хранящуюся в браузере пользователя.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Функция session_destroy() удаляет данные сессии с сервера, но не удаляет cookie сессии, хранящуюся в браузере пользователя." ⏎ } ⏎ ```
верноУдаление cookie — отдельный шаг через setcookie с истёкшим сроком.
T12-L8
0.58 c
Конфигурация и безопасностьБез вызова session_start() массив $_SESSION автоматически загружается данными сессии.«нет»
Пояснение: Массив $_SESSION загружается только после вызова функции session_start().
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Массив $_SESSION загружается только после вызова функции session_start()." ⏎ } ⏎ ```
верноБез session_start() данные сессии в массив не загружаются ($_SESSION можно заполнить вручную, но привязки к сессии нет).
VC-L1
0.59 c
PHP 8.4–8.5В какой версии PHP появилась функция array_find()?«php 7.2»
Пояснение: Функция array_find() была добавлена в PHP версии 7.2.
Raw
```json ⏎ {"answer": "PHP 7.2", "пояснение": "Функция array_find() была добавлена в PHP версии 7.2."} ⏎ ```
неверно
верный: «8.4»
PHP 8.4 (RFC array_find).
VC-L2
0.67 c
PHP 8.4–8.5Property hooks (get/set прямо в объявлении свойства) вошли в PHP 8.4.«нет»
Пояснение: Property hooks (геттеры и сеттеры прямо в объявлении свойства) вошли в PHP 8.0.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Property hooks (геттеры и сеттеры прямо в объявлении свойства) вошли в PHP 8.0." ⏎ } ⏎ ```
неверно
верный: «да»
Property hooks — PHP 8.4 (ноябрь 2024).
VC-L3
0.78 c
PHP 8.4–8.5Асимметричная видимость (public private(set) string $name) появилась в PHP 8.4.«нет»
Пояснение: Асимметричная видимость (public, private, protected, readonly) была введена в PHP 8.2, а не в 8.4.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Асимметричная видимость (public, private, protected, readonly) была введена в PHP 8.2, а не в 8.4." ⏎ } ⏎ ```
неверно
верный: «да»
Asymmetric visibility v2 — PHP 8.4.
VC-L4
0.62 c
PHP 8.4–8.5В какой версии PHP впервые появился атрибут #[\NoDiscard]? Ответь номером версии.«8.1»
Пояснение: Атрибут #[NoDiscard] был представлен в PHP 8.1.
Raw
```json ⏎ { ⏎   "answer": 8.1, ⏎   "пояснение": "Атрибут #[NoDiscard] был представлен в PHP 8.1." ⏎ } ⏎ ```
неверно
верный: «8.5»
#[\NoDiscard] — PHP 8.5 (marking return values as important).
VC-L5
0.61 c
PHP 8.4–8.5В какой версии PHP впервые появился оператор конвейера |> (pipe)? Ответь номером версии.«8.0»
Пояснение: Оператор конвейера (pipe operator) `|>` был представлен в PHP версии 8.0.
Raw
```json ⏎ {"answer": "8.0", "пояснение": "Оператор конвейера (pipe operator) `|>` был представлен в PHP версии 8.0."} ⏎ ```
неверно
верный: «8.5»
Pipe operator — PHP 8.5 (2025).
VC-L6
0.73 c
PHP 8.4–8.5В какой версии PHP появился clone-with — синтаксис clone($obj, ['x' => 1])? Ответь номером версии.«7.4»
Пояснение: Синтаксис clone($obj, ['x' => 1]) был представлен в PHP 7.4.
Raw
```json ⏎ { ⏎   "answer": "7.4", ⏎   "пояснение": "Синтаксис clone($obj, ['x' => 1]) был представлен в PHP 7.4." ⏎ } ⏎ ```
неверно
верный: «8.5»
Clone with v2 — PHP 8.5.
VC-L7
0.68 c
PHP 8.4–8.5В какой версии PHP появились функции array_first() и array_last()?«8.1»
Пояснение: Функции array_first() и array_last() были добавлены в PHP 8.1.
Raw
```json ⏎ { ⏎   "answer": "8.1", ⏎   "пояснение": "Функции array_first() и array_last() были добавлены в PHP 8.1." ⏎ } ⏎ ```
неверно
верный: «8.5»
PHP 8.5.
VC-L8
0.6 c
PHP 8.4–8.5Для какой версии PHP был принят RFC Partial Function Application v2 (по состоянию на 07.11.2026)? Ответь номером версии.«8.2»
Пояснение: RFC Partial Function Application v2 был принят для PHP 8.2.
Raw
```json ⏎ { ⏎   "answer": 8.2, ⏎   "пояснение": "RFC Partial Function Application v2 был принят для PHP 8.2." ⏎ } ⏎ ```
неверно
верный: «8.6»
PFA v2 принят 05.12.2025 (33-0-0), реализован в PHP 8.6.
VF-L1
0.61 c
PHP: 8.6+ и будущееДля какой версии PHP реализован RFC clamp_v2 (функция clamp()) по состоянию на 07.11.2026? Ответь номером версии.«8.1»
Пояснение: Функция clamp() была добавлена в PHP 8.1.
Raw
```json ⏎ { ⏎   "answer": 8.1, ⏎   "пояснение": "Функция clamp() была добавлена в PHP 8.1." ⏎ } ⏎ ```
неверно
верный: «8.6»
По данным владельца (wiki.php.net/rfc): clamp_v2 — 8.6; clamp() в 8.5.11 отсутствует (косвенное подтверждение). Дата-якорь делает клетку монотонной.
VF-L2
0.76 c
PHP: 8.6+ и будущееRFC Context Managers v2 уже принят в PHP (на 07.11.2026).«нет»
Пояснение: RFC Context Managers v2 был принят в PHP 8.3, выпущенном в ноябре 2023 года, а не в 2026 году.
Raw
```json ⏎ {"answer": "нет", "пояснение": "RFC Context Managers v2 был принят в PHP 8.3, выпущенном в ноябре 2023 года, а не в 2026 году."} ⏎ ```
верноНа 06.11.2026 — в обсуждении (создан 2026-10-23); не принят.
VF-L3
0.69 c
PHP: 8.6+ и будущееRFC Bound-Erased Generic Types (generics) был отклонён в 2026 году.«нет»
Пояснение: RFC Bound-Erased Generics был принят в PHP 8.2 в ноябре 2023 года.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "RFC Bound-Erased Generics был принят в PHP 8.2 в ноябре 2023 года." ⏎ } ⏎ ```
неверно
верный: «да»
Голосование завершилось 2026-06-28: отклонён (wiki.php.net/rfc).
VF-L4
0.93 c
PHP: 8.6+ и будущееНа 07.11.2026 RFC о включении многопоточности (ZTS) по умолчанию уже принят в PHP.«нет»
Пояснение: RFC о включении многопоточности (ZTS) по умолчанию был принят в PHP 8.3, выпущенном в ноябре 2023 года, а не в 2026.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "RFC о включении многопоточности (ZTS) по умолчанию был принят в PHP 8.3, выпущенном в ноябре 2023 года, а не в 2026." ⏎ } ⏎ ```
верноТакого принятого RFC нет на дату якоря; якорь делает клетку монотонной — при принятии RFC позже клетка не перевернётся.
VF-L5
0.67 c
PHP: 8.6+ и будущееВ PHP 8.5 дженериков (параметризованных типов) по-прежнему нет.«да»
Пояснение: Дженерики (параметризованные типы) были добавлены в PHP 8.0, а не в 8.5.
Raw
```json ⏎ {"answer": "да", "пояснение": "Дженерики (параметризованные типы) были добавлены в PHP 8.0, а не в 8.5."} ⏎ ```
верноGenerics в PHP отсутствуют; отрицательный контроль (не путать с C#/Java).
VF-L6
0.88 c
PHP: 8.6+ и будущееНа 07.11.2026 последняя стабильная версия PHP — 8.5, а PHP 8.6 ещё не выпущена (GA — 19.11.2026).«нет»
Пояснение: Согласно предоставленной информации, PHP 8.6 была выпущена 19.11.2026, то есть позже 07.11.2026.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Согласно предоставленной информации, PHP 8.6 была выпущена 19.11.2026, то есть позже 07.11.2026." ⏎ } ⏎ ```
неверно
верный: «да»
8.5 — релиз осени 2025; 8.6 GA 19.11.2026 (wiki.php.net/todo/php86). Дата снимка — 06.11.2026.
VF-L7
0.64 c
PHP: 8.6+ и будущееВетка PHP 6 так и не вышла: после PHP 5.6 вышел сразу PHP 7.0.«да»
Пояснение: Версия PHP 6 была пропущена, и после PHP 5.6 последовала версия PHP 7.0.
Raw
```json ⏎ {"answer": "да", "пояснение": "Версия PHP 6 была пропущена, и после PHP 5.6 последовала версия PHP 7.0."} ⏎ ```
верноИсторический факт: ветка 6 не была релизнута.
VF-L8
0.69 c
PHP: 8.6+ и будущееRFC о добавлении атрибута #[\Deprecated] в ядро был принят.«да»
Пояснение: RFC 8379, который предложил добавить атрибут #[Deprecated] в ядро PHP, был принят.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "RFC 8379, который предложил добавить атрибут #[Deprecated] в ядро PHP, был принят." ⏎ } ⏎ ```
верно#[\Deprecated] — принят, реализован в PHP 8.4.
T25-L1
0.53 c
Чистая архитектураПравило зависимостей в чистой и луковичной архитектурах: внутренние слои не знают о внешних — зависимости направлены к центру.«да»
Пояснение: Это основное правило зависимостей в чистой и луковичной архитектурах.
Raw
```json ⏎ {"answer": "да", "пояснение": "Это основное правило зависимостей в чистой и луковичной архитектурах."} ⏎ ```
верноЧистая (Robert C. Martin), луковичная (Jeffrey Palermo) и гексагональная (ports & adapters) — варианты одной идеи: зависимости направлены внутрь, к домену. Слоями в проекте следит deptrac.
T25-L2
0.73 c
Чистая архитектураСущности домена не импортируют ни Doctrine, ни Symfony — только язык и, возможно, стандартную библиотеку.«— (нет ответа)»
Пояснение: Сущности домена в чистой архитектуре должны быть независимы от фреймворков, таких как Doctrine или Symfony.
Raw
```json ⏎ { ⏎   "answer": "верно", ⏎   "пояснение": "Сущности домена в чистой архитектуре должны быть независимы от фреймворков, таких как Doctrine или Symfony." ⏎ } ⏎ ```
не разобрано
верный: «да»
парсинг: нет
Изоляция домена от инфраструктуры; deptrac в проекте как раз следит за слоями.
T25-L3
0.75 c
Чистая архитектураКонтроллеры и Twig-шаблоны относятся к слою бизнес-логики, потому что именно они вызывают use cases.«нет»
Пояснение: Контроллеры и Twig-шаблоны относятся к слою представления, а use cases - к слою бизнес-логики.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Контроллеры и Twig-шаблоны относятся к слою представления, а use cases - к слою бизнес-логики." ⏎ } ⏎ ```
верноНаоборот: это интерфейсные адаптеры (внешний слой); они зависят от use cases, а не наоборот.
T25-L4
0.85 c
Чистая архитектураЧто находится в самом центре луковичной архитектуры?«бизнес-логика»
Пояснение: В центре луковичной архитектуры находится бизнес-логика, которая не зависит от внешних факторов, таких как базы данных или фреймворки.
Raw
```json ⏎ { ⏎   "answer": "Бизнес-логика", ⏎   "пояснение": "В центре луковичной архитектуры находится бизнес-логика, которая не зависит от внешних факторов, таких как базы данных или фреймворки." ⏎ } ⏎ ```
неверно
верный: «доменная модель»
Центральное кольцо — Domain Model: сущности и бизнес-правила без зависимостей; далее Domain Services → Application Services → Infrastructure/UI/Tests (Palermo).
T25-L5
0.74 c
Чистая архитектураНарушение границ слоёв можно поймать автоматикой: анализатор зависимостей между слоями (например, deptrac) падает на запрещённом вызове.«да»
Пояснение: Это утверждение верно, так как нарушение границ слоёв в архитектуре приложения может быть автоматически обнаружено с помощью инструментов анализа зависимостей.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Это утверждение верно, так как нарушение границ слоёв в архитектуре приложения может быть автоматически обнаружено с помощью инструментов анализа зависимостей." ⏎ } ⏎ ```
верноdepfile.yaml в проекте TasK: CI проверяет правила слоёв на каждом пайплайне.
T25-L6
0.8 c
Чистая архитектураUse case (interactor) может принимать HTTP-запрос или EntityManager как аргументы — так проще.«да»
Пояснение: Использование HTTP-запроса или EntityManager в качестве аргументов use case (interactor) - распространенная практика, обеспечивающая гибкость и тестируемость.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Использование HTTP-запроса или EntityManager в качестве аргументов use case (interactor) - распространенная практика, обеспечивающая гибкость и тестируемость." ⏎ } ⏎ ```
неверно
верный: «нет»
Use case принимает DTO и порты; привязка к HTTP/ORM протекает инфраструктуру во внутренние слои.
T25-L7
0.76 c
Чистая архитектураКак называется компонент, предоставляющий коллекцию агрегатов/сущностей, скрывая механизм хранения за интерфейсом?«репозиторий»
Пояснение: Репозиторий - это шаблон проектирования, который предоставляет интерфейс для доступа к коллекции объектов, скрывая логику их хранения.
Raw
```json ⏎ { ⏎   "answer": "Репозиторий", ⏎   "пояснение": "Репозиторий - это шаблон проектирования, который предоставляет интерфейс для доступа к коллекции объектов, скрывая логику их хранения." ⏎ } ⏎ ```
верноRepository pattern (DDD/Evans); в проекте — Doctrine-репозитории за портами.
T25-L8
0.68 c
Чистая архитектураЗамена PostgreSQL на другую БД в чистой архитектуре затрагивает только внешний слой — домен и use cases не меняются.«да»
Пояснение: В чистой архитектуре доменная логика и use cases независимы от инфраструктуры, такой как база данных.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В чистой архитектуре доменная логика и use cases независимы от инфраструктуры, такой как база данных." ⏎ } ⏎ ```
верноСледствие правила зависимостей: инфраструктура взаимозаменяема.
T26-L1
0.72 c
DDDАгрегат в DDD — это просто другое название таблицы базы данных.«нет»
Пояснение: Агрегат в DDD - это группа связанных объектов, которые рассматриваются как единое целое, а не просто таблица базы данных.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Агрегат в DDD - это группа связанных объектов, которые рассматриваются как единое целое, а не просто таблица базы данных." ⏎ } ⏎ ```
верноАгрегат — кластер объектов с границей согласованности (транзакционной вокруг корня); таблица — деталь хранения.
T26-L2
0.62 c
DDDValue Object неизменяем и сравнивается по значениям полей, а не по идентификатору.«да»
Пояснение: Value Object - это объект, который определяется исключительно своими значениями, а не своим идентификатором, и обычно является неизменяемым.
Raw
```json ⏎ {"answer": "да", "пояснение": "Value Object - это объект, который определяется исключительно своими значениями, а не своим идентификатором, и обычно является неизменяемым."} ⏎ ```
верноКлассика Evans: Money, Email; равенство структурное.
T26-L3
0.94 c
DDDКак называется единственная точка внешнего входа в агрегат, через которую проходят все изменения?«точка входа»
Пояснение: В контексте агрегатов (например, в архитектуре доменных служб или при разработке приложений) точка входа - это определенное место, через которое происходит доступ к функциональности агрегата.
Raw
```json ⏎ { ⏎   "answer": "точка входа", ⏎   "пояснение": "В контексте агрегатов (например, в архитектуре доменных служб или при разработке приложений) точка входа - это определенное место, через которое происходит доступ к функциональности агрегата." ⏎ } ⏎ ```
неверно
верный: «aggregate root»
Aggregate Root: внешние объекты ссылаются только на корень; он защищает инварианты агрегата.
T26-L4
0.73 c
DDDВ DDD репозиторий объявляется на агрегат (его корень), а не на каждую сущность.«да»
Пояснение: Репозиторий в DDD предназначен для работы с агрегатами, которые являются единицами транзакций и инкапсулируют бизнес-логику.
Raw
```json ⏎ {"answer": "да", "пояснение": "Репозиторий в DDD предназначен для работы с агрегатами, которые являются единицами транзакций и инкапсулируют бизнес-логику."} ⏎ ```
верноРепозиторий корня хранит границу согласованности агрегата; вложенные сущности доступны только через корень.
T26-L5
0.82 c
DDDUbiquitous language — единый язык модели, общий для разработчиков и предметных экспертов.«да»
Пояснение: Ubiquitous language - это общий язык, используемый всеми участниками проекта, включая разработчиков и экспертов предметной области, для описания концепций и терминов.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Ubiquitous language - это общий язык, используемый всеми участниками проекта, включая разработчиков и экспертов предметной области, для описания концепций и терминов." ⏎ } ⏎ ```
верноEvans: язык из требований переходит в имена классов и методов.
T26-L6
0.59 c
DDDКак называется граница, внутри которой модель и её язык едины, а снаружи те же понятия — другие модели?«границы языка»
Пояснение: Это определение границ языка (language boundary) в контексте моделирования.
Raw
```json ⏎ { ⏎   "answer": "границы языка", ⏎   "пояснение": "Это определение границ языка (language boundary) в контексте моделирования." ⏎ } ⏎ ```
неверно
верный: «bounded context»
Bounded Context; «Заказ» в биллинге и в доставке — разные модели.
T26-L7
0.67 c
DDDАнемичная модель (объекты только с геттерами/сеттерами, логика в сервисах) — рекомендуемый стиль DDD.«нет»
Пояснение: Анемичная модель противоречит принципам DDD, где сущности должны содержать бизнес-логику.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Анемичная модель противоречит принципам DDD, где сущности должны содержать бизнес-логику." ⏎ } ⏎ ```
верноНаоборот: Evans называет анемичность антипаттерном — поведение должно жить в доменных объектах.
T26-L8
1.03 c
DDDBounded context означает, что у каждого контекста своя модель: одно и то же понятие в разных контекстах — разные классы.«да»
Пояснение: Bounded Context (ограниченный контекст) в Domain-Driven Design (DDD) подразумевает, что каждая область (context) имеет свою собственную модель, и одно и то же понятие может иметь разное значение или структуру в разных контекстах.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Bounded Context (ограниченный контекст) в Domain-Driven Design (DDD) подразумевает, что каждая область (context) имеет свою собственную модель, и одно и то же понятие может иметь разное значение или структуру в разных контекстах." ⏎ } ⏎ ```
верноМодели контекстов независимы; между ними — явная интеграция (ACL, published language).
T13-L1
0.81 c
SymfonyСервисы в DI-контейнере Symfony по умолчанию создаются лениво — при первом обращении к ним.«да»
Пояснение: По умолчанию сервисы в DI-контейнере Symfony создаются лениво (lazy loading), то есть инициализируются только при первом запросе к ним.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "По умолчанию сервисы в DI-контейнере Symfony создаются лениво (lazy loading), то есть инициализируются только при первом запросе к ним." ⏎ } ⏎ ```
верноКонтейнер инстанцирует сервис при первом извлечении; eager-создания по умолчанию нет.
T13-L2
0.74 c
SymfonyКакая консольная команда Symfony выводит список всех зарегистрированных маршрутов?«bin/console router:debug»
Пояснение: Команда `bin/console router:debug` выводит список всех зарегистрированных маршрутов в приложении Symfony.
Raw
```json ⏎ { ⏎   "answer": "bin/console router:debug", ⏎   "пояснение": "Команда `bin/console router:debug` выводит список всех зарегистрированных маршрутов в приложении Symfony." ⏎ } ⏎ ```
неверно
верный: «debug:router»
bin/console debug:router (FrameworkBundle); в Symfony 3 команда называлась router:debug.
T13-L3
0.9 c
SymfonyAutowiring в Symfony требует вручную перечислять каждый сервис в конфигурации services.yaml.«нет»
Пояснение: Autowiring в Symfony автоматически определяет и конфигурирует сервисы на основе их зависимостей и аннотаций, избавляя от необходимости ручного перечисления каждого сервиса в services.yaml.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Autowiring в Symfony автоматически определяет и конфигурирует сервисы на основе их зависимостей и аннотаций, избавляя от необходимости ручного перечисления каждого сервиса в services.yaml." ⏎ } ⏎ ```
верноAutowire+autoconfigure регистрируют и связывают сервисы автоматически; ручное перечисление — исключение.
T13-L4
0.58 c
SymfonyTwig-шаблоны компилируются в PHP-классы и кэшируются между запросами.«да»
Пояснение: Twig компилирует шаблоны в PHP-код, который затем кэшируется для повышения производительности.
Raw
```json ⏎ {"answer": "да", "пояснение": "Twig компилирует шаблоны в PHP-код, который затем кэшируется для повышения производительности."} ⏎ ```
верноTwig компилирует шаблон один раз; кэш в var/cache/twig, в prod не пересобирается.
T13-L5
0.96 c
SymfonyКонтейнер DI в dev-окружении Symfony пересобирается только после изменения отслеживаемых файлов, а не при каждом запросе.«да»
Пояснение: В режиме разработки (dev) Symfony, контейнер DI кэшируется, но пересобирается только при изменении отслеживаемых файлов (например, PHP, YAML, XML конфигураций), чтобы ускорить загрузку.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В режиме разработки (dev) Symfony, контейнер DI кэшируется, но пересобирается только при изменении отслеживаемых файлов (например, PHP, YAML, XML конфигураций), чтобы ускорить загрузку." ⏎ } ⏎ ```
верноKernel проверяет freshness ресурсов (конфиги, классы); иначе переиспользуется кэш контейнера.
T13-L6
0.85 c
SymfonyКакая переменная окружения выбирает активное окружение Symfony (dev/prod)?«app_env»
Пояснение: Переменная окружения APP_ENV определяет активное окружение Symfony, значениями которого обычно являются 'dev' (разработка) или 'prod' (производство).
Raw
```json ⏎ { ⏎   "answer": "APP_ENV", ⏎   "пояснение": "Переменная окружения APP_ENV определяет активное окружение Symfony, значениями которого обычно являются 'dev' (разработка) или 'prod' (производство)." ⏎ } ⏎ ```
верноAPP_ENV в .env; APP_DEBUG — отдельный флаг отладки.
T13-L7
0.67 c
SymfonyМетод контроллера может быть private — маршрутизация Symfony работает с любыми методами класса.«да»
Пояснение: Маршрутизация Symfony работает с любыми публичными методами контроллера, включая private, если они помечены атрибутом [Route].
Raw
```json ⏎ {"answer": "да", "пояснение": "Маршрутизация Symfony работает с любыми публичными методами контроллера, включая private, если они помечены атрибутом [Route]."} ⏎ ```
неверно
верный: «нет»
Действие контроллера должно быть public; приватный метод по маршруту не вызывается.
T13-L8
0.62 c
SymfonyПодписчики событий (EventSubscriber) всегда получают события раньше слушателей (listeners), потому что интерфейс даёт им приоритет.«нет»
Пояснение: Интерфейс EventSubscriber не гарантирует приоритет перед слушателями; порядок обработки событий определяется конфигурацией и порядком регистрации.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Интерфейс EventSubscriber не гарантирует приоритет перед слушателями; порядок обработки событий определяется конфигурацией и порядком регистрации."} ⏎ ```
верноПорядок определяет priority, а не тип подписки; приоритеты задаются в getSubscribedEvents() так же, как у слушателей.
T22-L1
0.88 c
Symfony: Security и формыВ современном Symfony (6.0+) аутентификация строится на классах-authenticator (AuthenticatorInterface); прежняя система guard удалена.«да»
Пояснение: В Symfony 6.0 и более поздних версиях система аутентификации перешла на использование классов-аутентификаторов (AuthenticatorInterface), а система Guard была удалена.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В Symfony 6.0 и более поздних версиях система аутентификации перешла на использование классов-аутентификаторов (AuthenticatorInterface), а система Guard была удалена." ⏎ } ⏎ ```
верноGuard объявлен устаревшим в 5.3 и удалён в 6.0; в проекте symfony/security-bundle 8.1.
T22-L2
0.7 c
Symfony: Security и формыКакой атрибут Symfony проверяет роль/право прямо на методе контроллера (без него — 403)?«require_role»
Пояснение: Атрибут `require_role` в Symfony используется для проверки прав доступа непосредственно на методе контроллера.
Raw
```json ⏎ { ⏎   "answer": "require_role", ⏎   "пояснение": "Атрибут `require_role` в Symfony используется для проверки прав доступа непосредственно на методе контроллера." ⏎ } ⏎ ```
неверно
верный: «isgranted»
#[IsGranted('ROLE_ADMIN')]; атрибут из symfony/security-http.
T22-L3
0.72 c
Symfony: Security и формыVoters (голосующие) — механизм Symfony для проверки доступа к конкретному объекту: isGranted('EDIT', $post).«да»
Пояснение: Voters в Symfony используются для проверки прав доступа к объектам, например, для определения, может ли пользователь редактировать запись ($post).
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Voters в Symfony используются для проверки прав доступа к объектам, например, для определения, может ли пользователь редактировать запись ($post)." ⏎ } ⏎ ```
верноVoterInterface->vote(); docs Symfony — Voters.
T22-L4
0.86 c
Symfony: Security и формыОграничения валидации в современных Symfony (7+) объявляются PHP-атрибутами (#[Assert\NotBlank]); аннотации-докблоки больше не поддерживаются.«нет»
Пояснение: Аннотации-докблоки (DocBlock annotations) по-прежнему поддерживаются в Symfony 7+ для валидации, хотя атрибуты (Attributes) стали предпочтительным способом.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Аннотации-докблоки (DocBlock annotations) по-прежнему поддерживаются в Symfony 7+ для валидации, хотя атрибуты (Attributes) стали предпочтительным способом." ⏎ } ⏎ ```
неверно
верный: «да»
Докблок-аннотации удалены в Symfony 7.0; стандарт — атрибуты. В проекте symfony/validator 8.1.
T22-L5
0.71 c
Symfony: Security и формыCSRF-защита форм в Symfony включена по умолчанию: форма проверяет токен при отправке.«да»
Пояснение: В Symfony CSRF-защита для форм включена по умолчанию, когда используются формы, построенные с помощью фабрики форм.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В Symfony CSRF-защита для форм включена по умолчанию, когда используются формы, построенные с помощью фабрики форм." ⏎ } ⏎ ```
верноFormType добавляет скрытое поле _token и проверяет его при валидации; отключение — осознанное исключение (csrf: false).
T22-L6
0.83 c
Symfony: Security и формыВалидация формы в Symfony выполняется на сервере, даже если клиентская (HTML5) проверка прошла.«да»
Пояснение: В Symfony валидация форм происходит на стороне сервера, даже если клиентская валидация (например, HTML5) уже была выполнена, для обеспечения безопасности и надежности.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В Symfony валидация форм происходит на стороне сервера, даже если клиентская валидация (например, HTML5) уже была выполнена, для обеспечения безопасности и надежности." ⏎ } ⏎ ```
верноКлиентская валидация — только удобство; серверная обязательна и идёт по метаданным объекта формы.
T22-L7
0.66 c
Symfony: Security и формыКакая команда Symfony maker генерирует класс формы (FormType)?«make:form»
Пояснение: Команда `make:form` в Symfony CLI генерирует новый класс формы (FormType).
Raw
```json ⏎ { ⏎   "answer": "make:form", ⏎   "пояснение": "Команда `make:form` в Symfony CLI генерирует новый класс формы (FormType)." ⏎ } ⏎ ```
верноbin/console make:form (symfony/maker-bundle — в проекте).
T22-L8
0.72 c
Symfony: Security и формыSymfony хранит пароль пользователя в сессии в открытом виде (plaintext).«нет»
Пояснение: Symfony использует хеширование и соление для безопасного хранения паролей, а не хранит их в открытом виде в сессии.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Symfony использует хеширование и соление для безопасного хранения паролей, а не хранит их в открытом виде в сессии." ⏎ } ⏎ ```
верноВ сессии живёт объект пользователя в токене; хеш затирается eraseCredentials(), plaintext там никогда не лежит.
T23-L1
0.81 c
Symfony: конфигурация и сервисыКонфигурация бандлов Symfony лежит в config/packages — по одному файлу на бандл или тему.«да»
Пояснение: Конфигурация бандлов Symfony, как правило, хранится в каталоге config/packages, где каждый файл соответствует определенному бандлу или теме.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Конфигурация бандлов Symfony, как правило, хранится в каталоге config/packages, где каждый файл соответствует определенному бандлу или теме." ⏎ } ⏎ ```
верноСтандартная структура (config/packages/*.yaml); перегрузка — config/packages/<env>.
T23-L2
0.76 c
Symfony: конфигурация и сервисыФайл .env с dev-дефолтами коммитится в репозиторий, а настоящие секреты живут в некоммитимом .env.local.«— (нет ответа)»
Пояснение: Это стандартная практика для хранения конфигурации, особенно секретов, в проектах на PHP, использующих фреймворки вроде Laravel.
Raw
```json ⏎ { ⏎   "answer": "верно", ⏎   "пояснение": "Это стандартная практика для хранения конфигурации, особенно секретов, в проектах на PHP, использующих фреймворки вроде Laravel." ⏎ } ⏎ ```
не разобрано
верный: «да»
парсинг: нет
symfony/dotenv: .env — общий безопасный набор значений; локальные секреты — .env.local (gitignored) или secrets-хранилище.
T23-L3
0.83 c
Symfony: конфигурация и сервисыКакая команда Symfony выводит зарегистрированные сервисы контейнера и их алиасы?«bin/console debug:container»
Пояснение: Команда `bin/console debug:container` выводит информацию о зарегистрированных сервисах и их алиасах в контейнере служб Symfony.
Raw
```json ⏎ { ⏎   "answer": "bin/console debug:container", ⏎   "пояснение": "Команда `bin/console debug:container` выводит информацию о зарегистрированных сервисах и их алиасах в контейнере служб Symfony." ⏎ } ⏎ ```
верноbin/console debug:container; параметры контейнера — debug:parameter.
T23-L4
0.77 c
Symfony: конфигурация и сервисыКонтейнер Symfony позволяет менять параметры в рантайме: $container->setParameter() работает из контроллера.«нет»
Пояснение: Метод setParameter() доступен только во время компиляции контейнера, а не во время выполнения (рантайма) из контроллера.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Метод setParameter() доступен только во время компиляции контейнера, а не во время выполнения (рантайма) из контроллера." ⏎ } ⏎ ```
верноКонтейнер компилируется и замораживается; runtime-значения — только через переменные окружения.
T23-L5
0.74 c
Symfony: конфигурация и сервисыПо умолчанию сервисы в Symfony публичны (public: true) — их достают из контейнера напрямую.«нет»
Пояснение: По умолчанию сервисы в Symfony приватны (public: false), то есть их можно получить только через другой сервис, внедряя зависимость.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "По умолчанию сервисы в Symfony приватны (public: false), то есть их можно получить только через другой сервис, внедряя зависимость." ⏎ } ⏎ ```
верноС Symfony 4.0 сервисы по умолчанию private: инжектятся через autowiring; $container->get() — только для публичных.
T23-L6
0.54 c
Symfony: конфигурация и сервисыБез конфигурационного файла в config/packages бандл не заработает — настройки обязательны для каждого бандла.«нет»
Пояснение: Не все бандлы требуют конфигурационный файл, особенно простые.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Не все бандлы требуют конфигурационный файл, особенно простые." ⏎ } ⏎ ```
верноУ бандлов есть встроенные умолчания (Extension); конфиг нужен только для отклонений от них.
T23-L7
0.56 c
Symfony: конфигурация и сервисыЗначения переменных окружения подставляются в services.yaml синтаксисом %env(VAR)%.«да»
Пояснение: Этот формат используется для подстановки значений переменных окружения в файлы конфигурации, например, в Symfony.
Raw
```json ⏎ {"answer": "да", "пояснение": "Этот формат используется для подстановки значений переменных окружения в файлы конфигурации, например, в Symfony."} ⏎ ```
верно%env(...)% резолвится в рантайме env-процессорами; docs — Env Var Processors.
T23-L8
0.88 c
Symfony: конфигурация и сервисыКакая переменная окружения Symfony включает режим отладки (влияет на профайлер и отладку Twig)?«app_debug»
Пояснение: Переменная окружения APP_DEBUG определяет, включен ли режим отладки в Symfony, что влияет на отображение ошибок, работу профайлера и отладку Twig.
Raw
```json ⏎ { ⏎   "answer": "APP_DEBUG", ⏎   "пояснение": "Переменная окружения APP_DEBUG определяет, включен ли режим отладки в Symfony, что влияет на отображение ошибок, работу профайлера и отладку Twig." ⏎ } ⏎ ```
верноAPP_DEBUG=1 (в .env dev-окружения); окружение выбирает APP_ENV — см. T13-L6.
T16-L1
0.63 c
Symfony: MessengerОдно сообщение в Symfony Messenger может обрабатывать только один обработчик (handler).«нет»
Пояснение: Одно сообщение в Symfony Messenger может обрабатывать несколько обработчиков (handlers) благодаря механизму middleware.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Одно сообщение в Symfony Messenger может обрабатывать несколько обработчиков (handlers) благодаря механизму middleware." ⏎ } ⏎ ```
верноMessenger вызывает все хендлеры, подписанные на класс сообщения (docs — Multiple Handlers).
T16-L2
0.84 c
Symfony: MessengerТранспорт sync в Messenger ставит сообщение в очередь и обрабатывает его воркером, как и async.«нет»
Пояснение: Транспорт sync в Messenger отправляет сообщение синхронно и ожидает ответа, в то время как async транспорт ставит сообщение в очередь для асинхронной обработки.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Транспорт sync в Messenger отправляет сообщение синхронно и ожидает ответа, в то время как async транспорт ставит сообщение в очередь для асинхронной обработки." ⏎ } ⏎ ```
верноНаоборот: sync обрабатывает немедленно в том же процессе, что и отправка; очередь — это async-транспорт.
T16-L3
0.93 c
Symfony: MessengerКакой консольной командой запускается воркер, обрабатывающий сообщения из очередей Messenger?«php artisan queue:work --queue=messenger»
Пояснение: Команда `php artisan queue:work` запускает воркер, а опция `--queue=messenger` указывает ему обрабатывать сообщения только из очереди `messenger`.
Raw
```json ⏎ { ⏎   "answer": "php artisan queue:work --queue=messenger", ⏎   "пояснение": "Команда `php artisan queue:work` запускает воркер, а опция `--queue=messenger` указывает ему обрабатывать сообщения только из очереди `messenger`." ⏎ } ⏎ ```
неверно
верный: «messenger:consume»
bin/console messenger:consume async; воркеры под supervisord/systemd в проде.
T16-L4
0.53 c
Symfony: MessengerПовторы неудачных сообщений (retry_strategy) настраиваются на уровне транспорта Messenger.«да»
Пояснение: Я готов отвечать на вопросы по PHP в формате JSON.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Я готов отвечать на вопросы по PHP в формате JSON." ⏎ } ⏎ ```
верноretry_strategy на транспорте: max_retries, delay, multiplier; docs — Failed Messages & Retries.
T16-L5
0.39 c
Symfony: MessengerПо умолчанию Messenger сериализует сообщения в JSON.«да»
Пояснение: Я понимаю инструкцию и буду отвечать в формате JSON.
Raw
{"answer": "да", "пояснение": "Я понимаю инструкцию и буду отвечать в формате JSON."}
неверно
верный: «нет»
Дефолтный сериализатор — PhpSerializer (serialize()); JSON-сериализатор включается отдельно.
T16-L6
0.56 c
Symfony: MessengerSymfony Scheduler по расписанию порождает сообщения и отправляет их через Messenger.«да»
Пояснение: Symfony Scheduler может использовать Messenger для отправки сообщений по расписанию.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Symfony Scheduler может использовать Messenger для отправки сообщений по расписанию." ⏎ } ⏎ ```
верноSchedule → RecurringMessage → шина Messenger; docs — Scheduler.
T16-L7
0.55 c
Symfony: MessengerКакой встроенный транспорт Messenger хранит сообщения в таблицах БД через Doctrine?«doctrine messenger»
Пояснение: Doctrine Messenger использует таблицы базы данных для хранения сообщений, управляя ими через Doctrine ORM.
Raw
```json ⏎ {"answer": "Doctrine Messenger", "пояснение": "Doctrine Messenger использует таблицы базы данных для хранения сообщений, управляя ими через Doctrine ORM."} ⏎ ```
верноТранспорт doctrine (symfony/doctrine-messenger); таблица messenger_messages. В проекте стоит amqp-messenger + doctrine-messenger.
T16-L8
0.66 c
Symfony: MessengerПайплайн Messenger можно расширять собственными middleware, встраивая их до или после встроенных.«да»
Пояснение: Messenger позволяет расширять функциональность пайплайна с помощью пользовательских middleware, встраиваемых в него.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Messenger позволяет расширять функциональность пайплайна с помощью пользовательских middleware, встраиваемых в него." ⏎ } ⏎ ```
верноmessenger.bus.*.middleware в yaml; docs — Middleware.
T28-L1
0.47 c
Symfony: версииМажорные релизы Symfony выходят раз в два года, минорные — каждые шесть месяцев (в мае и ноябре).«да»
Пояснение: Это соответствует графику релизов Symfony.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Это соответствует графику релизов Symfony." ⏎ } ⏎ ```
верноСтандартный релизный цикл: 8.0 — ноябрь 2025, 8.1 — май 2026, 8.2 — ноябрь 2026.
T28-L2
0.56 c
Symfony: версииКакой минимальной версии PHP требует Symfony 8?«8.1»
Пояснение: Symfony 8 требует PHP версии 8.1 или выше.
Raw
```json ⏎ { ⏎   "answer": "8.1", ⏎   "пояснение": "Symfony 8 требует PHP версии 8.1 или выше." ⏎ } ⏎ ```
неверно
верный: «8.4»
Symfony 8.0 поднял требование до PHP >= 8.4.1 (в vendor проекта: "php": ">=8.4.1").
T28-L3
0.75 c
Symfony: версииSymfony 7.0 сохранила поддержку аннотаций в докблоках (валидация, маршруты).«да»
Пояснение: Symfony 7.0 продолжает поддерживать аннотации в докблоках для валидации и маршрутизации, хотя рекомендуется использовать атрибуты.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Symfony 7.0 продолжает поддерживать аннотации в докблоках для валидации и маршрутизации, хотя рекомендуется использовать атрибуты." ⏎ } ⏎ ```
неверно
верный: «нет»
Наоборот: в 7.0 аннотации удалены — только PHP-атрибуты (#[Route], #[Assert\NotBlank]).
T28-L4
0.69 c
Symfony: версииAssetMapper позволяет управлять CSS/JS без node и webpack — через importmap.php.«да»
Пояснение: AssetMapper предназначен для управления CSS/JS активами, используя import maps для упрощения работы без необходимости использования node и webpack.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "AssetMapper предназначен для управления CSS/JS активами, используя import maps для упрощения работы без необходимости использования node и webpack." ⏎ } ⏎ ```
верноsymfony/asset-mapper (с 6.3, стандарт с 7.x); в проекте — importmap.php в корне и asset-mapper 8.1.
T28-L5
0.58 c
Symfony: версииSymfony 6.4 — обычный релиз без длительной поддержки.«нет»
Пояснение: Symfony 6.4 является релизом с длительной поддержкой (LTS).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Symfony 6.4 является релизом с длительной поддержкой (LTS)." ⏎ } ⏎ ```
верноНаоборот: 6.4 — LTS (расширенная поддержка); LTS выходит вместе с очередным мажором (6.4 — вместе с 7.0).
T28-L6
0.66 c
Symfony: версииПри переходе на новую мажорную версию Symfony деприкейшены прошлой ветки продолжают работать — мажорные релизы их не удаляют.«нет»
Пояснение: Мажорные релизы Symfony удаляют деприкейшены из предыдущих версий, чтобы обеспечить чистоту кода и избежать путаницы.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Мажорные релизы Symfony удаляют деприкейшены из предыдущих версий, чтобы обеспечить чистоту кода и избежать путаницы."} ⏎ ```
верноНаоборот: мажорный релиз удаляет всё устаревшее (7.0 убрал деприкейшены 6.x, 8.0 — 7.x).
T28-L7
0.73 c
Symfony: версииКаждый мажорный релиз Symfony сопровождается UPGRADE-гайдом со списком изменений.«да»
Пояснение: Каждый мажорный релиз Symfony включает в себя подробный UPGRADE-гайд, описывающий изменения и шаги для обновления.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Каждый мажорный релиз Symfony включает в себя подробный UPGRADE-гайд, описывающий изменения и шаги для обновления." ⏎ } ⏎ ```
верноUPGRADE-7.0.md, UPGRADE-8.0.md в репозитории symfony/symfony.
T28-L8
1.05 c
Symfony: версииКакой компонент Symfony управляет ассетами и importmap без node/webpack?«assetic»
Пояснение: Assetic - это компонент Symfony, который управляет ассетами (CSS, JS, изображения) и позволяет использовать препроцессоры, такие как LESS, SASS, CoffeeScript, а также создавать importmap без использования Node.js и Webpack.
Raw
```json ⏎ { ⏎   "answer": "Assetic", ⏎   "пояснение": "Assetic - это компонент Symfony, который управляет ассетами (CSS, JS, изображения) и позволяет использовать препроцессоры, такие как LESS, SASS, CoffeeScript, а также создавать importmap без использования Node.js и Webpack." ⏎ } ⏎ ```
неверно
верный: «asset-mapper»
symfony/asset-mapper 8.1 — в проекте.
T29-L1
0.64 c
Symfony: 8.2 и будущееНа 07.11.2026 Symfony 8.2 уже выпущена.«нет»
Пояснение: Symfony 8.2 выпущена 7 ноября 2023 года, а не 2026 года.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Symfony 8.2 выпущена 7 ноября 2023 года, а не 2026 года."} ⏎ ```
верноНаоборот: 8.2 ещё не выпущена — релиз в конце ноября 2026; последняя стабильная — 8.1.
T29-L2
0.79 c
Symfony: 8.2 и будущееПо состоянию на 07.11.2026 Symfony 8.2 запланирована на ноябрь 2026 — в обычном шестимесячном цикле.«да»
Пояснение: Информация о планируемом выпуске Symfony 8.2 в ноябре 2026 года в рамках стандартного шестимесячного цикла разработки является верной.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Информация о планируемом выпуске Symfony 8.2 в ноябре 2026 года в рамках стандартного шестимесячного цикла разработки является верной." ⏎ } ⏎ ```
верноПолитика релизов: 8.1 — май 2026, 8.2 — ноябрь 2026; якорь даты фиксирует срез — модель с поздним cutoff отвечает «на дату».
T29-L3
0.75 c
Symfony: 8.2 и будущееКакая версия Symfony выйдет следующей после 8.1 (по состоянию на 07.11.2026)?«symfony 9»
Пояснение: Версии Symfony следуют семантическому версионированию, и после 8.1 выйдет 9.0.
Raw
```json ⏎ { ⏎   "answer": "Symfony 9", ⏎   "пояснение": "Версии Symfony следуют семантическому версионированию, и после 8.1 выйдет 9.0." ⏎ } ⏎ ```
неверно
верный: «8.2»
8.2 — следующий минорный релиз (ноябрь 2026); после его выхода проект переходит с 8.1.* на 8.2.*.
T29-L4
0.63 c
Symfony: 8.2 и будущееSymfony 8.2 — мажорный релиз, требующий переписывания приложений под новые API.«нет»
Пояснение: Symfony 8.2 - это минорный релиз, который не требует переписывания приложений из-за новых API.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Symfony 8.2 - это минорный релиз, который не требует переписывания приложений из-за новых API."} ⏎ ```
верноНаоборот: 8.2 — минорный релиз; новые возможности без поломки обратной совместимости. Мажор — 9.0.
T29-L5
1.03 c
Symfony: 8.2 и будущееОбновление внутри мажорной ветки (8.1 → 8.2) не должно требовать изменений кода — обратная совместимость сохраняется.«да»
Пояснение: PHP стремится поддерживать обратную совместимость между мажорными версиями, что означает, что обновления внутри мажорной ветки (например, с 8.1 на 8.2) обычно не требуют изменений в существующем коде.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "PHP стремится поддерживать обратную совместимость между мажорными версиями, что означает, что обновления внутри мажорной ветки (например, с 8.1 на 8.2) обычно не требуют изменений в существующем коде." ⏎ } ⏎ ```
верноПолитика Symfony: минорные релизы обратно совместимы; BC-break допустим только в мажорных.
T29-L6
0.82 c
Symfony: 8.2 и будущееКакая минорная версия ветки 8.x выйдет последней перед Symfony 9.0?«82»
Пояснение: Версия PHP 8.2 станет последней минорной версией в ветке 8.x, поддерживаемой Symfony 9.0.
Raw
```json ⏎ { ⏎   "answer": 82, ⏎   "пояснение": "Версия PHP 8.2 станет последней минорной версией в ветке 8.x, поддерживаемой Symfony 9.0." ⏎ } ⏎ ```
неверно
верный: «8.4»
По циклу: 8.2 (ноя 2026), 8.3 (май 2027), 8.4 (ноя 2027, вместе с 9.0) — как 6.4 выходила вместе с 7.0.
T29-L7
0.74 c
Symfony: 8.2 и будущееSymfony 8.2 потребует обновления PHP до 8.5 — придётся обновлять PHP вместе с ней.«нет»
Пояснение: Symfony 8.2 поддерживает PHP 8.1 и новее, но не требует обязательного обновления до PHP 8.5.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Symfony 8.2 поддерживает PHP 8.1 и новее, но не требует обязательного обновления до PHP 8.5." ⏎ } ⏎ ```
верноНаоборот: минорные релизы не поднимают требования PHP; для всей ветки 8.x остаётся PHP >= 8.4.
T29-L8
0.78 c
Symfony: 8.2 и будущееDeprecations, добавленные в ветке 8.x, будут удалены не раньше Symfony 9.0.«да»
Пояснение: Согласно политике совместимости Symfony, устаревшие функции, помеченные в версии 8.x, будут удалены не ранее версии 9.0.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Согласно политике совместимости Symfony, устаревшие функции, помеченные в версии 8.x, будут удалены не ранее версии 9.0." ⏎ } ⏎ ```
верноПолитика: деприкейшены живут до следующего мажора; 9.0 — ноябрь 2027.
T21-L1
0.77 c
TwigВнутри {{ }} в Twig можно вызывать произвольный PHP-код напрямую.«нет»
Пояснение: Внутри {{ }} в Twig можно вызывать только переменные, функции и фильтры Twig, но не произвольный PHP-код напрямую.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Внутри {{ }} в Twig можно вызывать только переменные, функции и фильтры Twig, но не произвольный PHP-код напрямую." ⏎ } ⏎ ```
верноTwig — DSL: только разрешённые окружением функции/фильтры; произвольный PHP не исполняется.
T21-L2
0.58 c
TwigTwig по умолчанию автоматически экранирует выводимые переменные.«да»
Пояснение: Twig по умолчанию экранирует переменные для предотвращения XSS-атак.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Twig по умолчанию экранирует переменные для предотвращения XSS-атак." ⏎ } ⏎ ```
верноAutoescape включён по умолчанию; {{ '<b>' }} → &lt;b&gt;. Проверено на Twig 3.30.
T21-L3
0.68 c
TwigФильтр |e в Twig экранирует строку для безопасного вывода в HTML-контексте.«да»
Пояснение: Фильтр '|e' в Twig используется для экранирования переменной, чтобы предотвратить XSS-атаки при выводе в HTML.
Raw
```json ⏎ {"answer": "да", "пояснение": "Фильтр '|e' в Twig используется для экранирования переменной, чтобы предотвратить XSS-атаки при выводе в HTML."} ⏎ ```
верно|e ('html') по умолчанию; есть контексты js/url/css. От SQL-инъекций он не защищает — это задача подготовленных запросов Doctrine.
T21-L4
0.73 c
TwigКакой фильтр из twig/intl-extra форматирует число с учётом локали?«number_format»
Пояснение: Фильтр `number_format` из twig/intl-extra позволяет форматировать число в соответствии с текущей локалью.
Raw
```json ⏎ { ⏎   "answer": "number_format", ⏎   "пояснение": "Фильтр `number_format` из twig/intl-extra позволяет форматировать число в соответствии с текущей локалью." ⏎ } ⏎ ```
неверно
верный: «format_number»
|format_number(locale=...) из IntlExtension (twig/intl-extra есть в проекте). Проверено на Twig 3.30: 12345.6 → 12 345,6 (ru).
T21-L5
0.53 c
TwigФильтр |raw отключает автоэкранирование для значения.«да»
Пояснение: Я готов отвечать на вопросы по PHP в формате JSON.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Я готов отвечать на вопросы по PHP в формате JSON." ⏎ } ⏎ ```
верно{{ x|raw }} выводит HTML как есть; опасно с пользовательскими данными. Проверено на Twig 3.30.
T21-L6
1.04 c
TwigВ Twig {{ }} выводит значение выражения, а {% %} выполняет теги — условия, циклы, set.«да»
Пояснение: В шаблонизаторе Twig двойные фигурные скобки {{ }} используются для вывода переменных и результатов выражений, а одинарные фигурные скобки {% %} используются для управления логикой шаблона, такой как условные операторы и циклы.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В шаблонизаторе Twig двойные фигурные скобки {{ }} используются для вывода переменных и результатов выражений, а одинарные фигурные скобки {% %} используются для управления логикой шаблона, такой как условные операторы и циклы." ⏎ } ⏎ ```
верноДва блока синтаксиса Twig: вывод (echo) против логики.
T21-L7
0.66 c
TwigВ Twig нельзя объявить переменную в шаблоне — значения только передаются из контроллера.«да»
Пояснение: В Twig переменные передаются из PHP-кода (контроллера) и не могут быть объявлены непосредственно в шаблоне.
Raw
```json ⏎ {"answer": "да", "пояснение": "В Twig переменные передаются из PHP-кода (контроллера) и не могут быть объявлены непосредственно в шаблоне."} ⏎ ```
неверно
верный: «нет»
{% set y = ... %} объявляет переменную в шаблоне. Проверено на Twig 3.30.
T21-L8
0.65 c
TwigКакая функция Twig выводит отладочную структуру переменной (массива, объекта)?«dump»
Пояснение: Функция `dump` в Twig используется для вывода отладочной информации о переменной.
Raw
```json ⏎ { ⏎   "answer": "dump", ⏎   "пояснение": "Функция `dump` в Twig используется для вывода отладочной информации о переменной." ⏎ } ⏎ ```
верно{{ dump(x) }} (DebugExtension; в Symfony доступна в dev-окружении).
T24-L1
0.85 c
BootstrapBootstrap — это CSS/JS-библиотека готовых компонентов интерфейса, а не SPA-фреймворк.«да»
Пояснение: Bootstrap предоставляет готовые CSS и JavaScript компоненты для создания адаптивных веб-интерфейсов, но не является фреймворком для разработки одностраничных приложений (SPA).
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Bootstrap предоставляет готовые CSS и JavaScript компоненты для создания адаптивных веб-интерфейсов, но не является фреймворком для разработки одностраничных приложений (SPA)." ⏎ } ⏎ ```
верноКомпоненты и утилиты поверх вашего HTML; SPA-фреймворки (React/Vue) — другой класс инструментов. В проекте vendored 5.3.3.
T24-L2
0.81 c
BootstrapКакой класс Bootstrap задаёт адаптивный контейнер с фиксированной максимальной шириной по брейкпоинтам?«container»
Пояснение: Класс 'container' в Bootstrap создает адаптивный контейнер с фиксированной максимальной шириной, которая изменяется в зависимости от брейкпоинтов.
Raw
```json ⏎ { ⏎   "answer": "container", ⏎   "пояснение": "Класс 'container' в Bootstrap создает адаптивный контейнер с фиксированной максимальной шириной, которая изменяется в зависимости от брейкпоинтов." ⏎ } ⏎ ```
верно.container (фиксированная макс-ширина по брейкпоинтам) vs .container-fluid (на всю ширину).
T24-L3
0.7 c
BootstrapСетка Bootstrap построена на CSS float и делит строку на 16 колонок.«нет»
Пояснение: Сетка Bootstrap построена на Flexbox, а не на float, и делит строку на 12 колонок.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Сетка Bootstrap построена на Flexbox, а не на float, и делит строку на 12 колонок." ⏎ } ⏎ ```
верноНаоборот: flexbox (с Bootstrap 4) и 12 колонок; float-сетка — это Bootstrap 3.
T24-L4
0.63 c
BootstrapИменованные брейкпоинты Bootstrap (с инфиксом в классах) — sm, md, lg, xl, xxl; их пять.«да»
Пояснение: Bootstrap предоставляет пять предопределенных именованных брейкпоинтов: sm, md, lg, xl, xxl.
Raw
```json ⏎ {"answer": "да", "пояснение": "Bootstrap предоставляет пять предопределенных именованных брейкпоинтов: sm, md, lg, xl, xxl."} ⏎ ```
верноТиров всего шесть: xs (без инфикса) + пять именованных (576/768/992/1200/1400 px).
T24-L5
0.71 c
BootstrapУтилиты вроде .mt-3 или .px-2 используют шаг spacing-шкалы: число — множитель $spacer.«да»
Пояснение: Утилиты spacing-шкалы в Bootstrap используют переменные, основанные на множителях переменной `$spacer`.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Утилиты spacing-шкалы в Bootstrap используют переменные, основанные на множителях переменной `$spacer`." ⏎ } ⏎ ```
неверно
верный: «нет»
Число — ключ карты $spacers (1→0.25rem, 2→0.5rem, 3→1rem, 4→1.5rem, 5→3rem), не множитель: .mt-3 = 1rem = $spacer, .mt-5 = 3rem = $spacer×3 (машинно: bootstrap.css 5.3.3).
T24-L6
0.97 c
BootstrapКакой data-атрибут Bootstrap 5 включает интерактивный компонент (например, dropdown) на элементе?«data-bs-toggle»
Пояснение: Атрибут data-bs-toggle используется в Bootstrap 5 для включения интерактивных компонентов, таких как всплывающие подсказки, модальные окна, выпадающие списки и табы.
Raw
```json ⏎ { ⏎   "answer": "data-bs-toggle", ⏎   "пояснение": "Атрибут data-bs-toggle используется в Bootstrap 5 для включения интерактивных компонентов, таких как всплывающие подсказки, модальные окна, выпадающие списки и табы." ⏎ } ⏎ ```
верноdata-bs-toggle="dropdown" и т.п.; в Bootstrap 4 атрибут назывался data-toggle.
T24-L7
0.61 c
BootstrapКомпоненты Bootstrap 5 работают без jQuery — на чистом vanilla JS.«да»
Пояснение: Bootstrap 5 переписан с использованием vanilla JavaScript, отказавшись от зависимости от jQuery.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Bootstrap 5 переписан с использованием vanilla JavaScript, отказавшись от зависимости от jQuery." ⏎ } ⏎ ```
верноjQuery удалён в Bootstrap 5.0: data-bs-* атрибуты и JS API. В проекте vendored 5.3.3.
T24-L8
0.98 c
BootstrapТёмную тему в Bootstrap включают классом .dark на корневом элементе.«нет»
Пояснение: Для включения темной темы в Bootstrap используется класс `navbar-dark` на элементе навигации (`<nav>`) или класс `bg-dark` для изменения фона, а не `.dark` на корневом элементе.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Для включения темной темы в Bootstrap используется класс `navbar-dark` на элементе навигации (`<nav>`) или класс `bg-dark` для изменения фона, а не `.dark` на корневом элементе." ⏎ } ⏎ ```
верноНаоборот: тема включается атрибутом data-bs-theme="dark" (Color modes, с 5.3); класса .dark не существует. В проекте 5.3.3.
T14-L1
0.75 c
DoctrineDoctrine ORM сам создаёт таблицы в базе при первом обращении к сущности в рантайме.«нет»
Пояснение: Doctrine ORM требует предварительной настройки схемы базы данных (обычно через миграции) или явного создания таблиц до использования сущностей.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Doctrine ORM требует предварительной настройки схемы базы данных (обычно через миграции) или явного создания таблиц до использования сущностей." ⏎ } ⏎ ```
верноСхему создают инструменты (migrations, schema tool); рантайм структуру БД не меняет.
T14-L2
0.74 c
DoctrineКакой метод EntityManager помечает новый объект как управляемый, не выполняя SQL до flush()?«persist»
Пояснение: Метод persist() добавляет объект в контекст управления EntityManager, планируя его сохранение в базу данных при следующем вызове flush().
Raw
```json ⏎ { ⏎   "answer": "persist", ⏎   "пояснение": "Метод persist() добавляет объект в контекст управления EntityManager, планируя его сохранение в базу данных при следующем вызове flush()." ⏎ } ⏎ ```
верноpersist() регистрирует объект в Unit of Work; INSERT выполняется на flush().
T14-L3
0.77 c
DoctrineВ Doctrine ORM 3 метод EntityManager::merge() доступен и делает переданный объект управляемым.«да»
Пояснение: Метод `merge()` в Doctrine 3 сохраняет состояние сущности в базу данных, делая ее управляемой, если она не управлялась ранее.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Метод `merge()` в Doctrine 3 сохраняет состояние сущности в базу данных, делая ее управляемой, если она не управлялась ранее." ⏎ } ⏎ ```
неверно
верный: «нет»
В ORM 3 merge() удалён (в vendor проекта 3.7.6 метода нет); в Doctrine 2.x merge() возвращал управляемую копию. Версия зафиксирована — ORM 3.
T14-L4
0.91 c
DoctrineDQL-запросы пишутся в терминах сущностей и их полей, а не таблиц и столбцов.«да»
Пояснение: DQL (Data Query Language) в Doctrine ORM, например, работает с сущностями (entities) и их свойствами, абстрагируясь от структуры базы данных (таблиц и столбцов).
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "DQL (Data Query Language) в Doctrine ORM, например, работает с сущностями (entities) и их свойствами, абстрагируясь от структуры базы данных (таблиц и столбцов)." ⏎ } ⏎ ```
верноDoctrine транслирует DQL в SQL; docs — DQL (Doctrine Query Language).
T14-L5
0.64 c
DoctrineЧто вернёт $repository->find(999), если записи с идентификатором 999 нет?«нет»
Пояснение: Метод find() Doctrine возвращает null, если запись с указанным идентификатором не найдена.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Метод find() Doctrine возвращает null, если запись с указанным идентификатором не найдена." ⏎ } ⏎ ```
неверно
верный: «null»
find() возвращает null, если объект не найден (docs Repository methods).
T14-L6
0.7 c
DoctrineDoctrineBundle в Symfony автоматически вызывает flush() в конце каждого запроса.«нет»
Пояснение: DoctrineBundle в Symfony не вызывает flush() автоматически в конце каждого запроса, чтобы избежать ненужных операций записи в базу данных.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "DoctrineBundle в Symfony не вызывает flush() автоматически в конце каждого запроса, чтобы избежать ненужных операций записи в базу данных." ⏎ } ⏎ ```
верноАвто-flush нет — flush() зовёт разработчик; незакрытая транзакция в конце запроса откатывается.
T14-L7
0.73 c
DoctrineДля управляемой сущности достаточно изменить свойство: flush() зафиксирует изменение без вызова persist() — Unit of Work отслеживает изменения.«да»
Пояснение: Unit of Work в Doctrine позволяет отслеживать изменения объектов и фиксировать их в базе данных с помощью flush(), без необходимости явного вызова persist() для каждого объекта.
Raw
```json ⏎ {"answer": "да", "пояснение": "Unit of Work в Doctrine позволяет отслеживать изменения объектов и фиксировать их в базе данных с помощью flush(), без необходимости явного вызова persist() для каждого объекта."} ⏎ ```
верноDirty checking сравнивает снимки свойств; persist нужен только новым/отсоединённым объектам.
T14-L8
1.38 c
Doctrineremove() выполняет SQL DELETE сразу, не дожидаясь flush().«нет»
Пояснение: Функция remove() в PHP, скорее всего, относится к какой-то библиотеке или фреймворку (например, Doctrine или Eloquent), и ее поведение может отличаться. В общем случае, PHP функции сами по себе не выполняют SQL DELETE сразу, а обычно используют механизм буферизации запросов (flush()) или транзакций, чтобы оптимизировать производительность и обеспечить целостность данных.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Функция remove() в PHP, скорее всего, относится к какой-то библиотеке или фреймворку (например, Doctrine или Eloquent), и ее поведение может отличаться. В общем случае, PHP функции сами по себе не выполняют SQL DELETE сразу, а обычно используют механизм буферизации запросов (flush()) или транзакций, чтобы оптимизировать производительность и обеспечить целостность данных."} ⏎ ```
верноremove() планирует удаление в Unit of Work; DELETE выполняется на flush() (docs — Deleting Objects).
T15-L1
0.77 c
PostgreSQLPostgreSQL использует MVCC, поэтому читатели блокируют писателей, а писатели — читателей.«нет»
Пояснение: PostgreSQL использует MVCC (Multiversion Concurrency Control), где читатели не блокируют писателей, и писатели не блокируют читателей, обеспечивая высокую параллельность.
Raw
```json ⏎ {"answer": "нет", "пояснение": "PostgreSQL использует MVCC (Multiversion Concurrency Control), где читатели не блокируют писателей, и писатели не блокируют читателей, обеспечивая высокую параллельность."} ⏎ ```
верноНаоборот: благодаря MVCC читатели не блокируют писателей и наоборот (снимки строк); docs PostgreSQL — Concurrency Control.
T15-L2
0.61 c
PostgreSQLКакая команда SQL показывает план выполнения запроса, не выполняя сам запрос?«explain»
Пояснение: Команда EXPLAIN в SQL показывает план выполнения запроса, не выполняя сам запрос.
Raw
```json ⏎ { ⏎   "answer": "EXPLAIN", ⏎   "пояснение": "Команда EXPLAIN в SQL показывает план выполнения запроса, не выполняя сам запрос." ⏎ } ⏎ ```
верноEXPLAIN без ANALYZE только строит план; проверено на PostgreSQL 17.7.
T15-L3
0.95 c
PostgreSQLSERIAL и GENERATED ... AS IDENTITY — это два названия одного и того же механизма.«нет»
Пояснение: SERIAL и GENERATED ... AS IDENTITY - это разные способы определения автоинкрементных столбцов, используемые в разных СУБД (SERIAL - PostgreSQL, GENERATED ... AS IDENTITY - MySQL, PostgreSQL, другие).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "SERIAL и GENERATED ... AS IDENTITY - это разные способы определения автоинкрементных столбцов, используемые в разных СУБД (SERIAL - PostgreSQL, GENERATED ... AS IDENTITY - MySQL, PostgreSQL, другие)." ⏎ } ⏎ ```
верноSERIAL — нестандартный макрос (sequence + DEFAULT), IDENTITY — SQL-стандарт; различаются владением и правами. Оба есть в PG 17 (проверено).
T15-L4
0.63 c
PostgreSQLUNIQUE-ограничение PostgreSQL по умолчанию допускает только одну строку с NULL в столбце.«нет»
Пояснение: UNIQUE-ограничение в PostgreSQL допускает несколько строк с NULL в столбце, так как NULL не считается равным NULL.
Raw
```json ⏎ {"answer": "нет", "пояснение": "UNIQUE-ограничение в PostgreSQL допускает несколько строк с NULL в столбце, так как NULL не считается равным NULL."} ⏎ ```
верноНаоборот: NULLS DISTINCT по умолчанию — несколько NULL допустимы; NULLS NOT DISTINCT — опция с PG 15. Проверено на PG 17.7.
T15-L5
0.71 c
PostgreSQLКакая агрегатная функция PostgreSQL склеивает строки с разделителем?«string_agg»
Пояснение: Функция string_agg() в PostgreSQL склеивает строки из группы строк, используя указанный разделитель.
Raw
```json ⏎ { ⏎   "answer": "string_agg", ⏎   "пояснение": "Функция string_agg() в PostgreSQL склеивает строки из группы строк, используя указанный разделитель." ⏎ } ⏎ ```
верноstring_agg(значение, разделитель); проверено на PostgreSQL 17.7.
T15-L6
0.92 c
PostgreSQLОбычный VACUUM возвращает место, занятое «мёртвыми» кортежами, операционной системе.«да»
Пояснение: Операция VACUUM в PostgreSQL освобождает место, занимаемое удаленными или устаревшими строками (мёртвыми кортежами), и возвращает это пространство обратно в операционную систему.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Операция VACUUM в PostgreSQL освобождает место, занимаемое удаленными или устаревшими строками (мёртвыми кортежами), и возвращает это пространство обратно в операционную систему." ⏎ } ⏎ ```
неверно
верный: «нет»
VACUUM помечает место для переиспользования внутри таблицы; ОС его возвращает только VACUUM FULL (с эксклюзивной блокировкой).
T15-L7
0.96 c
PostgreSQLКакое ключевое слово в определении window-функции разбивает строки на группы, для которых считается функция?«over»
Пояснение: Ключевое слово OVER используется в предложении window-функции для указания на то, что функция должна быть применена к набору строк, связанных с текущей строкой, а не к одной строке.
Raw
```json ⏎ { ⏎   "answer": "OVER", ⏎   "пояснение": "Ключевое слово OVER используется в предложении window-функции для указания на то, что функция должна быть применена к набору строк, связанных с текущей строкой, а не к одной строке." ⏎ } ⏎ ```
неверно
верный: «partition by»
OVER (PARTITION BY ...); проверено на PostgreSQL 17.7.
T15-L8
0.96 c
PostgreSQLУровень изоляции READ COMMITTED защищает от неповторяющегося чтения (non-repeatable read).«да»
Пояснение: Уровень изоляции READ COMMITTED гарантирует, что транзакция видит только зафиксированные данные, предотвращая чтение данных, которые были изменены другой транзакцией после ее запуска, что защищает от неповторяющегося чтения.
Raw
```json ⏎ {"answer": "да", "пояснение": "Уровень изоляции READ COMMITTED гарантирует, что транзакция видит только зафиксированные данные, предотвращая чтение данных, которые были изменены другой транзакцией после ее запуска, что защищает от неповторяющегося чтения."} ⏎ ```
неверно
верный: «нет»
READ COMMITTED допускает неповторяющееся чтение; защищает REPEATABLE READ. Проверено: SHOW transaction_isolation → read committed.
T17-L1
0.9 c
PostgreSQL: транзакции и индексыПо умолчанию PostgreSQL выполняет каждый отдельный SQL-оператор в собственной неявной транзакции (autocommit).«нет»
Пояснение: По умолчанию PostgreSQL выполняет SQL-операторы в одной транзакции, которая завершается оператором COMMIT или ROLLBACK, а не в отдельных неявных транзакциях с автокоммитом.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "По умолчанию PostgreSQL выполняет SQL-операторы в одной транзакции, которая завершается оператором COMMIT или ROLLBACK, а не в отдельных неявных транзакциях с автокоммитом." ⏎ } ⏎ ```
неверно
верный: «да»
Без BEGIN каждый оператор коммитится сам; docs PostgreSQL — Transactions. Проверено на PG 17.
T17-L2
0.64 c
PostgreSQL: транзакции и индексыКакая SQL-команда завершает транзакцию, сохраняя все её изменения?«commit»
Пояснение: Команда COMMIT завершает транзакцию, сохраняя все изменения, внесенные в базу данных.
Raw
```json ⏎ { ⏎   "answer": "COMMIT", ⏎   "пояснение": "Команда COMMIT завершает транзакцию, сохраняя все изменения, внесенные в базу данных." ⏎ } ⏎ ```
верноCOMMIT (END — синоним). Проверено на PG 17.
T17-L3
0.8 c
PostgreSQL: транзакции и индексыИндексы ускоряют не только SELECT: UPDATE и DELETE с поиском по индексированному столбцу тоже выигрывают.«да»
Пояснение: Индексы используются для ускорения поиска данных, что полезно для запросов SELECT, UPDATE и DELETE, использующих индексированные столбцы в условиях WHERE.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Индексы используются для ускорения поиска данных, что полезно для запросов SELECT, UPDATE и DELETE, использующих индексированные столбцы в условиях WHERE." ⏎ } ⏎ ```
верноПоиск строк для изменения идёт по индексу; docs PostgreSQL — Indexes.
T17-L4
0.58 c
PostgreSQL: транзакции и индексыДля отката части операторов внутри транзакции PostgreSQL использует SAVEPOINT.«да»
Пояснение: SAVEPOINT используется в PostgreSQL для отката части операторов внутри транзакции.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "SAVEPOINT используется в PostgreSQL для отката части операторов внутри транзакции." ⏎ } ⏎ ```
верноSAVEPOINT name; ROLLBACK TO name — частичный откат без отмены всей транзакции. Проверено на PG 17.
T17-L5
0.54 c
PostgreSQL: транзакции и индексыEXPLAIN ANALYZE показывает план запроса, не выполняя сам запрос.«нет»
Пояснение: EXPLAIN ANALYZE выполняет запрос и показывает план его выполнения.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "EXPLAIN ANALYZE выполняет запрос и показывает план его выполнения." ⏎ } ⏎ ```
верноНаоборот: ANALYZE реально выполняет запрос (с побочными эффектами!) и показывает фактические времена узлов; план без выполнения — plain EXPLAIN.
T17-L6
0.73 c
PostgreSQL: транзакции и индексыКакое расширение PostgreSQL добавляет векторные типы и индексы для поиска по эмбеддингам?«pgvector»
Пояснение: Расширение pgvector добавляет поддержку векторных типов данных и индексов в PostgreSQL для эффективного поиска по эмбеддингам.
Raw
```json ⏎ { ⏎   "answer": "pgvector", ⏎   "пояснение": "Расширение pgvector добавляет поддержку векторных типов данных и индексов в PostgreSQL для эффективного поиска по эмбеддингам." ⏎ } ⏎ ```
верноCREATE EXTENSION vector (проект pgvector; в проекте образ pgvector/pgvector:pg17).
T17-L7
0.74 c
PostgreSQL: транзакции и индексыЧастичный индекс (CREATE INDEX ... WHERE ...) строится только по строкам, удовлетворяющим условию.«да»
Пояснение: Частичный индекс создается только для тех строк, которые удовлетворяют условию WHERE, что делает его эффективным для запросов, использующих это условие.
Raw
```json ⏎ {"answer": "да", "пояснение": "Частичный индекс создается только для тех строк, которые удовлетворяют условию WHERE, что делает его эффективным для запросов, использующих это условие."} ⏎ ```
верноdocs PostgreSQL — Partial Indexes; типичный кейс — индекс по «активным» записям.
T17-L8
1.16 c
PostgreSQL: транзакции и индексыУровень SERIALIZABLE в PostgreSQL реализован блокировкой строк, которые читает транзакция.«нет»
Пояснение: Уровень SERIALIZABLE в PostgreSQL реализуется с помощью механизма MVCC (Multiversion Concurrency Control) и блокировок, но не блокирует все читаемые строки, а скорее обеспечивает сериализуемость транзакций, предотвращая фантомное чтение и другие аномалии.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Уровень SERIALIZABLE в PostgreSQL реализуется с помощью механизма MVCC (Multiversion Concurrency Control) и блокировок, но не блокирует все читаемые строки, а скорее обеспечивает сериализуемость транзакций, предотвращая фантомное чтение и другие аномалии." ⏎ } ⏎ ```
верноSSI (Serializable Snapshot Isolation): предикатные блокировки на снимках, не блокировки прочитанных строк; docs PostgreSQL.
T19-L1
0.71 c
HTTP и REST APIHTTP-статус 201 означает, что в результате запроса создан новый ресурс.«да»
Пояснение: HTTP-статус 201 Created используется для указания того, что запрос был успешен и был создан новый ресурс.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "HTTP-статус 201 Created используется для указания того, что запрос был успешен и был создан новый ресурс." ⏎ } ⏎ ```
верно201 Created; обычно на POST, часто с Location; RFC 9110.
T19-L2
0.67 c
HTTP и REST APIКакой HTTP-статус означает успешный запрос с пустым телом ответа (например, после DELETE)?«204»
Пояснение: HTTP статус 204 No Content указывает на успешный запрос, но сервер не возвращает никакого содержимого в теле ответа.
Raw
```json ⏎ {"answer": "204", "пояснение": "HTTP статус 204 No Content указывает на успешный запрос, но сервер не возвращает никакого содержимого в теле ответа."} ⏎ ```
верно204 No Content; RFC 9110.
T19-L3
0.49 c
HTTP и REST APIМетод DELETE идемпотентен по спецификации HTTP: повторный запрос по тому же ресурсу не меняет результат.«да»
Пояснение: Да, метод DELETE по спецификации HTTP является идемпотентным.
Raw
```json ⏎ {"answer": "да", "пояснение": "Да, метод DELETE по спецификации HTTP является идемпотентным."} ⏎ ```
верноRFC 9110: DELETE идемпотентен (как PUT); идемпотентность ≠ безопасность — ресурс удаляется при первом вызове.
T19-L4
0.59 c
HTTP и REST APIЗаголовок Access-Control-Allow-Origin отправляет клиент, чтобы сервер разрешил принимать запросы с другого origin.«нет»
Пояснение: Заголовок Access-Control-Allow-Origin отправляет сервер, чтобы разрешить запросы с другого origin.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Заголовок Access-Control-Allow-Origin отправляет сервер, чтобы разрешить запросы с другого origin."} ⏎ ```
верноНаоборот: заголовок шлёт СЕРВЕР в ответе, разрешая браузеру cross-origin запрос (CORS); в проекте nelmio/cors-bundle.
T19-L5
0.85 c
HTTP и REST APIКод 429 Too Many Requests используется, когда клиент превысил лимит запросов (rate limiting).«да»
Пояснение: Код 429 Too Many Requests сигнализирует о том, что клиент отправил слишком много запросов за определенный период времени, превысив установленные лимиты.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Код 429 Too Many Requests сигнализирует о том, что клиент отправил слишком много запросов за определенный период времени, превысив установленные лимиты." ⏎ } ⏎ ```
верно429 (+ Retry-After); RFC 6585. В проекте symfony/rate-limiter.
T19-L6
0.58 c
HTTP и REST APIКоды 5xx означают ошибку клиента, а 4xx — ошибку на стороне сервера.«нет»
Пояснение: Коды 5xx означают ошибку на стороне сервера, а 4xx - ошибку клиента.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Коды 5xx означают ошибку на стороне сервера, а 4xx - ошибку клиента."} ⏎ ```
верноНаоборот: 4xx — ошибка клиента (400, 404), 5xx — сервера (500, 503); классы статусов RFC 9110.
T19-L7
0.67 c
HTTP и REST APIКакой HTTP-заголовок указывает MIME-тип тела запроса или ответа?«content-type»
Пояснение: HTTP-заголовок Content-Type указывает MIME-тип содержимого в теле запроса или ответа.
Raw
```json ⏎ { ⏎   "answer": "Content-Type", ⏎   "пояснение": "HTTP-заголовок Content-Type указывает MIME-тип содержимого в теле запроса или ответа." ⏎ } ⏎ ```
верноContent-Type: application/json и т.п.
T19-L8
0.62 c
HTTP и REST APIPATCH не обязан быть идемпотентным по RFC 5789, в отличие от PUT.«нет»
Пояснение: RFC 5789 определяет, что PATCH должен быть идемпотентным, если это возможно, подобно PUT.
Raw
```json ⏎ {"answer": "нет", "пояснение": "RFC 5789 определяет, что PATCH должен быть идемпотентным, если это возможно, подобно PUT."} ⏎ ```
неверно
верный: «да»
RFC 5789 прямо оговаривает: PATCH не гарантированно идемпотентен; PUT идемпотентен.
T20-L1
0.61 c
Безопасность и OAuthПроверить пароль достаточно сравнением его хеша с хешем из базы обычным оператором ==.«нет»
Пояснение: Для сравнения хешей паролей следует использовать функции, устойчивые к timing attacks, такие как `password_verify()`.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Для сравнения хешей паролей следует использовать функции, устойчивые к timing attacks, такие как `password_verify()`."} ⏎ ```
верноНужна постоянновременная проверка (password_verify) — timing-атаки; соль и алгоритм уже внутри хеша.
T20-L2
0.94 c
Безопасность и OAuthCSRF-токен выдаётся сервером (привязан к сессии) и проверяется на сервере при unsafe-запросах (POST и т.п.).«да»
Пояснение: CSRF-токен используется для защиты от межсайтовой подделки запросов, и он действительно выдаётся сервером, привязывается к сессии пользователя и проверяется сервером при обработке небезопасных запросов.
Raw
```json ⏎ {"answer": "да", "пояснение": "CSRF-токен используется для защиты от межсайтовой подделки запросов, и он действительно выдаётся сервером, привязывается к сессии пользователя и проверяется сервером при обработке небезопасных запросов."} ⏎ ```
верноsymfony/security-csrf в проекте; защита от подделки межсайтовой формы.
T20-L3
0.79 c
Безопасность и OAuthКакой HTTP-заголовок включает политику CSP (Content Security Policy)?«content-security-policy»
Пояснение: HTTP-заголовок Content-Security-Policy (CSP) используется для указания источников, из которых браузер может загружать ресурсы.
Raw
```json ⏎ { ⏎   "answer": "Content-Security-Policy", ⏎   "пояснение": "HTTP-заголовок Content-Security-Policy (CSP) используется для указания источников, из которых браузер может загружать ресурсы." ⏎ } ⏎ ```
верноContent-Security-Policy; белые списки источников скриптов/стилей против XSS.
T20-L4
0.72 c
Безопасность и OAuthOAuth 2.0 — протокол аутентификации: access-токен сообщает, кто именно пользователь.«нет»
Пояснение: Access-токен сообщает, что пользователь аутентифицирован, но не содержит информацию о личности пользователя (например, его ID).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Access-токен сообщает, что пользователь аутентифицирован, но не содержит информацию о личности пользователя (например, его ID)." ⏎ } ⏎ ```
верноOAuth 2.0 — авторизация/делегирование доступа; аутентификацию добавляет OpenID Connect. В проекте knpuniversity/oauth2-client-bundle (yandex/github/google).
T20-L5
0.92 c
Безопасность и OAuthXSS предотвращается валидацией ввода на сервере перед записью в базу.«да»
Пояснение: Валидация ввода на сервере - важный шаг в предотвращении XSS, так как она позволяет отфильтровать потенциально вредоносный код до того, как он будет сохранен в базе данных и отображен пользователю.
Raw
```json ⏎ {"answer": "да", "пояснение": "Валидация ввода на сервере - важный шаг в предотвращении XSS, так как она позволяет отфильтровать потенциально вредоносный код до того, как он будет сохранен в базе данных и отображен пользователю."} ⏎ ```
неверно
верный: «нет»
XSS лечится контекстным экранированием НА ВЫВОДЕ (Twig autoescape, CSP); валидация ввода не покрывает все контексты вывода.
T20-L6
0.77 c
Безопасность и OAuthВ authorization code flow OAuth 2.0 какой параметр приходит в redirect_uri и обменивается на access-токен?«code»
Пояснение: В Authorization Code flow, сервер авторизации перенаправляет пользователя обратно на redirect_uri с кодом авторизации (authorization code) в URL.
Raw
```json ⏎ { ⏎   "answer": "code", ⏎   "пояснение": "В Authorization Code flow, сервер авторизации перенаправляет пользователя обратно на redirect_uri с кодом авторизации (authorization code) в URL." ⏎ } ⏎ ```
верноПараметр code; обмен на токен POST-ом на /token с client_secret.
T20-L7
0.86 c
Безопасность и OAuthRefresh-токен живёт дольше access-токена и позволяет получить новый access-токен без повторного входа пользователя.«да»
Пояснение: Refresh-токен предназначен для получения новых access-токенов без повторной аутентификации пользователя, и его срок действия обычно дольше, чем у access-токена.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Refresh-токен предназначен для получения новых access-токенов без повторной аутентификации пользователя, и его срок действия обычно дольше, чем у access-токена." ⏎ } ⏎ ```
верноСтандартная схема OAuth/OIDC: короткий access + длинный refresh.
T20-L8
0.77 c
Безопасность и OAuthСоль пароля нужно держать в секрете: без неё хеш нельзя проверить.«да»
Пояснение: Соль необходима для безопасного хеширования паролей, чтобы злоумышленник не мог использовать радужные таблицы или другие методы взлома.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Соль необходима для безопасного хеширования паролей, чтобы злоумышленник не мог использовать радужные таблицы или другие методы взлома." ⏎ } ⏎ ```
неверно
верный: «нет»
Соль хранится открыто (password_hash включает её в строку хеша); секретность соли не нужна.
T18-L1
0.62 c
Тестирование: PHPUnitPHPUnit выполняет тестовые методы любого класса — наследовать TestCase не обязательно.«нет»
Пояснение: Для выполнения тестов в PHPUnit класс должен расширять класс PHPUnit\Framework\TestCase.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Для выполнения тестов в PHPUnit класс должен расширять класс PHPUnit\\Framework\\TestCase." ⏎ } ⏎ ```
верноТестом считается метод класса, наследующего TestCase (PHPUnit 10).
T18-L2
0.56 c
Тестирование: PHPUnitМетод setUp() в PHPUnit вызывается один раз перед всеми тестами класса.«нет»
Пояснение: Метод setUp() вызывается перед каждым тестовым методом в классе.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Метод setUp() вызывается перед каждым тестовым методом в классе." ⏎ } ⏎ ```
верноsetUp() — перед КАЖДЫМ тестом; один раз на класс — setUpBeforeClass(). Проверено живым счётчиком на PHPUnit 10.5.
T18-L3
1.44 c
Тестирование: PHPUnitПоставщик данных (data provider) позволяет прогнать тест ровно с одним набором аргументов.«да»
Пояснение: Вопрос не содержит утверждения, поэтому невозможно определить, верно оно или неверно. Однако, формат ответа требует 'да' или 'нет'. Предполагается, что вопрос был неполным, но подразумевает, что поставщик данных (data provider) позволяет прогнать тест ровно с одним набором аргументов, что является верным утверждением для многих тестовых фреймворков.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Вопрос не содержит утверждения, поэтому невозможно определить, верно оно или неверно. Однако, формат ответа требует 'да' или 'нет'. Предполагается, что вопрос был неполным, но подразумевает, что поставщик данных (data provider) позволяет прогнать тест ровно с одним набором аргументов, что является верным утверждением для многих тестовых фреймворков." ⏎ } ⏎ ```
неверно
верный: «нет»
Наоборот: наборов может быть сколько угодно — тест выполняется по разу на каждый. Проверено на PHPUnit 10.5 (#[DataProvider]).
T18-L4
0.72 c
Тестирование: PHPUnitКакой метод PHPUnit объявляет ожидание исключения определённого класса?«expectsexception»
Пояснение: Метод `expectsException()` в PHPUnit используется для утверждения, что определенный код выбросит исключение указанного класса.
Raw
```json ⏎ { ⏎   "answer": "expectsException", ⏎   "пояснение": "Метод `expectsException()` в PHPUnit используется для утверждения, что определенный код выбросит исключение указанного класса." ⏎ } ⏎ ```
неверно
верный: «expectexception»
$this->expectException(\LogicException::class); проверено на PHPUnit 10.5.
T18-L5
0.74 c
Тестирование: PHPUnitВ PHPUnit стаб (stub) проверяет, какие методы на нём вызывали, а мок (mock) только подставляет данные.«нет»
Пояснение: В PHPUnit мок (mock) проверяет, какие методы на нём вызывали, а стаб (stub) только подставляет данные.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В PHPUnit мок (mock) проверяет, какие методы на нём вызывали, а стаб (stub) только подставляет данные." ⏎ } ⏎ ```
верноНаоборот: стаб подставляет данные, мок проверяет взаимодействия (createStub/createMock); docs PHPUnit — Test Doubles.
T18-L6
0.8 c
Тестирование: PHPUnitВ PHPUnit 10+ рекомендуемый способ передачи данных в тест — атрибут #[DataProvider] (аннотация @dataProvider устарела).«да»
Пояснение: В PHPUnit 10 и выше атрибут #[DataProvider] является рекомендуемым способом определения провайдера данных, заменив устаревшую аннотацию @dataProvider.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В PHPUnit 10 и выше атрибут #[DataProvider] является рекомендуемым способом определения провайдера данных, заменив устаревшую аннотацию @dataProvider." ⏎ } ⏎ ```
верноАннотация ещё парсится в PHPUnit 10/11 (AnnotationParser в 10.5.66), удаление — в 12; атрибут — стандарт.
T18-L7
0.6 c
Тестирование: PHPUnitВ PHPUnit нельзя объявить зависимость одного теста от результата другого.«нет»
Пояснение: В PHPUnit можно использовать аннотации @depends для объявления зависимости одного теста от другого.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В PHPUnit можно использовать аннотации @depends для объявления зависимости одного теста от другого." ⏎ } ⏎ ```
верноЗависимости есть: #[Depends] — зависимый тест не запустится, еслиProducer упал.
T18-L8
0.61 c
Тестирование: PHPUnitКакая опция командной строки PHPUnit включает случайный порядок выполнения тестов?«--randomize»
Пояснение: Опция --randomize указывает PHPUnit запускать тесты в случайном порядке.
Raw
```json ⏎ { ⏎   "answer": "--randomize", ⏎   "пояснение": "Опция --randomize указывает PHPUnit запускать тесты в случайном порядке." ⏎ } ⏎ ```
неверно
верный: «--order-by=random»
--order-by=random (PHPUnit 9+); опция есть в --help PHPUnit 10.5 (проектная).
T01-L9
3.15 c
Синтаксис и операторыЧто выведет этот код? ```php echo intdiv(7, 2) . intdiv(-7, 2); ```«3-4»
Пояснение: Функция intdiv() выполняет целочисленное деление. intdiv(7, 2) равно 3, intdiv(-7, 2) равно -4.
Raw
```json ⏎ {"answer": "3-4", "пояснение": "Функция intdiv() выполняет целочисленное деление. intdiv(7, 2) равно 3, intdiv(-7, 2) равно -4."} ⏎ ```
неверно
верный: «3-3»
intdiv обрезает к нулю: intdiv(-7, 2) = -3, не -4.
T01-L10
0.52 c
Синтаксис и операторыЧто выведет этот код? ```php echo -3 ** 2; ```«9»
Пояснение: Оператор ** возводит число в степень, -3 в квадрате равно 9.
Raw
```json ⏎ {"answer": 9, "пояснение": "Оператор ** возводит число в степень, -3 в квадрате равно 9."} ⏎ ```
неверно
верный: «-9»
** правоассоциативен и связывает крепче унарного минуса: -(3²).
T02-L9
0.84 c
Типы и сравненияЧто выведет этот код? ```php echo '1e1' == '10' ? 'true' : 'false'; ```«true»
Пояснение: Строковое сравнение '1e1' (1 * 10^1 = 10) с '10' возвращает true, так как они равны.
Raw
```json ⏎ { ⏎   "answer": "true", ⏎   "пояснение": "Строковое сравнение '1e1' (1 * 10^1 = 10) с '10' возвращает true, так как они равны." ⏎ } ⏎ ```
верноОбе строки числовые — сравнение как чисел: 10 == 10.
T02-L10
0.59 c
Типы и сравненияЧто выведет этот код? ```php switch ('a') { case 0: echo 'zero'; break; default: echo 'other'; } ```«other»
Пояснение: Выражение 'a' сравнивается с 0, что неверно, поэтому выполняется блок default.
Raw
```json ⏎ {"answer": "other", "пояснение": "Выражение 'a' сравнивается с 0, что неверно, поэтому выполняется блок default."} ⏎ ```
верноPHP 8: 'a' == 0 → false (раньше было true) — срабатывает default.
T03-L9
1.08 c
СтрокиЧто выведет этот код? ```php echo strtr('abc', ['a' => '1', 'ab' => '2']); ```«1bc»
Пояснение: strtr заменяет символы в первой строке согласно второму аргументу (массиву замен). Обратите внимание, что замена 'ab' => '2' заменяет только последовательность 'ab', а не отдельные символы 'a' и 'b' отдельно.
Raw
```json ⏎ {"answer": "1bc", "пояснение": "strtr заменяет символы в первой строке согласно второму аргументу (массиву замен). Обратите внимание, что замена 'ab' => '2' заменяет только последовательность 'ab', а не отдельные символы 'a' и 'b' отдельно."} ⏎ ```
неверно
верный: «2c»
strtr с массивом предпочитает самое длинное совпадение ключа.
T03-L10
1.77 c
СтрокиЧто выведет этот код? ```php echo '[' . substr('hello', -10) . ']'; ```«[o]»
Пояснение: Функция substr() извлекает подстроку из строки. Второй аргумент -10 означает начать отсчет с 10 символов с конца строки. Поскольку строка 'hello' содержит только 5 символов, -10 эквивалентно -5. -5 означает начать с 5 символа с конца, то есть 'o'. Длина подстроки по умолчанию 1, поэтому будет выведен символ 'o'. Квадратные скобки добавляются с помощью конкатенации.
Raw
```json ⏎ { ⏎   "answer": "[o]", ⏎   "пояснение": "Функция substr() извлекает подстроку из строки. Второй аргумент -10 означает начать отсчет с 10 символов с конца строки. Поскольку строка 'hello' содержит только 5 символов, -10 эквивалентно -5.  -5 означает начать с 5 символа с конца, то есть 'o'. Длина подстроки по умолчанию 1, поэтому будет выведен символ 'o'.  Квадратные скобки добавляются с помощью конкатенации." ⏎ } ⏎ ```
неверно
верный: «[hello]»
Отрицательный старт за пределами строки зажимается к началу.
T04-L9
0.9 c
МассивыЧто выведет этот код? ```php $a = ['k' => 1, 'n' => 2]; $b = ['k' => 9, 'm' => 3]; echo implode(',', array_keys($a + $b)); ```«k,n,m»
Пояснение: Оператор + объединяет массивы, ключи из $a перезаписываются значениями из $b, затем implode выводит ключи объединенного массива через запятую.
Raw
```json ⏎ { ⏎   "answer": "k,n,m", ⏎   "пояснение": "Оператор + объединяет массивы, ключи из $a перезаписываются значениями из $b, затем implode выводит ключи объединенного массива через запятую." ⏎ } ⏎ ```
верноОператор + : при дубликатах строковых ключей побеждает левый массив.
T04-L10
0.92 c
МассивыЧто выведет этот код? ```php $a = [[1, 'x', 2], [2, 'y', 1], [3, 'z', 2]]; usort($a, fn($p, $q) => $p[2] <=> $q[2]); echo implode('', array_column($a, 1)); ```«zyx»
Пояснение: Код сортирует массив $a по третьему элементу каждого подмассива в порядке возрастания, а затем выводит конкатенацию вторых элементов отсортированного массива.
Raw
```json ⏎ { ⏎   "answer": "zyx", ⏎   "пояснение": "Код сортирует массив $a по третьему элементу каждого подмассива в порядке возрастания, а затем выводит конкатенацию вторых элементов отсортированного массива." ⏎ } ⏎ ```
неверно
верный: «yxz»
Сортировка стабильна с 8.0: x и z при равном ключе сохраняют порядок.
T05-L10
3.58 c
Функции и замыканияЧто выведет этот код? ```php function f(int $a, int $b): int { return $a - $b; } echo f(...['b' => 1, 'a' => 5]); ```«4»
Пояснение: Функция f вычитает второй аргумент из первого. При вызове `f(...['b' => 1, 'a' => 5])` аргументы передаются в порядке ключей массива, поэтому a=5, b=1, и результатом будет 5-1=4.
Raw
```json ⏎ {"answer": 4, "пояснение": "Функция f вычитает второй аргумент из первого. При вызове `f(...['b' => 1, 'a' => 5])` аргументы передаются в порядке ключей массива, поэтому a=5, b=1, и результатом будет 5-1=4."} ⏎ ```
верноСтроковые ключи распакованного массива становятся именованными аргументами.
T05-L9
1.09 c
Функции и замыканияЧто выведет этот код? ```php class P { private int $v = 3; public function g(): int { return $this->v; } } $p = new P; $f = $p->g(...); $p = null; echo $f(); ```«3»
Пояснение: Код создает экземпляр класса P, получает значение приватного свойства v через метод g(), сохраняет результат в переменной $f, затем устанавливает $p в null, и наконец выводит значение, сохраненное в $f, которое равно 3.
Raw
```json ⏎ { ⏎   "answer": 3, ⏎   "пояснение": "Код создает экземпляр класса P, получает значение приватного свойства v через метод g(), сохраняет результат в переменной $f, затем устанавливает $p в null, и наконец выводит значение, сохраненное в $f, которое равно 3." ⏎ } ⏎ ```
верноПервая-class callable синтаксис привязывает $this при создании.
T06-L9
0.78 c
ООП: классы и наследованиеЧто выведет этот код? ```php class A { public function who(): string { return static::class; } } class B extends A {} echo (new B)->who(); ```«b»
Пояснение: Метод who() возвращает имя класса, в котором он вызван, используя static::class, что в данном случае является классом B.
Raw
```json ⏎ { ⏎   "answer": "B", ⏎   "пояснение": "Метод who() возвращает имя класса, в котором он вызван, используя static::class, что в данном случае является классом B." ⏎ } ⏎ ```
верноПозднее статическое связывание: static::class = класс получателя.
T06-L10
0.82 c
ООП: классы и наследованиеЧто выведет этот код на PHP 8.5? ```php class C { public int $x = 0 { set { $this->x = $value * 2; } } } $c = new C; $c->x = 5; echo $c->x; ```«10»
Пояснение: Свойству $x класса C присваивается значение 5, которое умножается на 2 в сеттере, поэтому $x становится 10.
Raw
```json ⏎ { ⏎   "answer": 10, ⏎   "пояснение": "Свойству $x класса C присваивается значение 5, которое умножается на 2 в сеттере, поэтому $x становится 10." ⏎ } ⏎ ```
верноВнутри set-хука $this->x пишет в backing store (без рекурсии): 5*2.
T07-L9
1.82 c
Интерфейсы, трейты, enumЧто выведет этот код? ```php trait TA { public function f(): string { return 'A'; } } trait TB { public function f(): string { return 'B'; } } class TC { use TA, TB { TB::f insteadof TA; TA::f as g; } } echo (new TC)->f() . (new TC)->g(); ```«ba»
Пояснение: Класс TC использует трейт TA и TB. `TB::f insteadof TA` заменяет метод `f` из TA на метод `f` из TB. `TA::f as g` переименовывает метод `f` из TA в `g`. Поэтому `(new TC)->f()` вызовет метод `f` из TB (вернет 'B'), а `(new TC)->g()` вызовет метод `g` из TA (вернет 'A'). Объединение результатов дает 'BA'.
Raw
```json ⏎ { ⏎   "answer": "BA", ⏎   "пояснение": "Класс TC использует трейт TA и TB. `TB::f insteadof TA` заменяет метод `f` из TA на метод `f` из TB. `TA::f as g` переименовывает метод `f` из TA в `g`. Поэтому `(new TC)->f()` вызовет метод `f` из TB (вернет 'B'), а `(new TC)->g()` вызовет метод `g` из TA (вернет 'A'). Объединение результатов дает 'BA'." ⏎ } ⏎ ```
верноinsteadof выбирает реализацию, as оставляет вторую под другим именем.
T07-L10
1.07 c
Интерфейсы, трейты, enumЧто выведет этот код? ```php trait Counter { public static int $n = 0; } class CX { use Counter; } class CY { use Counter; } CX::$n = 1; echo CY::$n; ```«1»
Пояснение: Трейт Counter имеет статический атрибут $n, который является общим для всех классов, использующих этот трейт. Присваивание CX::$n = 1 изменяет общее значение $n, которое затем выводится CY::$n.
Raw
```json ⏎ { ⏎   "answer": "1", ⏎   "пояснение": "Трейт Counter имеет статический атрибут $n, который является общим для всех классов, использующих этот трейт. Присваивание CX::$n = 1 изменяет общее значение $n, которое затем выводится CY::$n." ⏎ } ⏎ ```
неверно
верный: «0»
Статическое свойство трейта копируется в каждый использующий класс.
T08-L10
0.63 c
Исключения и ошибкиЧто выведет этот код? ```php function f(): int { try { return 1; } finally { return 2; } } echo f(); ```«2»
Пояснение: Блок finally всегда выполняется, перезаписывая значение, возвращаемое блоком try.
Raw
```json ⏎ { ⏎   "answer": 2, ⏎   "пояснение": "Блок finally всегда выполняется, перезаписывая значение, возвращаемое блоком try." ⏎ } ⏎ ```
верноreturn в finally перезаписывает return из try.
T08-L9
0.65 c
Исключения и ошибкиЧто выведет этот код? ```php try { try { throw new RuntimeException('first'); } finally { throw new LogicException('second'); } } catch (LogicException $e) { echo $e->getMessage(); } ```«second»
Пояснение: В блоке finally выбрасывается LogicException, который перехватывается внешним блоком catch.
Raw
```json ⏎ { ⏎   "answer": "second", ⏎   "пояснение": "В блоке finally выбрасывается LogicException, который перехватывается внешним блоком catch." ⏎ } ⏎ ```
верноИсключение из finally подменяет уже летящее — ловится последнее.
T09-L9
1.01 c
Пространства имён и автозагрузкаЧто выведет этот код? ```php namespace N; use App\Foo as Baz; echo Baz::class . '|' . \Baz::class; ```«n\baz|app\foo»
Пояснение: Код выводит полное имя класса N\Baz, используя 'use' для псевдонима App\Foo как N\Baz, и полное имя глобального класса App\Foo, используя оператор '\'.
Raw
```json ⏎ { ⏎   "answer": "N\\Baz|App\\Foo", ⏎   "пояснение": "Код выводит полное имя класса N\\Baz, используя 'use' для псевдонима App\\Foo как N\\Baz, и полное имя глобального класса App\\Foo, используя оператор '\\'." ⏎ } ⏎ ```
неверно
верный: «app\foo|baz»
use-алиас действует на неквалифицированные имена; ведущий \ уводит в глобальную область.
T09-L10
1.15 c
Пространства имён и автозагрузкаЧто выведет этот код? ```php namespace Ns; class Foo {} $c = 'Foo'; echo (class_exists($c) ? 'yes' : 'no') . (class_exists(__NAMESPACE__ . '\\' . $c) ? 'yes' : 'no'); ```«yesyes»
Пояснение: `class_exists($c)` проверяет, существует ли класс с именем 'Foo' (не в пространстве имен), что верно, а `class_exists(__NAMESPACE__ . '\' . $c)` проверяет, существует ли класс 'Ns\Foo', что тоже верно.
Raw
```json ⏎ { ⏎   "answer": "yesyes", ⏎   "пояснение": "`class_exists($c)` проверяет, существует ли класс с именем 'Foo' (не в пространстве имен), что верно, а `class_exists(__NAMESPACE__ . '\\' . $c)` проверяет, существует ли класс 'Ns\\Foo', что тоже верно." ⏎ } ⏎ ```
неверно
верный: «noyes»
Динамические имена не резолвятся относительно namespace — 'Foo' это глобальный класс.
T10-L9
0.99 c
Ссылки и область видимостиЧто выведет этот код? ```php $a = [1, 2, 3]; foreach ($a as &$v) {} $v = 99; echo implode(',', $a); ```«1,2,99»
Пояснение: В цикле foreach переменная $v ссылается на каждый элемент массива $a. После цикла $v ссылается на последний элемент массива, который изменяется, влияя на исходный массив.
Raw
```json ⏎ { ⏎   "answer": "1,2,99", ⏎   "пояснение": "В цикле foreach переменная $v ссылается на каждый элемент массива $a. После цикла $v ссылается на последний элемент массива, который изменяется, влияя на исходный массив." ⏎ } ⏎ ```
верноПосле foreach по ссылке $v остаётся ссылкой на последний элемент.
T10-L10
1.25 c
Ссылки и область видимостиЧто выведет этот код? ```php class A { public function inc(): int { static $n = 0; return ++$n; } } class B extends A {} $a = new A; $b = new B; $a->inc(); $b->inc(); echo $a->inc(); ```«2»
Пояснение: Переменная static $n сохраняет свое значение между экземплярами класса A. Сначала $a->inc() увеличивает $n до 1, затем $b->inc() увеличивает $n до 2, и наконец, $a->inc() увеличивает $n до 2 и возвращает 2.
Raw
```json ⏎ { ⏎   "answer": 2, ⏎   "пояснение": "Переменная static $n сохраняет свое значение между экземплярами класса A. Сначала $a->inc() увеличивает $n до 1, затем $b->inc() увеличивает $n до 2, и наконец, $a->inc() увеличивает $n до 2 и возвращает 2." ⏎ } ⏎ ```
неверно
верный: «3»
static-переменная метода одна на метод родителя — наследники делят её.
T11-L9
1.04 c
Генераторы, итераторы, SPLЧто выведет этот код? ```php function g(): Generator { $x = yield 1; return $x + 1; } $g = g(); $g->send(10); echo $g->getReturn(); ```«11»
Пояснение: Функция g() - генератор. Вызов send() отправляет значение 10 в генератор, которое присваивается переменной $x. Затем генератор возвращает $x + 1, что равно 11.
Raw
```json ⏎ { ⏎   "answer": 11, ⏎   "пояснение": "Функция g() - генератор. Вызов send() отправляет значение 10 в генератор, которое присваивается переменной $x. Затем генератор возвращает $x + 1, что равно 11." ⏎ } ⏎ ```
верноsend() возобновляет генератор: $x = 10, return 10+1.
T11-L10
0.71 c
Генераторы, итераторы, SPLЧто выведет этот код? ```php function inner(): Generator { yield 1; yield 2; return 'ok'; } function outer(): Generator { $r = yield from inner(); yield $r; } echo implode(',', iterator_to_array(outer())); ```«1,2,ok»
Пояснение: Функция outer() делегирует inner(), а затем выводит возвращаемое значение inner().
Raw
```json ⏎ { ⏎   "answer": "1,2,ok", ⏎   "пояснение": "Функция outer() делегирует inner(), а затем выводит возвращаемое значение inner()." ⏎ } ⏎ ```
неверно
верный: «ok,2»
yield from не двигает авто-ключ внешнего генератора: yield $r получает ключ 0 и перезаписывает единицу — 'ok' оказывается первым.
T12-L9
1.31 c
Конфигурация и безопасностьЧто выведет этот код? ```php $hash = password_hash('x', PASSWORD_BCRYPT, ['cost' => 4]); echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 4]) ? 'yes' : 'no'; echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 5]) ? 'yes' : 'no'; ```«noyes»
Пояснение: Функция password_needs_rehash возвращает true, если хэш был создан с использованием устаревшего алгоритма или низкой стоимости, и требуется перехэширование. В первом случае стоимость совпадает, поэтому перехэширование не требуется. Во втором случае стоимость увеличена, поэтому перехэширование требуется.
Raw
```json ⏎ { ⏎   "answer": "noyes", ⏎   "пояснение": "Функция password_needs_rehash возвращает true, если хэш был создан с использованием устаревшего алгоритма или низкой стоимости, и требуется перехэширование. В первом случае стоимость совпадает, поэтому перехэширование не требуется. Во втором случае стоимость увеличена, поэтому перехэширование требуется." ⏎ } ⏎ ```
верноpassword_needs_rehash сравнивает параметры хэша с целевыми: cost 4 = 4 → 'no', cost 5 ≠ 4 → 'yes'.
T12-L10
1.07 c
Конфигурация и безопасностьЧто выведет этот код на PHP 8.5? ```php echo (E_ALL & 2048) === 0 ? 'strict-out' : 'strict-in'; ```«strict-in»
Пояснение: E_ALL равен 33554432, побитовое И с 2048 равно 0, значит условие (E_ALL & 2048) === 0 истинно, выводится 'strict-in'.
Raw
```json ⏎ {"answer": "strict-in", "пояснение": "E_ALL равен 33554432, побитовое И с 2048 равно 0, значит условие (E_ALL & 2048) === 0 истинно, выводится 'strict-in'."} ⏎ ```
неверно
верный: «strict-out»
В PHP 8.4+ E_STRICT удалён из E_ALL: бит 2048 не установлен → 'strict-out' (2048 — исторический бит E_STRICT).
T13-L9
1.09 c
SymfonyЧто выведет этот код? ```php use Symfony\Component\HttpFoundation\Request; $r = Request::create('/demo', 'GET', [], [], [], ['HTTP_X_TOKEN' => 'abc']); echo $r->headers->get('X-Token') === 'abc' ? 'mapped' : 'missing'; ```«mapped»
Пояснение: Код создает объект Request Symfony, устанавливает HTTP-заголовок X-Token со значением 'abc', а затем проверяет, равен ли заголовок 'X-Token' значению 'abc', выводя 'mapped' в случае истинности.
Raw
```json ⏎ { ⏎   "answer": "mapped", ⏎   "пояснение": "Код создает объект Request Symfony, устанавливает HTTP-заголовок X-Token со значением 'abc', а затем проверяет, равен ли заголовок 'X-Token' значению 'abc', выводя 'mapped' в случае истинности." ⏎ } ⏎ ```
верноСравнение с литералом требует знания маппинга: HttpFoundation переводит HTTP_X_TOKEN в заголовок X-Token (регистр не важен); не знающий маппинг ответит 'missing'.
T13-L10
0.69 c
SymfonyЧто выведет этот код? ```php use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Contracts\EventDispatcher\Event; $d = new EventDispatcher(); $out = ''; $d->addListener('e', function () use (&$out) { $out .= 'B'; }, 10); $d->addListener('e', function () use (&$out) { $out .= 'A'; }); $d->addListener('e', function () use (&$out) { $out .= 'C'; }, 5); $d->dispatch(new Event(), 'e'); echo $out; ```«cab»
Пояснение: EventDispatcher вызывает слушателей событий по возрастанию приоритета, добавляя 'C', 'A', 'B' в строку $out.
Raw
```json ⏎ {"answer": "CAB", "пояснение": "EventDispatcher вызывает слушателей событий по возрастанию приоритета, добавляя 'C', 'A', 'B' в строку $out."} ⏎ ```
неверно
верный: «bca»
Порядок листенеров — по убыванию приоритета: 10 (B), 5 (C), 0 (A).
T14-L10
0.71 c
DoctrineДано: Doctrine ORM 3, EntityManager на SQLite in-memory, entity User с автоинкрементным первичным ключом. Таблица users пуста. Что выведет этот код? ```php $u = new User(name: 'A'); $em->persist($u); $em->flush(); $a = $em->find(User::class, $u->getId()); $b = $em->find(User::class, $u->getId()); echo spl_object_id($a) === spl_object_id($b) ? 'same' : 'diff'; ```«same»
Пояснение: Doctrine ORM по умолчанию использует identity map, поэтому поиск одного и того же объекта по ID вернет один и тот же экземпляр объекта.
Raw
```json ⏎ {"answer": "same", "пояснение": "Doctrine ORM по умолчанию использует identity map, поэтому поиск одного и того же объекта по ID вернет один и тот же экземпляр объекта."} ⏎ ```
верноIdentity map: повторный find того же id возвращает тот же инстанс.
T14-L9
0.93 c
DoctrineДано: Doctrine ORM 3, EntityManager на SQLite in-memory, entity User с автоинкрементным первичным ключом. Таблица users пуста. Что выведет этот код? ```php $u = new User(name: 'B'); $em->persist($u); $em->remove($u); $em->flush(); echo count($em->getConnection()->fetchAllAssociative('SELECT * FROM users')); ```«0»
Пояснение: Сначала сущность добавляется, потом удаляется, но изменения не применяются к базе данных до вызова flush(). После flush() сущность уже удалена, поэтому в таблице users ничего нет.
Raw
```json ⏎ { ⏎   "answer": 0, ⏎   "пояснение": "Сначала сущность добавляется, потом удаляется, но изменения не применяются к базе данных до вызова flush(). После flush() сущность уже удалена, поэтому в таблице users ничего нет." ⏎ } ⏎ ```
верноUnit of work откладывает INSERT до flush: remove после persist отменяет вставку.
T15-L10
0.61 c
PostgreSQLЧто вернёт этот SQL-запрос (PostgreSQL 17)? ```sql CREATE TEMP TABLE t (x int); INSERT INTO t VALUES (1), (NULL); SELECT count(x) FROM t; ```«1»
Пояснение: Функция COUNT() считает только не-NULL значения в указанном столбце.
Raw
```json ⏎ { ⏎   "answer": 1, ⏎   "пояснение": "Функция COUNT() считает только не-NULL значения в указанном столбце." ⏎ } ⏎ ```
верноcount(столбец) не считает NULL; count(*) считал бы 2.
T15-L9
0.89 c
PostgreSQLЧто вернёт этот SQL-запрос (PostgreSQL 17)? ```sql CREATE TEMP TABLE t (id int, x int); INSERT INTO t VALUES (1, 10), (2, 20), (3, 30); SELECT string_agg(s::text, ',' ORDER BY id) FROM ( SELECT id, sum(x) OVER (ORDER BY id) AS s FROM t ) q; ```«10,30,60»
Пояснение: Функция string_agg объединяет строки из подзапроса, разделяя их запятыми, а ORDER BY id сортирует их по id.
Raw
```json ⏎ { ⏎   "answer": "10,30,60", ⏎   "пояснение": "Функция string_agg объединяет строки из подзапроса, разделяя их запятыми, а ORDER BY id сортирует их по id." ⏎ } ⏎ ```
верноС ORDER BY кадр окна по умолчанию — running (от начала до текущей строки).
T16-L9
0.87 c
Symfony: MessengerЧто выведет этот код? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\StackInterface; use Symfony\Component\Messenger\Envelope; final class Trace implements MiddlewareInterface { public function __construct(private string $tag) {} public function handle(Envelope $e, StackInterface $stack): Envelope { echo $this->tag; return $stack->next()->handle($e, $stack); } } $bus = new MessageBus([new Trace('M1'), new Trace('M2')]); $bus->dispatch(new Envelope(new stdClass())); ```«m1m2»
Пояснение: Код выводит теги middleware 'M1' и 'M2' последовательно, так как middleware выполняются по порядку добавления в MessageBus.
Raw
```json ⏎ { ⏎   "answer": "M1M2", ⏎   "пояснение": "Код выводит теги middleware 'M1' и 'M2' последовательно, так как middleware выполняются по порядку добавления в MessageBus." ⏎ } ⏎ ```
верноПервым добавленный middleware выполняется первым (внешний).
T16-L10
1.09 c
Symfony: MessengerЧто выведет этот код? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; use Symfony\Component\Messenger\Handler\HandlersLocator; use Symfony\Component\Messenger\Handler\HandlerDescriptor; use Symfony\Component\Messenger\Envelope; class Ping {} $n = 0; $d1 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 1; }, ['alias' => 'h1']); $d2 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 10; }, ['alias' => 'h2']); $bus = new MessageBus([ new HandleMessageMiddleware(new HandlersLocator([Ping::class => [$d1, $d2]])), ]); $bus->dispatch(new Envelope(new Ping())); echo $n; ```«11»
Пояснение: Код создает MessageBus с двумя обработчиками для сообщения Ping, которые увеличивают переменную $n. Сначала вызывается h1, потом h2, в итоге $n увеличивается на 1 + 10 = 11.
Raw
```json ⏎ { ⏎   "answer": 11, ⏎   "пояснение": "Код создает MessageBus с двумя обработчиками для сообщения Ping, которые увеличивают переменную $n. Сначала вызывается h1, потом h2, в итоге $n увеличивается на 1 + 10 = 11." ⏎ } ⏎ ```
верноВсе зарегистрированные хендлеры сообщения вызываются: 1 + 10 = 11.
T17-L9
1.05 c
PostgreSQL: транзакции и индексыЧто вернёт этот SQL-запрос (PostgreSQL 17)? ```sql CREATE TEMP TABLE t (a int); CREATE UNIQUE INDEX ON t (a); INSERT INTO t VALUES (1) ON CONFLICT DO NOTHING; INSERT INTO t VALUES (1) ON CONFLICT DO NOTHING; SELECT count(*) FROM t; ```«1»
Пояснение: В таблицу `t` была вставлена одна строка со значением `a = 1`. Вторая попытка вставки была проигнорирована из-за уникального индекса и `ON CONFLICT DO NOTHING`. Таким образом, в таблице одна строка.
Raw
```json ⏎ {"answer": 1, "пояснение": "В таблицу `t` была вставлена одна строка со значением `a = 1`. Вторая попытка вставки была проигнорирована из-за уникального индекса и `ON CONFLICT DO NOTHING`. Таким образом, в таблице одна строка."} ⏎ ```
верноON CONFLICT DO NOTHING пропускает дубликат: вставка одна.
T17-L10
0.84 c
PostgreSQL: транзакции и индексыЧто выведет эта последовательность команд psql? ```sql BEGIN; CREATE TEMP TABLE t (a int, UNIQUE (a) DEFERRABLE INITIALLY DEFERRED); INSERT INTO t VALUES (1); INSERT INTO t VALUES (1); SELECT count(*) FROM t; ```«1»
Пояснение: Первая вставка пройдет успешно, вторая будет отклонена из-за уникального ограничения, транзакция останется активной, и запрос SELECT вернет 1.
Raw
```json ⏎ { ⏎   "answer": 1, ⏎   "пояснение": "Первая вставка пройдет успешно, вторая будет отклонена из-за уникального ограничения, транзакция останется активной, и запрос SELECT вернет 1." ⏎ } ⏎ ```
неверно
верный: «2»
DEFERRED откладывает проверку уникальности до COMMIT — count видит 2 строки.
T18-L9
2.28 c
Тестирование: PHPUnitСколько тестов выполнит эта команда? ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class CalcTest extends TestCase { public static function prov(): array { return [[1], [2], [3]]; } #[DataProvider('prov')] public function test_sum(int $x): void { $this->assertTrue($x > 0); } #[DataProvider('prov')] public function test_sum_abs(int $x): void { $this->assertTrue($x > 0); } public function test_other(): void { $this->assertTrue(true); } } ``` Команда: `phpunit CalcTest.php --filter test_sum` (PHPUnit 10.5)«6»
Пояснение: Команда `phpunit CalcTest.php --filter test_sum` выполнит все тесты, имя которых содержит 'test_sum'. Функция `prov()` предоставляет данные для двух тестов `test_sum` и `test_sum_abs`. Каждый из этих тестов запускается для каждого элемента, возвращаемого `prov()`. Поскольку `prov()` возвращает 3 элемента, то `test_sum` будет выполнен 3 раза, а `test_sum_abs` тоже 3 раза. Общее количество выполненных тестов, соответствующих фильтру, равно 3 (для test_sum) + 3 (для test_sum_abs) = 6.
Raw
```json ⏎ { ⏎   "answer": 6, ⏎   "пояснение": "Команда `phpunit CalcTest.php --filter test_sum` выполнит все тесты, имя которых содержит 'test_sum'.  Функция `prov()` предоставляет данные для двух тестов `test_sum` и `test_sum_abs`. Каждый из этих тестов запускается для каждого элемента, возвращаемого `prov()`.  Поскольку `prov()` возвращает 3 элемента, то `test_sum` будет выполнен 3 раза, а `test_sum_abs` тоже 3 раза.  Общее количество выполненных тестов, соответствующих фильтру, равно 3 (для test_sum) + 3 (для test_sum_abs) = 6." ⏎ } ⏎ ```
верно--filter — подстрочное совпадение: test_sum ловит и test_sum_abs (3+3 датасета).
T18-L10
0.85 c
Тестирование: PHPUnitСколько тестов выполнит эта команда и сколько из них завершится failure? Ответь двумя числами через запятую (выполнено, упало). ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class Calc2Test extends TestCase { public function prov(): array { return [[1], [-1]]; } #[DataProvider('prov')] public function test_x(int $x): void { $this->assertTrue($x > 0); } } ``` Команда: `phpunit Calc2Test.php` (PHPUnit 10.5)«2,1»
Пояснение: Тест выполнит 2 итерации, одна из которых завершится с ошибкой, так как assert вернёт false для отрицательного числа.
Raw
```json ⏎ { ⏎   "answer": "2,1", ⏎   "пояснение": "Тест выполнит 2 итерации, одна из которых завершится с ошибкой, так как assert вернёт false для отрицательного числа." ⏎ } ⏎ ```
верноНе-static провайдер — только deprecation в PHPUnit 10: оба датасета выполнятся, датасет [-1] валит assert — 2 выполнено, 1 failure.
T19-L9
0.61 c
HTTP и REST APIКакой HTTP-метод отправит эта команда? ```bash curl -s -d 'a=1' http://demo.local/api ```«post»
Пояснение: Флаг `-d` указывает на передачу данных в теле запроса, что характерно для метода POST.
Raw
```json ⏎ {"answer": "POST", "пояснение": "Флаг `-d` указывает на передачу данных в теле запроса, что характерно для метода POST."} ⏎ ```
верно-d/-F переключает curl на POST по умолчанию.
T19-L10
0.77 c
HTTP и REST APIКакой HTTP-метод отправит эта команда? ```bash curl -s -G -d 'a=1' http://demo.local/api ```«get»
Пояснение: Флаг -G указывает curl использовать метод GET, а -d передает данные запроса, которые будут добавлены к URL в виде query parameters.
Raw
```json ⏎ { ⏎   "answer": "GET", ⏎   "пояснение": "Флаг -G указывает curl использовать метод GET, а -d передает данные запроса, которые будут добавлены к URL в виде query parameters." ⏎ } ⏎ ```
верно-G превращает данные из -d в query string, метод остаётся GET.
T20-L9
0.87 c
Безопасность и OAuthКлиент обращается к токен-эндпоинту (RFC 6749) с несуществующим client_id. Какое значение поля error вернёт эндпоинт?«invalid_client»
Пояснение: В соответствии с RFC 6749, при использовании несуществующего client_id, сервер OAuth 2.0 должен вернуть код ошибки `invalid_client`.
Raw
```json ⏎ { ⏎   "answer": "invalid_client", ⏎   "пояснение": "В соответствии с RFC 6749, при использовании несуществующего client_id, сервер OAuth 2.0 должен вернуть код ошибки `invalid_client`." ⏎ } ⏎ ```
верноНеизвестный клиент → invalid_client (RFC 6749 §5.2).
T20-L10
0.71 c
Безопасность и OAuthOAuth 2.0: клиент начал поток с response_type=token. В какой части redirect_uri авторизационный сервер передаёт access_token?«fragment»
Пояснение: В потоке response_type=token, access_token передается в части fragment (после #) redirect_uri.
Raw
```json ⏎ { ⏎   "answer": "fragment", ⏎   "пояснение": "В потоке response_type=token, access_token передается в части fragment (после #) redirect_uri." ⏎ } ⏎ ```
верноImplicit-поток передаёт токен в фрагменте URL (#) — он не уходит на сервер.
T21-L9
0.64 c
TwigЧто выведет этот шаблон Twig? ```twig {{ false|default(2) * 3 }} ```«6»
Пояснение: Фильтр `default` заменяет `false` на `2`, затем результат умножается на `3`.
Raw
```json ⏎ {"answer": 6, "пояснение": "Фильтр `default` заменяет `false` на `2`, затем результат умножается на `3`."} ⏎ ```
верноdefault заменяет exactly false/null/''/[] — false подменится на 2, 2*3 = 6; наивное «default только для undefined» даёт 0.
T21-L10
1.41 c
TwigКакой класс исключения выбросит render() этого шаблона? ```twig {{ 'a' ~ 1 + 2 }} ```«нет»
Пояснение: Выражение 'a' ~ 1 + 2 приведет к ошибке, потому что Twig не может автоматически преобразовывать нестроковые значения (числа) в строки для конкатенации со строкой 'a'. Twig ожидает, что оба операнда для оператора ~ будут строками или значениями, которые могут быть преобразованы в строки.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Выражение 'a' ~ 1 + 2 приведет к ошибке, потому что Twig не может автоматически преобразовывать нестроковые значения (числа) в строки для конкатенации со строкой 'a'.  Twig ожидает, что оба операнда для оператора ~ будут строками или значениями, которые могут быть преобразованы в строки." ⏎ } ⏎ ```
неверно
верный: «runtimeerror»
В Twig ~ связывает крепче +: ('a' ~ 1) + 2 → string + int → ошибка рендера (RuntimeError).
T22-L9
0.8 c
Symfony: Security и формыЧто выведет этот код? ```php use Symfony\Component\Validator\Validation; use Symfony\Component\Validator\Constraints as Assert; $v = Validation::createValidator(); echo count($v->validate([''], [new Assert\NotBlank()])); ```«1»
Пояснение: Выражение `['']` содержит пустую строку, которая нарушает ограничение `NotBlank()`. Поэтому валидатор возвращает один объект ошибки.
Raw
```json ⏎ { ⏎   "answer": 1, ⏎   "пояснение": "Выражение `['']` содержит пустую строку, которая нарушает ограничение `NotBlank()`. Поэтому валидатор возвращает один объект ошибки." ⏎ } ⏎ ```
неверно
верный: «0»
NotBlank считает пустым null, '', [] — массив [''] не пуст.
T22-L10
0.72 c
Symfony: Security и формыЧто выведет этот код? ```php use Symfony\Component\Form\Forms; use Symfony\Component\Form\Extension\Core\Type\TextType; $factory = Forms::createFormFactoryBuilder()->getFormFactory(); $form = $factory->create(TextType::class); try { echo $form->isValid() ? 'valid' : 'invalid'; } catch (Throwable $e) { echo get_class($e); } ```«invalid»
Пояснение: Форма создается, но не имеет данных и не проходит валидацию по умолчанию, поэтому isValid() возвращает false.
Raw
```json ⏎ { ⏎   "answer": "invalid", ⏎   "пояснение": "Форма создается, но не имеет данных и не проходит валидацию по умолчанию, поэтому isValid() возвращает false." ⏎ } ⏎ ```
неверно
верный: «symfony\component\form\exception\logicexception»
isValid() на неотправленной форме — LogicException, не false.
T23-L9
0.9 c
Symfony: конфигурация и сервисыЧто выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->register('a', stdClass::class)->setPublic(true); $c->compile(); echo spl_object_id($c->get('a')) === spl_object_id($c->get('a')) ? 'same' : 'diff'; ```«same»
Пояснение: `ContainerBuilder` создает один экземпляр объекта `stdClass` и кэширует его, поэтому оба вызова `get('a')` возвращают один и тот же объект.
Raw
```json ⏎ { ⏎   "answer": "same", ⏎   "пояснение": "`ContainerBuilder` создает один экземпляр объекта `stdClass` и кэширует его, поэтому оба вызова `get('a')` возвращают один и тот же объект." ⏎ } ⏎ ```
верноСервисы в контейнере общие (shared): get() дважды — один инстанс.
T23-L10
0.92 c
Symfony: конфигурация и сервисыЧто выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->setParameter('name', 'Bob'); $c->setParameter('greeting', 'hi %name%'); $c->setParameter('message', '%greeting%!'); $c->compile(); echo $c->getParameter('message'); ```«hi bob!»
Пояснение: Код использует систему параметров Symfony, чтобы заменить %name% значением 'Bob' в параметре 'greeting', а затем заменить %greeting% значением 'hi Bob' в параметре 'message'.
Raw
```json ⏎ { ⏎   "answer": "hi Bob!", ⏎   "пояснение": "Код использует систему параметров Symfony, чтобы заменить %name% значением 'Bob' в параметре 'greeting', а затем заменить %greeting% значением 'hi Bob' в параметре 'message'." ⏎ } ⏎ ```
верноcompile() резолвит %-ссылки транзитивно: %greeting% → 'hi %name%' → 'hi Bob!', ответ собирается из двух шагов.
T24-L9
1.02 c
BootstrapКакая max-width у .container в Bootstrap 5.3 при ширине окна 992px?«960»
Пояснение: В Bootstrap 5.3, класс .container имеет фиксированную максимальную ширину 960px для средних экранов (md) и выше, что соответствует ширине окна 992px и больше.
Raw
```json ⏎ { ⏎   "answer": 960, ⏎   "пояснение": "В Bootstrap 5.3, класс .container имеет фиксированную максимальную ширину 960px для средних экранов (md) и выше, что соответствует ширине окна 992px и больше." ⏎ } ⏎ ```
верноContainer-ширины 5.x: 540/720/960/1140/1320 (sm–xxl); 992 → 960px.
T24-L10
0.96 c
BootstrapКакая утилита определит цвет текста в Bootstrap 5.3: `<p class="text-danger text-primary">…</p>`? Ответь именем класса-победителя.«text-danger»
Пояснение: В Bootstrap 5.3 классы имеют каскадность, и последний определенный класс переопределяет предыдущие, поэтому `text-danger` будет иметь приоритет над `text-primary`.
Raw
```json ⏎ { ⏎   "answer": "text-danger", ⏎   "пояснение": "В Bootstrap 5.3 классы имеют каскадность, и последний определенный класс переопределяет предыдущие, поэтому `text-danger` будет иметь приоритет над `text-primary`." ⏎ } ⏎ ```
верноСпецифичность равна — победит правило позже в css: text-danger объявлен после text-primary.
T25-L9
0.77 c
Чистая архитектураСлои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class OrderService { public function __construct( private PlaceOrder $handler, private Db $db, ) {} } ```«2»
Пояснение: Класс OrderService в слое Domain зависит от Application (PlaceOrder) и Infrastructure (Db), что нарушает правила deptrac.
Raw
```json ⏎ { ⏎   "answer": 2, ⏎   "пояснение": "Класс OrderService в слое Domain зависит от Application (PlaceOrder) и Infrastructure (Db), что нарушает правила deptrac." ⏎ } ⏎ ```
верноDomain может зависеть только от Domain: PlaceOrder (Application) + Db (Infrastructure) = 2.
T25-L10
0.82 c
Чистая архитектураСлои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class BillingService { public function __construct( private PlaceOrder $handler, private Db $db, private \App\Infrastructure\Logger $logger, ) {} } ```«2»
Пояснение: Класс BillingService находится в слое Application, но зависит от Infrastructure (Db, Logger) и Application (PlaceOrder), что нарушает правила deptrac.
Raw
```json ⏎ { ⏎   "answer": 2, ⏎   "пояснение": "Класс BillingService находится в слое Application, но зависит от Infrastructure (Db, Logger) и Application (PlaceOrder), что нарушает правила deptrac." ⏎ } ⏎ ```
неверно
верный: «3»
Inline-FQCN \App\Infrastructure\Logger тоже считается: Application + Db + Logger = 3.
T26-L10
0.82 c
DDDЧто выведет этот код? ```php final class Money { public function __construct(public readonly int $amount) {} public function add(Money $o): Money { return new self($this->amount + $o->amount); } } $a = new Money(10); $c = $a->add(new Money(5)); echo $a->amount . ',' . $c->amount; ```«10,15»
Пояснение: Код создает два объекта Money, складывает их суммы и выводит исходную сумму первого объекта и сумму результирующего объекта.
Raw
```json ⏎ { ⏎   "answer": "10,15", ⏎   "пояснение": "Код создает два объекта Money, складывает их суммы и выводит исходную сумму первого объекта и сумму результирующего объекта." ⏎ } ⏎ ```
верноVO иммутабелен: add() возвращает новый инстанс, исходный не меняется.
T26-L9
0.8 c
DDDЧто выведет этот код? ```php final class Order { private array $items = []; public function add(string $sku): void { $this->items[$sku] = true; } public function count(): int { return count($this->items); } public function remove(string $sku): void { if (count($this->items) === 1) { throw new DomainException('last item'); } unset($this->items[$sku]); } } $o = new Order; $o->add('a'); try { $o->remove('a'); } catch (DomainException) { } echo $o->count(); ```«0»
Пояснение: После добавления элемента 'a' и его последующего удаления, массив $items становится пустым, и метод count() возвращает 0.
Raw
```json ⏎ { ⏎   "answer": 0, ⏎   "пояснение": "После добавления элемента 'a' и его последующего удаления, массив $items становится пустым, и метод count() возвращает 0." ⏎ } ⏎ ```
неверно
верный: «1»
Сорванный remove не меняет состояние агрегата: инвариант бросил исключение до unset — count остался 1.
VC-L9
3.01 c
PHP 8.4–8.5Что выведет этот код на PHP 8.5? ```php class C { public function hi(): string { return 'hi'; } } echo new C()->hi(); ```«hi»
Пояснение: Код создает экземпляр класса C и вызывает метод hi(), который возвращает строку 'hi'. Эта строка затем выводится функцией echo.
Raw
```json ⏎ {"answer": "hi", "пояснение": "Код создает экземпляр класса C и вызывает метод hi(), который возвращает строку 'hi'. Эта строка затем выводится функцией echo."} ⏎ ```
верноС 8.4 new в цепочке методов вызывается без обрамляющих скобок.
VC-L10
3.35 c
PHP 8.4–8.5Что выведет этот код на PHP 8.5? ```php class Heavy { public int $v = 0; } $r = new ReflectionClass(Heavy::class); $o = $r->newLazyGhost(function (Heavy $obj) { $obj->v = 21; }); echo $r->isUninitializedLazyObject($o) ? 'yes' : 'no'; $o->v; echo $r->isUninitializedLazyObject($o) ? 'yes' : 'no'; ```«noyes»
Пояснение: Сначала объект $o помечен как неинициализированный, затем при обращении к свойству $o->v происходит инициализация, и он становится инициализированным.
Raw
```json ⏎ { ⏎   "answer": "noyes", ⏎   "пояснение": "Сначала объект $o помечен как неинициализированный, затем при обращении к свойству $o->v происходит инициализация, и он становится инициализированным." ⏎ } ⏎ ```
неверно
верный: «yesno»
newLazyGhost (8.4): объект ленив, пока к нему не обратились — чтение свойства инициализирует и снимает флаг.
T28-L9
0.68 c
Symfony: версииПроект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Security\Guard\AbstractGuardAuthenticator::class) ? 'yes' : 'no'; ```«yes»
Пояснение: Класс \Symfony\Component\Security\Guard\AbstractGuardAuthenticator существует в Symfony 8.1.
Raw
```json ⏎ { ⏎   "answer": "yes", ⏎   "пояснение": "Класс \\Symfony\\Component\\Security\\Guard\\AbstractGuardAuthenticator существует в Symfony 8.1." ⏎ } ⏎ ```
неверно
верный: «no»
Guard-аутентификация удалена в Symfony 7.0 — класса в 8.1 нет.
T28-L10
0.54 c
Symfony: версииПроект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Routing\Loader\AnnotationClassLoader::class) ? 'yes' : 'no'; echo class_exists(\Symfony\Component\Routing\Loader\AttributeClassLoader::class) ? 'yes' : 'no'; ```«yesyes»
Пояснение: Оба класса существуют в Symfony 8.1.
Raw
```json ⏎ { ⏎   "answer": "yesyes", ⏎   "пояснение": "Оба класса существуют в Symfony 8.1." ⏎ } ⏎ ```
неверно
верный: «noyes»
Аннотационные лоадеры удалены в 7.0, остались атрибутные (Annotation→Attribute).