Карта знаний PHP — gemma4:e2b, run-05 · think: off

Оценка: PHP 78.1% · PHP+версии 68.8% · Symfony 65.6% · Symfony+версии 62.5% · БД и ORM 75.0% · Архитектура 56.2% · Фронтенд 68.8% · HTTP 100.0% · Безопасность 87.5% · Тесты 75.0% · Глубина 37.5% · Всего 69.2%
Разобрано JSON: 99.3% (294 из 296)
По зонам: База 74.5% · PHP 8.4–8.5 25.0% · Будущее 43.8% · Глубина 37.5%
Точность: 166 / 240 (+ глубина 21 / 56)
Разобрано ответов: 296 / 240 (не по JSON-формату: 2 · без вердикта: -56)
Ответов «да»: 43.4% (баланс вопросника 50/50, базлайн константного ответа — 50%)
Время: 45 c (0.11 c на клетку — медиана)
Цена: $0.005
Токены: 42259 вх / 14708 вых (кэш: 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); ```
Модель: «-4 -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?
Модель: «10»
Верный ответ: 10
T02-L7 · Типы и сравнения
При приведении к строке значение false превращается в "0".
Модель: «нет»
Верный ответ: нет
T02-L8 · Типы и сравнения
Сравнение 0.1 + 0.2 === 0.3 возвращает false.
Модель: «да»
Верный ответ: да
T02-L9 · Типы и сравнения
Что выведет этот код? ```php echo '1e1' == '10' ? 'true' : 'false'; ```
Модель: «false»
Верный ответ: true
T02-L10 · Типы и сравнения
Что выведет этот код? ```php switch ('a') { case 0: echo 'zero'; break; default: echo 'other'; } ```
Модель: «other»
Верный ответ: other
8/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']); ```
Модель: «1»
Верный ответ: 2c
T03-L10 · Строки
Что выведет этот код? ```php echo '[' . substr('hello', -10) . ']'; ```
Модель: «['h']»
Верный ответ: [hello]
6/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)); ```
Модель: «xyz»
Верный ответ: yxz
8/10
Функции и замыкания
T05-L1 · Функции и замыкания
Именованные аргументы нельзя комбинировать с распаковкой массива ...$args в одном вызове.
Модель: «нет»
Верный ответ: нет
T05-L2 · Функции и замыкания
Анонимная функция без use видит переменные внешней области видимости.
Модель: «нет»
Верный ответ: нет
T05-L3 · Функции и замыкания
Что вернёт func_num_args() внутри function f($a) { return func_num_args(); } при вызове f(1, 2, 3)?
Модель: «3»
Верный ответ: 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();
Модель: «7»
Верный ответ: 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(); ```
Модель: «fatal error: call to a member function on null»
Верный ответ: 3
T05-L10 · Функции и замыкания
Что выведет этот код? ```php function f(int $a, int $b): int { return $a - $b; } echo f(...['b' => 1, 'a' => 5]); ```
Модель: «syntaxerror»
Верный ответ: 4
6/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 {})? Ответь частью имени до нулевого байта (без пути к файлу).
Модель: «class»
Верный ответ: 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
7/10
Интерфейсы, трейты, enum
T07-L1 · Интерфейсы, трейты, enum
Интерфейс может объявлять константы.
Модель: «да»
Верный ответ: да
T07-L2 · Интерфейсы, трейты, enum
Какой оператор проверяет, что объект реализует класс или интерфейс?
Модель: «да»
Верный ответ: 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
7/10
Исключения и ошибки
T08-L1 · Исключения и ошибки
Интерфейс Throwable — общий предок и для Exception, и для Error.
Модель: «да»
Верный ответ: да
T08-L2 · Исключения и ошибки
Блок catch (Exception $e) перехватит и TypeError, потому что TypeError в итоге наследуется от Exception.
Модель: «нет»
Верный ответ: нет
T08-L3 · Исключения и ошибки
Оператор @ подавляет и исключения тоже.
Модель: «нет»
Верный ответ: нет
T08-L4 · Исключения и ошибки
Какой класс ошибки бросит intdiv(5, 0)?
Модель: «divisionbyzeroerror»
Верный ответ: divisionbyzeroerror
T08-L5 · Исключения и ошибки
Блок finally выполняется только если исключение было поймано блоком catch.
Модель: «нет»
Верный ответ: нет
T08-L6 · Исключения и ошибки
Исключение, выброшенное внутри блока finally, никак не влияет на результат try-блока.
Модель: «нет»
Верный ответ: нет
T08-L7 · Исключения и ошибки
Что вернёт выражение: (bool) new Exception('x')?
Модель: «true»
Верный ответ: 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
9/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\app\foo|n\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'); ```
Модель: «no»
Верный ответ: noyes
7/10
Ссылки и область видимости
T10-L1 · Ссылки и область видимости
Массивы при присваивании копируются, а не передаются по ссылке.
Модель: «да»
Верный ответ: да
T10-L2 · Ссылки и область видимости
Что выведет: $a = [1, 2]; $b = $a; $b[] = 3; echo count($a);
Модель: «2»
Верный ответ: 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,3»
Верный ответ: 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
7/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; }?
Модель: «string»
Верный ответ: 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
6/10
Конфигурация и безопасность
T12-L1 · Конфигурация и безопасность
password_hash() генерирует соль автоматически — передавать её отдельно не нужно.
Модель: «да»
Верный ответ: да
T12-L2 · Конфигурация и безопасность
Алгоритм PASSWORD_DEFAULT в PHP 8 — это md5 с автоматически добавленной солью.
Модель: «нет»
Верный ответ: нет
T12-L3 · Конфигурация и безопасность
Что вернёт password_verify('secret', password_hash('secret', PASSWORD_DEFAULT))?
Модель: «1»
Верный ответ: 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'; ```
Модель: «no»
Верный ответ: noyes
T12-L10 · Конфигурация и безопасность
Что выведет этот код на PHP 8.5? ```php echo (E_ALL & 2048) === 0 ? 'strict-out' : 'strict-in'; ```
Модель: «strict-out»
Верный ответ: strict-out
7/10
PHP 8.4–8.5
VC-L1 · PHP 8.4–8.5
В какой версии PHP появилась функция array_find()?
Модель: «5.3.0»
Верный ответ: 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.0»
Верный ответ: 8.5
VC-L5 · PHP 8.4–8.5
В какой версии PHP впервые появился оператор конвейера |> (pipe)? Ответь номером версии.
Модель: «7.4»
Верный ответ: 8.5
VC-L6 · PHP 8.4–8.5
В какой версии PHP появился clone-with — синтаксис clone($obj, ['x' => 1])? Ответь номером версии.
Модель: «7.0»
Верный ответ: 8.5
VC-L7 · PHP 8.4–8.5
В какой версии PHP появились функции array_first() и array_last()?
Модель: «5.3.0»
Верный ответ: 8.5
VC-L8 · PHP 8.4–8.5
Для какой версии PHP был принят RFC Partial Function Application v2 (по состоянию на 07.11.2026)? Ответь номером версии.
Модель: «8.0»
Верный ответ: 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'; ```
Модель: «no»
Верный ответ: yesno
1/10
PHP: 8.6+ и будущее
VF-L1 · PHP: 8.6+ и будущее
Для какой версии PHP реализован RFC clamp_v2 (функция clamp()) по состоянию на 07.11.2026? Ответь номером версии.
Модель: «7.4»
Верный ответ: 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] в ядро был принят.
Модель: «нет»
Верный ответ: да
2/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 · Чистая архитектура
Как называется компонент, предоставляющий коллекцию агрегатов/сущностей, скрывая механизм хранения за интерфейсом?
Модель: «collection»
Верный ответ: репозиторий
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, ) {} } ```
Модель: «1»
Верный ответ: 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, ) {} } ```
Модель: «1»
Верный ответ: 3
4/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; ```
Модель: «15,15»
Верный ответ: 10,15
5/10
Symfony
T13-L1 · Symfony
Сервисы в DI-контейнере Symfony по умолчанию создаются лениво — при первом обращении к ним.
Модель: «да»
Верный ответ: да
T13-L2 · Symfony
Какая консольная команда Symfony выводит список всех зарегистрированных маршрутов?
Модель: «php bin/console route:list»
Верный ответ: 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; ```
Модель: «abc»
Верный ответ: bca
8/10
Symfony: Security и формы
T22-L1 · Symfony: Security и формы
В современном Symfony (6.0+) аутентификация строится на классах-authenticator (AuthenticatorInterface); прежняя система guard удалена.
Модель: «да»
Верный ответ: да
T22-L2 · Symfony: Security и формы
Какой атрибут Symfony проверяет роль/право прямо на методе контроллера (без него — 403)?
Модель: «#[isgranted('role_name')]»
Верный ответ: 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)?
Модель: «formtype»
Верный ответ: 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 выводит зарегистрированные сервисы контейнера и их алиасы?
Модель: «php bin/console cache:clear»
Верный ответ: 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_env»
Верный ответ: 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!
6/10
Symfony: Messenger
T16-L1 · Symfony: Messenger
Одно сообщение в Symfony Messenger может обрабатывать только один обработчик (handler).
Модель: «да»
Верный ответ: нет
T16-L2 · Symfony: Messenger
Транспорт sync в Messenger ставит сообщение в очередь и обрабатывает его воркером, как и async.
Модель: «да»
Верный ответ: нет
T16-L3 · Symfony: Messenger
Какой консольной командой запускается воркер, обрабатывающий сообщения из очередей Messenger?
Модель: «php messenger:consume»
Верный ответ: 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; ```
Модель: «10»
Верный ответ: 11
5/10
Symfony: версии
T28-L1 · Symfony: версии
Мажорные релизы Symfony выходят раз в два года, минорные — каждые шесть месяцев (в мае и ноябре).
Модель: «нет»
Верный ответ: да
T28-L2 · Symfony: версии
Какой минимальной версии PHP требует Symfony 8?
Модель: «8.0»
Верный ответ: 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?
Модель: «assetmanager»
Верный ответ: 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'; ```
Модель: «no»
Верный ответ: noyes
4/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)?
Модель: «9.0»
Верный ответ: 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?
Модель: «8.4»
Верный ответ: 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.
Модель: «да»
Верный ответ: да
5/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 выводит отладочную структуру переменной (массива, объекта)?
Модель: «true»
Верный ответ: 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?
Модель: «720px»
Верный ответ: 960
T24-L10 · Bootstrap
Какая утилита определит цвет текста в Bootstrap 5.3: `<p class="text-danger text-primary">…</p>`? Ответь именем класса-победителя.
Модель: «text-danger, text-primary»
Верный ответ: text-danger
6/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»
Верный ответ: 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-функции разбивает строки на группы, для которых считается функция?
Модель: «array_filter»
Верный ответ: 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,50»
Верный ответ: 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; ```
Модель: «2»
Верный ответ: 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; ```
Модель: «2»
Верный ответ: 2
7/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 ```
Модель: «post»
Верный ответ: 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 вернёт эндпоинт?
Модель: «401 unauthorized»
Верный ответ: invalid_client
T20-L10 · Безопасность и OAuth
OAuth 2.0: клиент начал поток с response_type=token. В какой части redirect_uri авторизационный сервер передаёт access_token?
Модель: «redirect_uri»
Верный ответ: fragment
7/10
Тестирование: PHPUnit
T18-L1 · Тестирование: PHPUnit
PHPUnit выполняет тестовые методы любого класса — наследовать TestCase не обязательно.
Модель: «нет»
Верный ответ: нет
T18-L2 · Тестирование: PHPUnit
Метод setUp() в PHPUnit вызывается один раз перед всеми тестами класса.
Модель: «да»
Верный ответ: нет
T18-L3 · Тестирование: PHPUnit
Поставщик данных (data provider) позволяет прогнать тест ровно с одним набором аргументов.
Модель: «нет»
Верный ответ: нет
T18-L4 · Тестирование: PHPUnit
Какой метод PHPUnit объявляет ожидание исключения определённого класса?
Модель: «expectexception(\app\exception\specificexception::class)»
Верный ответ: expectexception
T18-L5 · Тестирование: PHPUnit
В PHPUnit стаб (stub) проверяет, какие методы на нём вызывали, а мок (mock) только подставляет данные.
Модель: «нет»
Верный ответ: нет
T18-L6 · Тестирование: PHPUnit
В PHPUnit 10+ рекомендуемый способ передачи данных в тест — атрибут #[DataProvider] (аннотация @dataProvider устарела).
Модель: «да»
Верный ответ: да
T18-L7 · Тестирование: PHPUnit
В PHPUnit нельзя объявить зависимость одного теста от результата другого.
Модель: «нет»
Верный ответ: нет
T18-L8 · Тестирование: PHPUnit
Какая опция командной строки PHPUnit включает случайный порядок выполнения тестов?
Модель: «random»
Верный ответ: --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)
Модель: «1»
Верный ответ: 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,0»
Верный ответ: 2,1
6/10

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

КлеткаТемаУтверждениеОтвет РезультатОбоснование
T01-L1
2.79 c
Синтаксис и операторыСтроки в двойных и одинарных кавычках обрабатываются одинаково, разница только в скорости.«нет»
Пояснение: Строки в одинарных и двойных кавычках обрабатываются по-разному, особенно в отношении экранирования символов.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Строки в одинарных и двойных кавычках обрабатываются по-разному, особенно в отношении экранирования символов." ⏎ } ⏎ ```
верноВ двойных кавычках работают интерполяция переменных и escape-последовательности, в одинарных — нет.
T01-L2
0.1 c
Синтаксис и операторыОператор ?? работает по семантике isset и не порождает предупреждений для неопределённых переменных.«да»
Пояснение: Оператор null coalescing (??) работает по семантике isset и не вызывает предупреждений для неопределенных переменных.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Оператор null coalescing (??) работает по семантике isset и не вызывает предупреждений для неопределенных переменных." ⏎ } ⏎ ```
верно?? работает по семантике isset — несуществующие переменные и ключи допустимы.
T01-L3
0.09 c
Синтаксис и операторыЧто выведет: echo 'a', 'b';«ab»
Пояснение: Оператор echo объединяет строки и выводит их последовательно.
Raw
```json ⏎ { ⏎   "answer": "ab", ⏎   "пояснение": "Оператор echo объединяет строки и выводит их последовательно." ⏎ } ⏎ ```
верноecho принимает список аргументов: ab.
T01-L4
0.11 c
Синтаксис и операторыprint возвращает значение 1 и может использоваться внутри выражения.«нет»
Пояснение: print() в PHP не возвращает значение; оно используется для вывода данных.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "print() в PHP не возвращает значение; оно используется для вывода данных." ⏎ } ⏎ ```
неверно
верный: «да»
print — выражение со значением 1, в отличие от echo, который значения не возвращает.
T01-L5
0.11 c
Синтаксис и операторыОператор ?: (элвис) возвращает левый операнд, если он ложный.«нет»
Пояснение: Оператор ?: возвращает левый операнд, если выражение перед ним истинно (true), а не ложно (false).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Оператор ?: возвращает левый операнд, если выражение перед ним истинно (true), а не ложно (false)." ⏎ } ⏎ ```
верноНаоборот: $a ?: $b возвращает $a, если он истинный, иначе $b.
T01-L6
0.11 c
Синтаксис и операторыВ PHP 8 приоритет оператора конкатенации (.) ниже, чем у сложения и вычитания.«да»
Пояснение: В PHP операторы арифметических операций (сложение, вычитание) имеют более высокий приоритет, чем оператор конкатенации.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В PHP операторы арифметических операций (сложение, вычитание) имеют более высокий приоритет, чем оператор конкатенации." ⏎ } ⏎ ```
верноС PHP 8 (RFC concat precedence) '.' имеет приоритет ниже арифметики: 'сумма: ' . 2 + 3 → 'сумма: 5' (в PHP 7 было иначе).
T01-L7
0.15 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.1 c
Синтаксис и операторыКакую строку выведет: echo 'сумма: ' . 2 + 3; (PHP 8)?«5»
Пояснение: Операция сложения выполняется перед конкатенацией, результат равен 5.
Raw
```json ⏎ { ⏎   "answer": "5", ⏎   "пояснение": "Операция сложения выполняется перед конкатенацией, результат равен 5." ⏎ } ⏎ ```
неверно
верный: «сумма: 5»
Парная к verify-клетке про приоритет: 'сумма: 5'.
T02-L1
0.11 c
Типы и сравненияМассивы при строгом сравнении === считаются равными независимо от порядка элементов.«нет»
Пояснение: Массивы при строгом сравнении (===) считаются равными, только если они имеют одинаковый порядок элементов и одинаковые значения по каждой позиции.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Массивы при строгом сравнении (===) считаются равными, только если они имеют одинаковый порядок элементов и одинаковые значения по каждой позиции." ⏎ } ⏎ ```
верно=== для массивов требует совпадения и значений, и их порядка.
T02-L2
0.17 c
Типы и сравненияСравнение 0 == false возвращает false, потому что это строгое сравнение.«да»
Пояснение: В PHP строковое сравнение (===) требует совпадения типа и значения, поэтому 0 (целое число) не равно false (булево значение), и результат будет false.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В PHP строковое сравнение (===) требует совпадения типа и значения, поэтому 0 (целое число) не равно false (булево значение), и результат будет false." ⏎ } ⏎ ```
неверно
верный: «нет»
Наоборот: == — нестрогое сравнение и возвращает true; строгое — это === (0 === false → false).
T02-L3
0.09 c
Типы и сравненияВ PHP 8 выражение "abc" == 0 возвращает true.«нет»
Пояснение: В PHP сравнение строки 'abc' с числом 0 возвращает false.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В PHP сравнение строки 'abc' с числом 0 возвращает false." ⏎ } ⏎ ```
верноС PHP 8 нечисловая строка сравнивается как строка: "abc" == "0" → false (в PHP 7 было true).
T02-L4
0.12 c
Типы и сравненияЗначение null при нестрогом сравнении равно одновременно 0, пустой строке и false.«да»
Пояснение: В нестрогом сравнении (==) в PHP значение null равно 0, пустой строке и false.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В нестрогом сравнении (==) в PHP значение null равно 0, пустой строке и false." ⏎ } ⏎ ```
верноnull == 0, null == "" и null == false — все true.
T02-L5
0.13 c
Типы и сравненияЧто вернёт выражение: (int) '42abc'?«42»
Пояснение: При приведении строки к целому типу, PHP обрезает все символы после первого найденного цифры.
Raw
```json ⏎ { ⏎   "answer": "42", ⏎   "пояснение": "При приведении строки к целому типу, PHP обрезает все символы после первого найденного цифры." ⏎ } ⏎ ```
верноВедущая числовая часть: 42, без ошибок и warning.
T02-L6
0.14 c
Типы и сравненияЧто вернёт выражение: '5' + 5?«10»
Пояснение: В PHP, при операторе '+' с одним числом и одной строкой, строка преобразуется в число для выполнения арифметической операции.
Raw
```json ⏎ { ⏎   "answer": "10", ⏎   "пояснение": "В PHP, при операторе '+' с одним числом и одной строкой, строка преобразуется в число для выполнения арифметической операции." ⏎ } ⏎ ```
верноЧисловая строка приводится: int 10.
T02-L7
0.15 c
Типы и сравненияПри приведении к строке значение false превращается в "0".«нет»
Пояснение: При приведении к строке значение false превращается в строку '0', но это не общее правило, а специфичное поведение при явном преобразовании в некоторые контекстах.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "При приведении к строке значение false превращается в строку '0', но это не общее правило, а специфичное поведение при явном преобразовании в некоторые контекстах." ⏎ } ⏎ ```
верноfalse → "", true → "1".
T02-L8
0.14 c
Типы и сравненияСравнение 0.1 + 0.2 === 0.3 возвращает false.«да»
Пояснение: В PHP, как и во многих других языках, сравнение чисел с плавающей точкой часто приводит к ошибкам из-за особенностей представления чисел с плавающей точкой.
Raw
```json ⏎ { ⏎   "answer": "true", ⏎   "пояснение": "В PHP, как и во многих других языках, сравнение чисел с плавающей точкой часто приводит к ошибкам из-за особенностей представления чисел с плавающей точкой." ⏎ } ⏎ ```
верноДвоичная погрешность float: 0.1 + 0.2 = 0.30000000000000004.
T03-L1
0.12 c
Строкиstrrev() корректно переворачивает строку в UTF-8.«нет»
Пояснение: strrev() работает с байтами, а не с символами, и может некорректно обрабатывать многобайтовые UTF-8 строки.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "strrev() работает с байтами, а не с символами, и может некорректно обрабатывать многобайтовые UTF-8 строки." ⏎ } ⏎ ```
верноstrrev переворачивает байты и ломает многобайтовые последовательности.
T03-L2
0.11 c
Строкиstr_contains('Hello world', 'world') возвращает true.«да»
Пояснение: Функция str_contains проверяет, содержится ли одна строка внутри другой, и в данном случае 'world' содержится в 'Hello world'.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Функция str_contains проверяет, содержится ли одна строка внутри другой, и в данном случае 'world' содержится в 'Hello world'." ⏎ } ⏎ ```
верноstr_contains с PHP 8.0 проверяет вхождение подстроки.
T03-L3
0.09 c
Строкиstr_pad() умеет дополнять строку только справа.«нет»
Пояснение: str_pad() может дополнять строку как слева, так и справа, в зависимости от аргументов.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "str_pad() может дополнять строку как слева, так и справа, в зависимости от аргументов." ⏎ } ⏎ ```
верноSTR_PAD_LEFT / STR_PAD_BOTH меняют сторону дополнения.
T03-L4
0.1 c
СтрокиПо умолчанию trim() срезает только пробелы, не трогая табы и переводы строк.«нет»
Пояснение: По умолчанию trim() удаляет пробельные символы, включая пробелы, табы и переводы строк.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "По умолчанию trim() удаляет пробельные символы, включая пробелы, табы и переводы строк." ⏎ } ⏎ ```
верноСписок символов по умолчанию: « \t\n\r\0\x0B» — пробелы, табы, переводы строк, возврат каретки, null-байт, вертикальный таб. Проверено php -r.
T03-L5
0.12 c
СтрокиСколько БАЙТ вернёт strlen('привет') для строки в UTF-8?«6»
Пояснение: strlen() подсчитывает количество байтов в строке, а для ASCII символов это соответствует количеству символов.
Raw
```json ⏎ { ⏎   "answer": 6, ⏎   "пояснение": "strlen() подсчитывает количество байтов в строке, а для ASCII символов это соответствует количеству символов." ⏎ } ⏎ ```
неверно
верный: «12»
6 букв по 2 байта: 12.
T03-L6
0.1 c
СтрокиЧто вернёт substr('abcdef', -3)?«def»
Пояснение: При негативном индексе substr начинает считать с конца строки.
Raw
```json ⏎ { ⏎   "answer": "def", ⏎   "пояснение": "При негативном индексе substr начинает считать с конца строки." ⏎ } ⏎ ```
верноОтрицательное смещение — с конца: def.
T03-L7
0.11 c
Строкиucfirst() изменяет строку, переданную ей, на месте.«нет»
Пояснение: Функция ucfirst() возвращает новую строку с первой буквой заглавной, а не изменяет исходную строку на месте.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Функция ucfirst() возвращает новую строку с первой буквой заглавной, а не изменяет исходную строку на месте." ⏎ } ⏎ ```
верноСтроки неизменяемы; ucfirst возвращает новую строку.
T03-L8
0.12 c
СтрокиВ heredoc работают интерполяция переменных, а в nowdoc — нет.«нет»
Пояснение: В heredoc также поддерживается интерполяция переменных, используя синтаксис `<?= ... ?>` или `<?php echo ... ?>`.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В heredoc также поддерживается интерполяция переменных, используя синтаксис `<?= ... ?>` или `<?php echo ... ?>`." ⏎ } ⏎ ```
неверно
верный: «да»
Nowdoc — «одинарные кавычки» в тройном синтаксисе: текст как есть.
T04-L1
0.1 c
МассивыФункция sort() сохраняет связь ключей и значений массива.«нет»
Пояснение: Функция sort() в PHP по умолчанию сортирует элементы массива, но не сохраняет связь ключей и значений.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Функция sort() в PHP по умолчанию сортирует элементы массива, но не сохраняет связь ключей и значений." ⏎ } ⏎ ```
верноsort перенумеровывает ключи; связь сохраняет asort.
T04-L2
0.1 c
МассивыСтроковый ключ '5' в массиве сохраняется как целое число 5.«да»
Пояснение: В PHP строковые ключи, если они представляют собой целые числа, могут быть сохранены как числовые.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В PHP строковые ключи, если они представляют собой целые числа, могут быть сохранены как числовые." ⏎ } ⏎ ```
верноКаноничные десятичные строковые ключи приводятся к int.
T04-L3
0.09 c
МассивыФункция in_array() по умолчанию использует строгое сравнение (===).«нет»
Пояснение: Функция in_array() по умолчанию использует нестрогое сравнение (==).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Функция in_array() по умолчанию использует нестрогое сравнение (==)." ⏎ } ⏎ ```
верноПо умолчанию сравнение нестрогое; строгое — третий аргумент true.
T04-L4
0.09 c
Массивыarray_filter() без колбэка удаляет из массива все «пустые» (falsy) элементы.«да»
Пояснение: array_filter() без колбэка удаляет все элементы, которые считаются ложными (falsy).
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "array_filter() без колбэка удаляет все элементы, которые считаются ложными (falsy)." ⏎ } ⏎ ```
верноУбирает 0, "", null, false и пустые массивы.
T04-L5
0.14 c
МассивыФункция array_slice() по умолчанию сохраняет исходные числовые ключи массива.«нет»
Пояснение: array_slice() по умолчанию сохраняет числовые ключи, но если передать второй аргумент (смещение), ключи будут переиндексированы.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "array_slice() по умолчанию сохраняет числовые ключи, но если передать второй аргумент (смещение), ключи будут переиндексированы." ⏎ } ⏎ ```
верноПо умолчанию ключи перенумеровываются; сохранение — preserve_keys = true.
T04-L6
0.12 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.13 c
МассивыСколько элементов будет в count(['a' => 1] + ['a' => 9, 'b' => 2])?«2»
Пояснение: Оператор объединения массивов с перезаписью ключей сохраняет только последнее значение для дублирующихся ключей.
Raw
```json ⏎ { ⏎   "answer": 2, ⏎   "пояснение": "Оператор объединения массивов с перезаписью ключей сохраняет только последнее значение для дублирующихся ключей." ⏎ } ⏎ ```
верноОператор + : по ключу 'a' побеждает левый; итого 2.
T04-L8
0.08 c
МассивыSpread-оператор [...$a, ...$b] с PHP 8.1 поддерживает массивы со строковыми ключами.«да»
Пояснение: Spread-оператор в PHP 8.1 поддерживает массивы со строковыми ключами.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Spread-оператор в PHP 8.1 поддерживает массивы со строковыми ключами." ⏎ } ⏎ ```
верноВ 8.0 — только числовые ключи; 8.1 снял ограничение.
T05-L1
0.09 c
Функции и замыканияИменованные аргументы нельзя комбинировать с распаковкой массива ...$args в одном вызове.«нет»
Пояснение: Именованные аргументы и распаковка массива могут комбинироваться в одном вызове.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Именованные аргументы и распаковка массива могут комбинироваться в одном вызове." ⏎ } ⏎ ```
верноМожно: f(...$args, имя: значение). Нельзя только позиционный аргумент после распаковки.
T05-L2
0.09 c
Функции и замыканияАнонимная функция без use видит переменные внешней области видимости.«нет»
Пояснение: Анонимная функция не видит переменные внешней области видимости без явного указания.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Анонимная функция не видит переменные внешней области видимости без явного указания." ⏎ } ⏎ ```
верноБез use внешние переменные недоступны; авто-захват только у fn.
T05-L3
0.09 c
Функции и замыканияЧто вернёт func_num_args() внутри function f($a) { return func_num_args(); } при вызове f(1, 2, 3)?«3»
Пояснение: func_num_args() вернёт количество переданных аргументов, то есть 3.
Raw
```json ⏎ { ⏎   "answer": "3", ⏎   "пояснение": "func_num_args() вернёт количество переданных аргументов, то есть 3." ⏎ } ⏎ ```
верноСчитает переданные аргументы: 3.
T05-L4
0.1 c
Функции и замыканияТело стрелочной функции fn может состоять из нескольких выражений в фигурных скобках.«да»
Пояснение: Тело стрелочной функции может состоять из нескольких выражений, заключенных в фигурные скобки.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Тело стрелочной функции может состоять из нескольких выражений, заключенных в фигурные скобки." ⏎ } ⏎ ```
неверно
верный: «нет»
fn — всегда одно выражение; блок операторов делает обычная анонимная функция.
T05-L5
0.12 c
Функции и замыканияСтрелочная функция fn захватывает внешние переменные по ссылке (лениво, при использовании).«нет»
Пояснение: Стрелочные функции не захватывают внешние переменные по ссылке; они используют замыкание (closure) для захвата переменных из области видимости.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Стрелочные функции не захватывают внешние переменные по ссылке; они используют замыкание (closure) для захвата переменных из области видимости." ⏎ } ⏎ ```
верноfn захватывает только по значению, автоматически; по ссылке — только &$var в use у обычной функции (fn так не умеет).
T05-L6
0.11 c
Функции и замыканияЗамыкание, объявленное как static function () {}, не захватывает $this.«да»
Пояснение: Статические методы не имеют доступа к `$this`, так как они не связаны с экземпляром класса.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Статические методы не имеют доступа к `$this`, так как они не связаны с экземпляром класса." ⏎ } ⏎ ```
верноstatic-замыкание отвязано от объекта: $this внутри недоступен.
T05-L7
0.17 c
Функции и замыканияЧто выведет: $x = 5; $f = function () use ($x) { return $x; }; $x = 7; echo $f();«7»
Пояснение: Переменная $x внутри замыкания замыкается на значение, которое было в области видимости, когда функция была определена, но при вызове она использует текущее значение $x.
Raw
```json ⏎ { ⏎   "answer": 7, ⏎   "пояснение": "Переменная $x внутри замыкания замыкается на значение, которое было в области видимости, когда функция была определена, но при вызове она использует текущее значение $x." ⏎ } ⏎ ```
неверно
верный: «5»
use захватывает по значению в момент создания: 5.
T05-L8
0.11 c
Функции и замыканияВ «слабом» режиме типизации (без strict_types) передача строки "5" в параметр с типом int допустима.«да»
Пояснение: В слабом режиме типизации PHP автоматически преобразует строку '5' в целое число 5.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В слабом режиме типизации PHP автоматически преобразует строку '5' в целое число 5." ⏎ } ⏎ ```
верноCoercive typing приводит "5" к 5; strict_types=1 требует точного типа.
T06-L1
0.14 c
ООП: классы и наследованиеPHP поддерживает promotion свойств в конструкторе: public function __construct(private int $x) {}.«да»
Пояснение: PHP поддерживает автоматическое присваивание значения свойствам, объявленным с помощью синтаксиса объявления свойств (constructor property promotion).
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "PHP поддерживает автоматическое присваивание значения свойствам, объявленным с помощью синтаксиса объявления свойств (constructor property promotion)." ⏎ } ⏎ ```
верноС PHP 8.0 параметр с модификатором создаёт свойство и присваивание.
T06-L2
0.09 c
ООП: классы и наследованиеКакое ключевое слово запрещает переопределять метод в подклассах?«final»
Пояснение: Ключевое слово 'final' используется для обозначения методов, которые нельзя переопределять в подклассах.
Raw
```json ⏎ { ⏎   "answer": "final", ⏎   "пояснение": "Ключевое слово 'final' используется для обозначения методов, которые нельзя переопределять в подклассах." ⏎ } ⏎ ```
верноfinal.
T06-L3
0.09 c
ООП: классы и наследованиеМетод, объявленный как final, нельзя переопределить в подклассе.«да»
Пояснение: Методы, объявленные как final, не могут быть переопределены в подклассах.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Методы, объявленные как final, не могут быть переопределены в подклассах." ⏎ } ⏎ ```
верноfinal запрещает переопределение метода и наследование класса.
T06-L4
0.12 c
ООП: классы и наследованиеСвойства родителя с видимостью private доступны в подклассе.«нет»
Пояснение: Свойства с модификатором доступа private доступны только внутри класса, в котором они объявлены, и не наследуются напрямую в подкласс.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Свойства с модификатором доступа private доступны только внутри класса, в котором они объявлены, и не наследуются напрямую в подкласс." ⏎ } ⏎ ```
верноВ подклассе видны protected и public; private — только внутри своего класса.
T06-L5
0.08 c
ООП: классы и наследованиеЧто вернёт get_class(new class {})? Ответь частью имени до нулевого байта (без пути к файлу).«class»
Пояснение: get_class() возвращает имя класса, в данном случае 'class'.
Raw
```json ⏎ { ⏎   "answer": "class", ⏎   "пояснение": "get_class() возвращает имя класса, в данном случае 'class'." ⏎ } ⏎ ```
неверно
верный: «class@anonymous»
get_class анонимного класса печатает class@anonymous\0<файл>:<строка>$n; короткая форма — часть до NUL-байта. Проверено php -r (hex).
T06-L6
0.2 c
ООП: классы и наследованиеprivate-метод родителя не входит в контракт наследования: потомок может объявить метод с тем же именем с любой видимостью.«нет»
Пояснение: При наследовании метод родителя, который является private, становится доступен только в классе-потомке, но его контракт наследования обычно подразумевает, что подкласс может переопределить его или использовать его, а не что потомок может объявить метод с тем же именем с любой видимостью.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "При наследовании метод родителя, который является private, становится доступен только в классе-потомке, но его контракт наследования обычно подразумевает, что подкласс может переопределить его или использовать его, а не что потомок может объявить метод с тем же именем с любой видимостью." ⏎ } ⏎ ```
неверно
верный: «да»
private-члены не наследуются — правила совместимости подписей не действуют.
T06-L7
0.11 c
ООП: классы и наследованиеМагический метод __get() вызывается только для несуществующих свойств.«нет»
Пояснение: __get() вызывается, когда пытаются получить доступ к свойству, которого нет в объекте.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "__get() вызывается, когда пытаются получить доступ к свойству, которого нет в объекте." ⏎ } ⏎ ```
верно__get срабатывает и для существующих, но недоступных (private/protected извне).
T06-L8
0.08 c
ООП: классы и наследованиеЧто бросит повторное присваивание readonly-свойства — Exception или Error?«exception»
Пояснение: Повторное присваивание readonly-свойства обычно вызывает исключение (Exception).
Raw
```json ⏎ { ⏎   "answer": "Exception", ⏎   "пояснение": "Повторное присваивание readonly-свойства обычно вызывает исключение (Exception)." ⏎ } ⏎ ```
неверно
верный: «error»
Error (readonly с 8.1); оговорка: в __clone() переинициализация допустима (8.3+).
T07-L1
0.09 c
Интерфейсы, трейты, enumИнтерфейс может объявлять константы.«да»
Пояснение: Интерфейсы в PHP могут объявлять константы через `const`.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Интерфейсы в PHP могут объявлять константы через `const`." ⏎ } ⏎ ```
верноКонстанты интерфейса наследуются реализациями.
T07-L2
0.09 c
Интерфейсы, трейты, enumКакой оператор проверяет, что объект реализует класс или интерфейс?«да»
Пояснение: Оператор `instanceof` используется для проверки, реализует ли объект указанный класс или интерфейс.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Оператор `instanceof` используется для проверки, реализует ли объект указанный класс или интерфейс." ⏎ } ⏎ ```
неверно
верный: «instanceof»
instanceof.
T07-L3
0.09 c
Интерфейсы, трейты, enumИнтерфейс может объявлять статические методы.«да»
Пояснение: Классы в PHP могут объявлять статические методы с помощью ключевого слова `static`.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Классы в PHP могут объявлять статические методы с помощью ключевого слова `static`." ⏎ } ⏎ ```
верноРеализация обязана дать статический метод с той же сигнатурой.
T07-L4
0.09 c
Интерфейсы, трейты, enumОператор instanceof проверяет только наследование классов: интерфейсы он не учитывает.«нет»
Пояснение: Оператор instanceof проверяет не только наследование классов, но и реализацию интерфейсов.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Оператор instanceof проверяет не только наследование классов, но и реализацию интерфейсов." ⏎ } ⏎ ```
верноinstanceof возвращает true и для интерфейсов объекта.
T07-L5
0.09 c
Интерфейсы, трейты, enumМетод интерфейса может иметь реализацию по умолчанию, как метод трейта.«нет»
Пояснение: Методы интерфейса не могут иметь реализации по умолчанию, в отличие от методов трейта.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Методы интерфейса не могут иметь реализации по умолчанию, в отличие от методов трейта." ⏎ } ⏎ ```
верноМетоды интерфейса — только сигнатуры; тело даёт реализующий класс.
T07-L6
0.08 c
Интерфейсы, трейты, enumАбстрактный метод в абстрактном классе может иметь видимость protected.«да»
Пояснение: Абстрактный метод в абстрактном классе может иметь любую видимость, включая protected.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Абстрактный метод в абстрактном классе может иметь любую видимость, включая protected." ⏎ } ⏎ ```
верноВ абстрактном классе — любая видимость; в интерфейсе — только public.
T07-L7
0.09 c
Интерфейсы, трейты, enumСколько элементов вернёт Foo::cases() для enum Foo { case A; case B; case C; }?«3»
Пояснение: Метод cases() вернёт количество перечислений (cases) в enum.
Raw
```json ⏎ { ⏎   "answer": 3, ⏎   "пояснение": "Метод cases() вернёт количество перечислений (cases) в enum." ⏎ } ⏎ ```
верноСтатический метод cases(): 3.
T07-L8
0.09 c
Интерфейсы, трейты, enumТрейт может объявлять константы.«нет»
Пояснение: Трейты не могут объявлять константы, константы объявляются в классе.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Трейты не могут объявлять константы, константы объявляются в классе." ⏎ } ⏎ ```
неверно
верный: «да»
С PHP 8.2 трейты могут объявлять константы (RFC constants_in_traits); до 8.2 — нет.
T08-L1
0.09 c
Исключения и ошибкиИнтерфейс Throwable — общий предок и для Exception, и для Error.«да»
Пояснение: Класс Throwable является общим предком для Exception и Error в PHP.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Класс Throwable является общим предком для Exception и Error в PHP." ⏎ } ⏎ ```
верноИерархия с PHP 7: Throwable → Exception и Throwable → Error.
T08-L2
0.1 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.1 c
Исключения и ошибкиОператор @ подавляет и исключения тоже.«нет»
Пояснение: Оператор @ подавляет только ошибки предупреждений (warnings), а не исключения (exceptions).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Оператор @ подавляет только ошибки предупреждений (warnings), а не исключения (exceptions)." ⏎ } ⏎ ```
верно@ глушит диагностику (warnings/notices), исключения не перехватывает.
T08-L4
0.11 c
Исключения и ошибкиКакой класс ошибки бросит intdiv(5, 0)?«divisionbyzeroerror»
Пояснение: Вызов intdiv(5, 0) вызывает исключение DivisionByZeroError в PHP.
Raw
```json ⏎ { ⏎   "answer": "DivisionByZeroError", ⏎   "пояснение": "Вызов intdiv(5, 0) вызывает исключение DivisionByZeroError в PHP." ⏎ } ⏎ ```
верноDivisionByZeroError (иерархия Error, не Exception); php-грейдер объективен.
T08-L5
0.1 c
Исключения и ошибкиБлок finally выполняется только если исключение было поймано блоком catch.«нет»
Пояснение: Блок finally выполняется всегда, независимо от того, было ли исключение поймано блоком catch.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Блок finally выполняется всегда, независимо от того, было ли исключение поймано блоком catch." ⏎ } ⏎ ```
верноНаоборот: finally выполняется всегда — даже когда исключение не поймано и уходит выше. Проверено php -r.
T08-L6
0.1 c
Исключения и ошибкиИсключение, выброшенное внутри блока finally, никак не влияет на результат try-блока.«нет»
Пояснение: Исключение, выброшенное внутри блока finally, может влиять на результат try-блока, если оно не перехвачено.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Исключение, выброшенное внутри блока finally, может влиять на результат try-блока, если оно не перехвачено." ⏎ } ⏎ ```
верноИсключение из finally перекрывает исходное и уходит вместо него.
T08-L7
0.09 c
Исключения и ошибкиЧто вернёт выражение: (bool) new Exception('x')?«true»
Пояснение: При приведении типа (bool) любой объект, кроме null, возвращает true.
Raw
```json ⏎ { ⏎   "answer": "true", ⏎   "пояснение": "При приведении типа (bool) любой объект, кроме null, возвращает true." ⏎ } ⏎ ```
верноЛюбой объект при приведении к bool — true. Формы ответа: true или да.
T08-L8
0.11 c
Исключения и ошибкиФункции, зарегистрированные через register_shutdown_function(), выполняются при вызове exit.«нет»
Пояснение: Функции, зарегистрированные через register_shutdown_function(), выполняются при завершении работы скрипта (exit), но не при каждом вызове exit.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Функции, зарегистрированные через register_shutdown_function(), выполняются при завершении работы скрипта (exit), но не при каждом вызове exit." ⏎ } ⏎ ```
неверно
верный: «да»
exit завершает скрипт, но shutdown-функции отрабатывают.
T09-L1
0.12 c
Пространства имён и автозагрузкаДиректива use App\Service\Mailer; сама по себе подключает файл с классом.«нет»
Пояснение: Директива use используется для импорта (включения) классов из других пространств имен, а не для прямого подключения файлов.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Директива use используется для импорта (включения) классов из других пространств имен, а не для прямого подключения файлов." ⏎ } ⏎ ```
верноuse — псевдоним на этапе компиляции; файл грузит автозагрузчик при первом обращении.
T09-L2
0.08 c
Пространства имён и автозагрузкаЧто пишут после use, чтобы импортировать функцию (а не класс): слово function или const?«function»
Пояснение: Чтобы импортировать функцию, используется ключевое слово function.
Raw
```json ⏎ { ⏎   "answer": "function", ⏎   "пояснение": "Чтобы импортировать функцию, используется ключевое слово function." ⏎ } ⏎ ```
верноuse function ...; (и use const для констант).
T09-L3
0.14 c
Пространства имён и автозагрузкаВ какой файл (путь от src/) PSR-4 «App\ → src/» положит класс App\Controller\Api\UserController?«src/controller/api/usercontroller.php»
Пояснение: PSR-4 указывает, что пространство имен App соответствует директории src/, а структура классов следует этой иерархии.
Raw
```json ⏎ { ⏎   "answer": "src/Controller/Api/UserController.php", ⏎   "пояснение": "PSR-4 указывает, что пространство имен App соответствует директории src/, а структура классов следует этой иерархии." ⏎ } ⏎ ```
верноОстаток имени после префикса, \ → /.
T09-L4
0.1 c
Пространства имён и автозагрузкаПодключение vendor/autoload.php регистрирует обработчики через spl_autoload_register().«да»
Пояснение: vendor/autoload.php обычно использует spl_autoload_register для автоматической загрузки классов.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "vendor/autoload.php обычно использует spl_autoload_register для автоматической загрузки классов." ⏎ } ⏎ ```
верноComposer ставит автозагрузчик именно на spl_autoload_register.
T09-L5
0.09 c
Пространства имён и автозагрузкаМагическая константа __NAMESPACE__ содержит имя текущего пространства имён.«да»
Пояснение: __NAMESPACE__ — это магическая константа, содержащая имя текущего пространства имён.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "__NAMESPACE__ — это магическая константа, содержащая имя текущего пространства имён." ⏎ } ⏎ ```
верноВ корневом пространстве — пустая строка.
T09-L6
0.1 c
Пространства имён и автозагрузкаОтносительное имя класса (без ведущего \) в new резолвится от глобального корня.«нет»
Пояснение: Относительное имя класса без ведущего слэша резолвится относительно каталога, где находится класс.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Относительное имя класса без ведущего слэша резолвится относительно каталога, где находится класс." ⏎ } ⏎ ```
верноРезолвится относительно текущего namespace (с учётом импортов).
T09-L7
0.13 c
Пространства имён и автозагрузкаПри маппинге PSR-4 «App\ → src/» класс App\Model\User лежит в файле src/Model/User.php.«нет»
Пояснение: PSR-4 предполагает соответствие структуры директорий и пространства имен, поэтому класс App\Model\User должен находиться в файле src/Model/User.php.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "PSR-4 предполагает соответствие структуры директорий и пространства имен, поэтому класс App\\Model\\User должен находиться в файле src/Model/User.php." ⏎ } ⏎ ```
неверно
верный: «да»
Остаток имени после префикса переносится в путь как есть.
T09-L8
0.11 c
Пространства имён и автозагрузкаДирективу use можно писать внутри тела функции — импорт будет действовать для этой функции.«нет»
Пояснение: Директива use должна быть размещена в начале файла для импорта классов или функций.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Директива use должна быть размещена в начале файла для импорта классов или функций." ⏎ } ⏎ ```
верноuse внутри тела функции — parse error; импорты файловые и компиляционные.
T10-L1
0.09 c
Ссылки и область видимостиМассивы при присваивании копируются, а не передаются по ссылке.«да»
Пояснение: При присваивании массивов в PHP происходит копирование значения.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "При присваивании массивов в PHP происходит копирование значения." ⏎ } ⏎ ```
верноПрисваивание массива — копия (в движке — copy-on-write).
T10-L2
0.15 c
Ссылки и область видимостиЧто выведет: $a = [1, 2]; $b = $a; $b[] = 3; echo count($a);«2»
Пояснение: Передача массива по ссылке приводит к тому, что изменение в $b затрагивает и $a, и $b, поэтому count($a) будет равно 3.
Raw
```json ⏎ { ⏎   "answer": "2", ⏎   "пояснение": "Передача массива по ссылке приводит к тому, что изменение в $b затрагивает и $a, и $b, поэтому count($a) будет равно 3." ⏎ } ⏎ ```
верноПрисваивание — копия: в $a по-прежнему 2 элемента.
T10-L3
0.12 c
Ссылки и область видимостиВнутри функции пользовательские переменные глобальной области недоступны без global, $GLOBALS или передачи параметром.«да»
Пояснение: Пользовательские переменные глобальной области недоступны внутри функции без использования ключевых слов global, $GLOBALS или передачи параметров.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Пользовательские переменные глобальной области недоступны внутри функции без использования ключевых слов global, $GLOBALS или передачи параметров." ⏎ } ⏎ ```
верноОбласть видимости функций изолирована; исключение — суперглобалы ($_GET и др.).
T10-L4
0.1 c
Ссылки и область видимостиunset($GLOBALS['x']) внутри функции удаляет глобальную переменную только для этой функции.«нет»
Пояснение: unset($GLOBALS['x']) удаляет переменную из глобального пространства имен, доступного всем функциям.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "unset($GLOBALS['x']) удаляет переменную из глобального пространства имен, доступного всем функциям." ⏎ } ⏎ ```
верно$GLOBALS — прямое окно в глобальную область: unset удалит её по-настоящему.
T10-L5
0.1 c
Ссылки и область видимостиЧто выведет: function inc(&$x) { $x++; } $n = 5; inc($n); echo $n;«6»
Пояснение: Передача по ссылке изменяет исходную переменную $n.
Raw
```json ⏎ { ⏎   "answer": 6, ⏎   "пояснение": "Передача по ссылке изменяет исходную переменную $n." ⏎ } ⏎ ```
верноСсылка меняет оригинал: 6.
T10-L6
0.1 c
Ссылки и область видимостиForeach по массиву (по значению) работает с «живым» массивом: изменения массива внутри цикла видны в этом же проходе.«нет»
Пояснение: foreach по значению создает копию значений, поэтому изменения внутри цикла не влияют на исходный массив.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "foreach по значению создает копию значений, поэтому изменения внутри цикла не влияют на исходный массив." ⏎ } ⏎ ```
верноПо значению foreach итерирует копию-снимок.
T10-L7
0.09 c
Ссылки и область видимостиСтатическое свойство класса у каждого экземпляра своё: изменения в одном объекте не видны в других.«нет»
Пояснение: Статическое свойство принадлежит всему классу и общему для всех экземпляров.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Статическое свойство принадлежит всему классу и общему для всех экземпляров." ⏎ } ⏎ ```
верноНаоборот: статическое свойство общее для всех экземпляров класса. Проверено php -r.
T10-L8
0.11 c
Ссылки и область видимостиМассив может иметь булев ключ true, и он сохранится как bool.«да»
Пояснение: В PHP ключи массивов могут быть булевыми значениями, и они сохраняются как типы bool.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В PHP ключи массивов могут быть булевыми значениями, и они сохраняются как типы bool." ⏎ } ⏎ ```
неверно
верный: «нет»
Булев ключ приводится к int: true → 1, false → 0.
T11-L1
0.1 c
Генераторы, итераторы, SPLВнутри генератора можно использовать return со значением, и оно попадёт в $gen->getReturn().«нет»
Пояснение: Внутри генератора `return` возвращает значение генератору, а не помещает его в `$gen->getReturn()`.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Внутри генератора `return` возвращает значение генератору, а не помещает его в `$gen->getReturn()`." ⏎ } ⏎ ```
неверно
верный: «да»
return-значение генератора доступно через getReturn() после прохода.
T11-L2
0.12 c
Генераторы, итераторы, SPLПолностью пройденный генератор можно «перемотать» через rewind() и пройти снова.«да»
Пояснение: Функция rewind() возвращает указатель на начало объекта, позволяя повторно пройти по нему.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Функция rewind() возвращает указатель на начало объекта, позволяя повторно пройти по нему." ⏎ } ⏎ ```
неверно
верный: «нет»
Генератор одноразовый: rewind после начала итерации бросает Exception.
T11-L3
0.12 c
Генераторы, итераторы, SPLКонструкция yield from делегирует проход другому генератору или итерируемому объекту.«да»
Пояснение: Ключевое слово yield from делегирует управление генератором другому итерируемому объекту.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Ключевое слово yield from делегирует управление генератором другому итерируемому объекту." ⏎ } ⏎ ```
верноyield from проксирует значения, ключи и return-значение внутреннего генератора.
T11-L4
0.1 c
Генераторы, итераторы, SPLЧто вернёт get_class(g()) для function g() { yield 1; }?«string»
Пояснение: get_class возвращает имя класса, а функция g() является замыканием, которое может возвращать string.
Raw
```json ⏎ { ⏎   "answer": "string", ⏎   "пояснение": "get_class возвращает имя класса, а функция g() является замыканием, которое может возвращать string." ⏎ } ⏎ ```
неверно
верный: «generator»
Функция с yield возвращает Generator.
T11-L5
0.11 c
Генераторы, итераторы, SPLСколько элементов вернёт count(iterator_to_array((function () { yield from [1, 2, 3]; })()));«3»
Пояснение: Функция `yield from` в данном контексте возвращает итератор, который содержит три элемента.
Raw
```json ⏎ { ⏎   "answer": 3, ⏎   "пояснение": "Функция `yield from` в данном контексте возвращает итератор, который содержит три элемента." ⏎ } ⏎ ```
верноyield from делегирует все 3 элемента.
T11-L6
0.09 c
Генераторы, итераторы, SPLКласс SplStack реализует очередь FIFO.«нет»
Пояснение: Класс SplStack реализует стек (LIFO), а не очередь (FIFO).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Класс SplStack реализует стек (LIFO), а не очередь (FIFO)." ⏎ } ⏎ ```
верноSplStack — стек LIFO; очередь FIFO — SplQueue.
T11-L7
0.09 c
Генераторы, итераторы, SPLArrayIterator позволяет обернуть массив и обходить его через интерфейс Iterator.«да»
Пояснение: ArrayIterator реализует интерфейс Iterator и позволяет итерировать по массиву.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "ArrayIterator реализует интерфейс Iterator и позволяет итерировать по массиву." ⏎ } ⏎ ```
верноОбъектная обёртка над массивом.
T11-L8
0.1 c
Генераторы, итераторы, SPLОбъект класса ArrayObject нельзя обойти через foreach.«нет»
Пояснение: Объект ArrayObject можно пройти через foreach, так как он реализует интерфейс Array.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Объект ArrayObject можно пройти через foreach, так как он реализует интерфейс Array." ⏎ } ⏎ ```
верноArrayObject реализует IteratorAggregate — foreach по нему работает.
T12-L1
0.09 c
Конфигурация и безопасностьpassword_hash() генерирует соль автоматически — передавать её отдельно не нужно.«да»
Пояснение: Функция password_hash() автоматически генерирует и включает соль в хеш.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Функция password_hash() автоматически генерирует и включает соль в хеш." ⏎ } ⏎ ```
верноСоль встраивается в строку результата; параметр salt устарел.
T12-L2
0.13 c
Конфигурация и безопасностьАлгоритм PASSWORD_DEFAULT в PHP 8 — это md5 с автоматически добавленной солью.«нет»
Пояснение: PASSWORD_DEFAULT использует наиболее сильный хеш, определенный в текущей конфигурации, который часто является bcrypt или Argon2, а не MD5.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "PASSWORD_DEFAULT использует наиболее сильный хеш, определенный в текущей конфигурации, который часто является bcrypt или Argon2, а не MD5." ⏎ } ⏎ ```
верноPASSWORD_DEFAULT — bcrypt; md5 для паролей непригоден (перебирается массово).
T12-L3
0.1 c
Конфигурация и безопасностьЧто вернёт password_verify('secret', password_hash('secret', PASSWORD_DEFAULT))?«1»
Пояснение: Функция вернёт 1, так как пароль корректно хеширован.
Raw
```json ⏎ { ⏎   "answer": "1", ⏎   "пояснение": "Функция вернёт 1, так как пароль корректно хеширован." ⏎ } ⏎ ```
неверно
верный: «true»
Соль и хеш в одной строке: true (форма ответа: true или да).
T12-L4
0.1 c
Конфигурация и безопасностьФункция strip_tags() защищает от SQL-инъекций.«нет»
Пояснение: strip_tags() используется для удаления HTML-тегов из строки, а не для защиты от SQL-инъекций.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "strip_tags() используется для удаления HTML-тегов из строки, а не для защиты от SQL-инъекций." ⏎ } ⏎ ```
верноstrip_tags режет HTML-теги (помощник против XSS), к параметризации SQL отношения не имеет.
T12-L5
0.1 c
Конфигурация и безопасностьФункция session_regenerate_id() используется для защиты от фиксации сессии при входе пользователя.«да»
Пояснение: session_regenerate_id() заменяет старый идентификатор сессии на новый, предотвращая фиксацию сессии.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "session_regenerate_id() заменяет старый идентификатор сессии на новый, предотвращая фиксацию сессии." ⏎ } ⏎ ```
верноНовый ID сессии после логина — стандартная защита от session fixation.
T12-L6
0.09 c
Конфигурация и безопасностьКакая встроенная функция возвращает имя SAPI (например, cli)?«php_sapi_name»
Пояснение: Функция php_sapi_name возвращает имя текущего SAPI.
Raw
```json ⏎ { ⏎   "answer": "php_sapi_name", ⏎   "пояснение": "Функция php_sapi_name возвращает имя текущего SAPI." ⏎ } ⏎ ```
верноphp_sapi_name().
T12-L7
0.13 c
Конфигурация и безопасностьsession_destroy() удаляет данные сессии на сервере, но не cookie в браузере пользователя.«нет»
Пояснение: session_destroy() удаляет данные сессии на сервере, но для удаления cookie необходимо установить заголовок 'Set-Cookie' с соответствующими настройками.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "session_destroy() удаляет данные сессии на сервере, но для удаления cookie необходимо установить заголовок 'Set-Cookie' с соответствующими настройками." ⏎ } ⏎ ```
неверно
верный: «да»
Удаление cookie — отдельный шаг через setcookie с истёкшим сроком.
T12-L8
0.08 c
Конфигурация и безопасностьБез вызова session_start() массив $_SESSION автоматически загружается данными сессии.«нет»
Пояснение: Массив $_SESSION автоматически загружается только после вызова session_start().
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Массив $_SESSION автоматически загружается только после вызова session_start()." ⏎ } ⏎ ```
верноБез session_start() данные сессии в массив не загружаются ($_SESSION можно заполнить вручную, но привязки к сессии нет).
VC-L1
0.1 c
PHP 8.4–8.5В какой версии PHP появилась функция array_find()?«5.3.0»
Пояснение: Функция array_find() была добавлена в PHP версии 5.3.0.
Raw
```json ⏎ { ⏎   "answer": "5.3.0", ⏎   "пояснение": "Функция array_find() была добавлена в PHP версии 5.3.0." ⏎ } ⏎ ```
неверно
верный: «8.4»
PHP 8.4 (RFC array_find).
VC-L2
0.1 c
PHP 8.4–8.5Property hooks (get/set прямо в объявлении свойства) вошли в PHP 8.4.«нет»
Пояснение: Property hooks (get/set прямо в объявлении свойства) были введены в PHP 8.1.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Property hooks (get/set прямо в объявлении свойства) были введены в PHP 8.1." ⏎ } ⏎ ```
неверно
верный: «да»
Property hooks — PHP 8.4 (ноябрь 2024).
VC-L3
0.1 c
PHP 8.4–8.5Асимметричная видимость (public private(set) string $name) появилась в PHP 8.4.«нет»
Пояснение: Асимметричная видимость (public private(set)) не была добавлена в PHP 8.4.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Асимметричная видимость (public private(set)) не была добавлена в PHP 8.4." ⏎ } ⏎ ```
неверно
верный: «да»
Asymmetric visibility v2 — PHP 8.4.
VC-L4
0.11 c
PHP 8.4–8.5В какой версии PHP впервые появился атрибут #[\NoDiscard]? Ответь номером версии.«8.0»
Пояснение: Атрибуты, включая #[\NoDiscard], были введены в PHP версии 8.0.
Raw
```json ⏎ { ⏎   "answer": "8.0", ⏎   "пояснение": "Атрибуты, включая #[\NoDiscard], были введены в PHP версии 8.0." ⏎ } ⏎ ```
неверно
верный: «8.5»
#[\NoDiscard] — PHP 8.5 (marking return values as important).
VC-L5
0.09 c
PHP 8.4–8.5В какой версии PHP впервые появился оператор конвейера |> (pipe)? Ответь номером версии.«7.4»
Пояснение: Оператор конвейера |> был добавлен в PHP версии 7.4.
Raw
```json ⏎ { ⏎   "answer": "7.4", ⏎   "пояснение": "Оператор конвейера |> был добавлен в PHP версии 7.4." ⏎ } ⏎ ```
неверно
верный: «8.5»
Pipe operator — PHP 8.5 (2025).
VC-L6
0.1 c
PHP 8.4–8.5В какой версии PHP появился clone-with — синтаксис clone($obj, ['x' => 1])? Ответь номером версии.«7.0»
Пояснение: Синтаксис clone($obj, $options) был добавлен в PHP версии 7.0.
Raw
```json ⏎ { ⏎   "answer": "7.0", ⏎   "пояснение": "Синтаксис clone($obj, $options) был добавлен в PHP версии 7.0." ⏎ } ⏎ ```
неверно
верный: «8.5»
Clone with v2 — PHP 8.5.
VC-L7
0.1 c
PHP 8.4–8.5В какой версии PHP появились функции array_first() и array_last()?«5.3.0»
Пояснение: Функции array_first() и array_last() были добавлены в PHP версии 5.3.0.
Raw
```json ⏎ { ⏎   "answer": "5.3.0", ⏎   "пояснение": "Функции array_first() и array_last() были добавлены в PHP версии 5.3.0." ⏎ } ⏎ ```
неверно
верный: «8.5»
PHP 8.5.
VC-L8
0.09 c
PHP 8.4–8.5Для какой версии PHP был принят RFC Partial Function Application v2 (по состоянию на 07.11.2026)? Ответь номером версии.«8.0»
Пояснение: RFC Partial Function Application v2 был принят в PHP версии 8.0.
Raw
```json ⏎ { ⏎   "answer": "8.0", ⏎   "пояснение": "RFC Partial Function Application v2 был принят в PHP версии 8.0." ⏎ } ⏎ ```
неверно
верный: «8.6»
PFA v2 принят 05.12.2025 (33-0-0), реализован в PHP 8.6.
VF-L1
0.1 c
PHP: 8.6+ и будущееДля какой версии PHP реализован RFC clamp_v2 (функция clamp()) по состоянию на 07.11.2026? Ответь номером версии.«7.4»
Пояснение: Функция clamp() с RFC clamp_v2 была реализована в PHP версии 7.4.
Raw
```json ⏎ { ⏎   "answer": "7.4", ⏎   "пояснение": "Функция clamp() с RFC clamp_v2 была реализована в PHP версии 7.4." ⏎ } ⏎ ```
неверно
верный: «8.6»
По данным владельца (wiki.php.net/rfc): clamp_v2 — 8.6; clamp() в 8.5.11 отсутствует (косвенное подтверждение). Дата-якорь делает клетку монотонной.
VF-L2
0.1 c
PHP: 8.6+ и будущееRFC Context Managers v2 уже принят в PHP (на 07.11.2026).«нет»
Пояснение: На момент моего последнего обновления информации, RFC Context Managers v2 не был принят в PHP.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "На момент моего последнего обновления информации, RFC Context Managers v2 не был принят в PHP." ⏎ } ⏎ ```
верноНа 06.11.2026 — в обсуждении (создан 2026-10-23); не принят.
VF-L3
0.12 c
PHP: 8.6+ и будущееRFC Bound-Erased Generic Types (generics) был отклонён в 2026 году.«нет»
Пояснение: Информация о конкретных отказах стандартов может меняться, но это не является общеизвестным фактом о PHP.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Информация о конкретных отказах стандартов может меняться, но это не является общеизвестным фактом о PHP." ⏎ } ⏎ ```
неверно
верный: «да»
Голосование завершилось 2026-06-28: отклонён (wiki.php.net/rfc).
VF-L4
0.09 c
PHP: 8.6+ и будущееНа 07.11.2026 RFC о включении многопоточности (ZTS) по умолчанию уже принят в PHP.«нет»
Пояснение: RFC о включении многопоточности (ZTS) по умолчанию не принят в PHP.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "RFC о включении многопоточности (ZTS) по умолчанию не принят в PHP." ⏎ } ⏎ ```
верноТакого принятого RFC нет на дату якоря; якорь делает клетку монотонной — при принятии RFC позже клетка не перевернётся.
VF-L5
0.09 c
PHP: 8.6+ и будущееВ PHP 8.5 дженериков (параметризованных типов) по-прежнему нет.«нет»
Пояснение: В PHP 8.1 были введены дженерики (параметризованные типы).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В PHP 8.1 были введены дженерики (параметризованные типы)." ⏎ } ⏎ ```
неверно
верный: «да»
Generics в PHP отсутствуют; отрицательный контроль (не путать с C#/Java).
VF-L6
0.15 c
PHP: 8.6+ и будущееНа 07.11.2026 последняя стабильная версия PHP — 8.5, а PHP 8.6 ещё не выпущена (GA — 19.11.2026).«нет»
Пояснение: На момент текущего знания (до ноября 2024 года) стабильная версия PHP, вероятно, будет ниже 8.5, и информация о дате выпуска может быть неточной.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "На момент текущего знания (до ноября 2024 года) стабильная версия PHP, вероятно, будет ниже 8.5, и информация о дате выпуска может быть неточной." ⏎ } ⏎ ```
неверно
верный: «да»
8.5 — релиз осени 2025; 8.6 GA 19.11.2026 (wiki.php.net/todo/php86). Дата снимка — 06.11.2026.
VF-L7
0.13 c
PHP: 8.6+ и будущееВетка PHP 6 так и не вышла: после PHP 5.6 вышел сразу PHP 7.0.«нет»
Пояснение: PHP 6.0 был выпущен, хотя и не получил большого внимания по сравнению с PHP 7.0.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "PHP 6.0 был выпущен, хотя и не получил большого внимания по сравнению с PHP 7.0." ⏎ } ⏎ ```
неверно
верный: «да»
Исторический факт: ветка 6 не была релизнута.
VF-L8
0.09 c
PHP: 8.6+ и будущееRFC о добавлении атрибута #[\Deprecated] в ядро был принят.«нет»
Пояснение: В ядро не было принято RFC о добавлении атрибута #[Deprecated].
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В ядро не было принято RFC о добавлении атрибута #[Deprecated]." ⏎ } ⏎ ```
неверно
верный: «да»
#[\Deprecated] — принят, реализован в PHP 8.4.
T25-L1
0.11 c
Чистая архитектураПравило зависимостей в чистой и луковичной архитектурах: внутренние слои не знают о внешних — зависимости направлены к центру.«да»
Пояснение: В чистой и луковичной архитектурах зависимости направлены к центру, чтобы внутренние слои не зависели от внешних.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В чистой и луковичной архитектурах зависимости направлены к центру, чтобы внутренние слои не зависели от внешних." ⏎ } ⏎ ```
верноЧистая (Robert C. Martin), луковичная (Jeffrey Palermo) и гексагональная (ports & adapters) — варианты одной идеи: зависимости направлены внутрь, к домену. Слоями в проекте следит deptrac.
T25-L2
0.11 c
Чистая архитектураСущности домена не импортируют ни Doctrine, ни Symfony — только язык и, возможно, стандартную библиотеку.«нет»
Пояснение: Doctrine и Symfony используют множество инструментов для импорта сущностей, таких как атрибуты и конфигурация.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Doctrine и Symfony используют множество инструментов для импорта сущностей, таких как атрибуты и конфигурация." ⏎ } ⏎ ```
неверно
верный: «да»
Изоляция домена от инфраструктуры; deptrac в проекте как раз следит за слоями.
T25-L3
0.12 c
Чистая архитектураКонтроллеры и Twig-шаблоны относятся к слою бизнес-логики, потому что именно они вызывают use cases.«нет»
Пояснение: Контроллеры отвечают за обработку запросов, а Twig-шаблоны — за представление данных, а не за бизнес-логику.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Контроллеры отвечают за обработку запросов, а Twig-шаблоны — за представление данных, а не за бизнес-логику." ⏎ } ⏎ ```
верноНаоборот: это интерфейсные адаптеры (внешний слой); они зависят от use cases, а не наоборот.
T25-L4
0.11 c
Чистая архитектураЧто находится в самом центре луковичной архитектуры?«стебель»
Пояснение: В луковичной архитектуре в самом центре обычно находится стебель, служащий опорой.
Raw
```json ⏎ { ⏎   "answer": "стебель", ⏎   "пояснение": "В луковичной архитектуре в самом центре обычно находится стебель, служащий опорой." ⏎ } ⏎ ```
неверно
верный: «доменная модель»
Центральное кольцо — Domain Model: сущности и бизнес-правила без зависимостей; далее Domain Services → Application Services → Infrastructure/UI/Tests (Palermo).
T25-L5
0.11 c
Чистая архитектураНарушение границ слоёв можно поймать автоматикой: анализатор зависимостей между слоями (например, deptrac) падает на запрещённом вызове.«да»
Пояснение: Анализаторы зависимостей могут обнаруживать нарушения границ слоев, включая запрещённые вызовы.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Анализаторы зависимостей могут обнаруживать нарушения границ слоев, включая запрещённые вызовы." ⏎ } ⏎ ```
верноdepfile.yaml в проекте TasK: CI проверяет правила слоёв на каждом пайплайне.
T25-L6
0.12 c
Чистая архитектураUse case (interactor) может принимать HTTP-запрос или EntityManager как аргументы — так проще.«нет»
Пояснение: Use case (интерфактор) обычно принимает доменные объекты или репозитории, а не напрямую HTTP-запросы или EntityManager.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Use case (интерфактор) обычно принимает доменные объекты или репозитории, а не напрямую HTTP-запросы или EntityManager." ⏎ } ⏎ ```
верноUse case принимает DTO и порты; привязка к HTTP/ORM протекает инфраструктуру во внутренние слои.
T25-L7
0.09 c
Чистая архитектураКак называется компонент, предоставляющий коллекцию агрегатов/сущностей, скрывая механизм хранения за интерфейсом?«collection»
Пояснение: Компонент, предоставляющий коллекцию сущностей, скрывая механизм хранения, обычно называется коллекцией.
Raw
```json ⏎ { ⏎   "answer": "Collection", ⏎   "пояснение": "Компонент, предоставляющий коллекцию сущностей, скрывая механизм хранения, обычно называется коллекцией." ⏎ } ⏎ ```
неверно
верный: «репозиторий»
Repository pattern (DDD/Evans); в проекте — Doctrine-репозитории за портами.
T25-L8
0.17 c
Чистая архитектураЗамена PostgreSQL на другую БД в чистой архитектуре затрагивает только внешний слой — домен и use cases не меняются.«нет»
Пояснение: Смена базы данных влияет на слой данных (data layer), который взаимодействует с БД, а также может потребовать изменений в контрактах или реализациях в домене и use cases.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Смена базы данных влияет на слой данных (data layer), который взаимодействует с БД, а также может потребовать изменений в контрактах или реализациях в домене и use cases." ⏎ } ⏎ ```
неверно
верный: «да»
Следствие правила зависимостей: инфраструктура взаимозаменяема.
T26-L1
0.14 c
DDDАгрегат в DDD — это просто другое название таблицы базы данных.«нет»
Пояснение: Агрегат в DDD — это концептуальная единица, представляющая собой бизнес-объект с инвариантами и поведением, а не просто таблица базы данных.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Агрегат в DDD — это концептуальная единица, представляющая собой бизнес-объект с инвариантами и поведением, а не просто таблица базы данных." ⏎ } ⏎ ```
верноАгрегат — кластер объектов с границей согласованности (транзакционной вокруг корня); таблица — деталь хранения.
T26-L2
0.12 c
DDDValue Object неизменяем и сравнивается по значениям полей, а не по идентификатору.«да»
Пояснение: Value Object (Объект-значение) по своей природе неизменяем и сравнивается на основе равенства его полей.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Value Object (Объект-значение) по своей природе неизменяем и сравнивается на основе равенства его полей." ⏎ } ⏎ ```
верноКлассика Evans: Money, Email; равенство структурное.
T26-L3
0.09 c
DDDКак называется единственная точка внешнего входа в агрегат, через которую проходят все изменения?«точка входа»
Пояснение: Точка входа в агрегат — это единственная точка, через которую проходят все изменения.
Raw
```json ⏎ { ⏎   "answer": "точка входа", ⏎   "пояснение": "Точка входа в агрегат — это единственная точка, через которую проходят все изменения." ⏎ } ⏎ ```
неверно
верный: «aggregate root»
Aggregate Root: внешние объекты ссылаются только на корень; он защищает инварианты агрегата.
T26-L4
0.12 c
DDDВ DDD репозиторий объявляется на агрегат (его корень), а не на каждую сущность.«да»
Пояснение: В DDD репозиторий обычно инкапсулирует операции с агрегатами, а не с отдельными сущностями.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В DDD репозиторий обычно инкапсулирует операции с агрегатами, а не с отдельными сущностями." ⏎ } ⏎ ```
верноРепозиторий корня хранит границу согласованности агрегата; вложенные сущности доступны только через корень.
T26-L5
0.11 c
DDDUbiquitous language — единый язык модели, общий для разработчиков и предметных экспертов.«да»
Пояснение: Ubiquitous language — это общий язык, используемый в объектно-ориентированном проектировании и разработке.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Ubiquitous language — это общий язык, используемый в объектно-ориентированном проектировании и разработке." ⏎ } ⏎ ```
верноEvans: язык из требований переходит в имена классов и методов.
T26-L6
0.11 c
DDDКак называется граница, внутри которой модель и её язык едины, а снаружи те же понятия — другие модели?«пространство латентности»
Пояснение: Пространство латентности (latent space) — это пространство, где модель и её язык объединены.
Raw
```json ⏎ { ⏎   "answer": "пространство латентности", ⏎   "пояснение": "Пространство латентности (latent space) — это пространство, где модель и её язык объединены." ⏎ } ⏎ ```
неверно
верный: «bounded context»
Bounded Context; «Заказ» в биллинге и в доставке — разные модели.
T26-L7
0.13 c
DDDАнемичная модель (объекты только с геттерами/сеттерами, логика в сервисах) — рекомендуемый стиль DDD.«да»
Пояснение: Это соответствует принципам Анемичной модели в DDD, где объекты являются просто данными с геттерами и сеттерами.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Это соответствует принципам Анемичной модели в DDD, где объекты являются просто данными с геттерами и сеттерами." ⏎ } ⏎ ```
неверно
верный: «нет»
Наоборот: Evans называет анемичность антипаттерном — поведение должно жить в доменных объектах.
T26-L8
0.1 c
DDDBounded context означает, что у каждого контекста своя модель: одно и то же понятие в разных контекстах — разные классы.«да»
Пояснение: Bounded context подразумевает, что модель (и её представления) специфична для каждого контекста.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Bounded context подразумевает, что модель (и её представления) специфична для каждого контекста." ⏎ } ⏎ ```
верноМодели контекстов независимы; между ними — явная интеграция (ACL, published language).
T13-L1
0.09 c
SymfonyСервисы в DI-контейнере Symfony по умолчанию создаются лениво — при первом обращении к ним.«да»
Пояснение: Сервисы по умолчанию создаются лениво, то есть при первом обращении к ним.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Сервисы по умолчанию создаются лениво, то есть при первом обращении к ним." ⏎ } ⏎ ```
верноКонтейнер инстанцирует сервис при первом извлечении; eager-создания по умолчанию нет.
T13-L2
0.1 c
SymfonyКакая консольная команда Symfony выводит список всех зарегистрированных маршрутов?«php bin/console route:list»
Пояснение: Команда `route:list` в консоли Symfony выводит список всех зарегистрированных маршрутов.
Raw
```json ⏎ { ⏎   "answer": "php bin/console route:list", ⏎   "пояснение": "Команда `route:list` в консоли Symfony выводит список всех зарегистрированных маршрутов." ⏎ } ⏎ ```
неверно
верный: «debug:router»
bin/console debug:router (FrameworkBundle); в Symfony 3 команда называлась router:debug.
T13-L3
0.12 c
SymfonyAutowiring в Symfony требует вручную перечислять каждый сервис в конфигурации services.yaml.«нет»
Пояснение: Symfony использует автовайринг, автоматически обнаруживая и внедряя сервисы на основе их типов.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Symfony использует автовайринг, автоматически обнаруживая и внедряя сервисы на основе их типов." ⏎ } ⏎ ```
верноAutowire+autoconfigure регистрируют и связывают сервисы автоматически; ручное перечисление — исключение.
T13-L4
0.09 c
SymfonyTwig-шаблоны компилируются в PHP-классы и кэшируются между запросами.«да»
Пояснение: Twig-шаблоны компилируются в PHP-код для повышения производительности.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Twig-шаблоны компилируются в PHP-код для повышения производительности." ⏎ } ⏎ ```
верноTwig компилирует шаблон один раз; кэш в var/cache/twig, в prod не пересобирается.
T13-L5
0.09 c
SymfonyКонтейнер DI в dev-окружении Symfony пересобирается только после изменения отслеживаемых файлов, а не при каждом запросе.«да»
Пояснение: Контейнер DI в Symfony по умолчанию пересобирается только при изменении отслеживаемых файлов.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Контейнер DI в Symfony по умолчанию пересобирается только при изменении отслеживаемых файлов." ⏎ } ⏎ ```
верноKernel проверяет freshness ресурсов (конфиги, классы); иначе переиспользуется кэш контейнера.
T13-L6
0.08 c
SymfonyКакая переменная окружения выбирает активное окружение Symfony (dev/prod)?«app_env»
Пояснение: Symfony использует переменную окружения APP_ENV для определения активного окружения.
Raw
```json ⏎ { ⏎   "answer": "APP_ENV", ⏎   "пояснение": "Symfony использует переменную окружения APP_ENV для определения активного окружения." ⏎ } ⏎ ```
верноAPP_ENV в .env; APP_DEBUG — отдельный флаг отладки.
T13-L7
0.12 c
SymfonyМетод контроллера может быть private — маршрутизация Symfony работает с любыми методами класса.«нет»
Пояснение: Маршрутизация Symfony обычно работает с публичными методами контроллера, чтобы они могли быть вызваны из внешнего мира.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Маршрутизация Symfony обычно работает с публичными методами контроллера, чтобы они могли быть вызваны из внешнего мира." ⏎ } ⏎ ```
верноДействие контроллера должно быть public; приватный метод по маршруту не вызывается.
T13-L8
0.1 c
SymfonyПодписчики событий (EventSubscriber) всегда получают события раньше слушателей (listeners), потому что интерфейс даёт им приоритет.«нет»
Пояснение: Приоритет получения событий определяется механизмом подписки, а не самим интерфейсом EventSubscriber.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Приоритет получения событий определяется механизмом подписки, а не самим интерфейсом EventSubscriber." ⏎ } ⏎ ```
верноПорядок определяет priority, а не тип подписки; приоритеты задаются в getSubscribedEvents() так же, как у слушателей.
T22-L1
0.12 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.13 c
Symfony: Security и формыКакой атрибут Symfony проверяет роль/право прямо на методе контроллера (без него — 403)?«#[isgranted('role_name')]»
Пояснение: Атрибут Symfony, использующий компонент Security, проверяет права на уровне метода контроллера.
Raw
```json ⏎ { ⏎   "answer": "#[IsGranted('ROLE_NAME')]", ⏎   "пояснение": "Атрибут Symfony, использующий компонент Security, проверяет права на уровне метода контроллера." ⏎ } ⏎ ```
верно#[IsGranted('ROLE_ADMIN')]; атрибут из symfony/security-http.
T22-L3
0.09 c
Symfony: Security и формыVoters (голосующие) — механизм Symfony для проверки доступа к конкретному объекту: isGranted('EDIT', $post).«да»
Пояснение: isGranted() — это стандартный механизм Symfony для проверки прав доступа.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "isGranted() — это стандартный механизм Symfony для проверки прав доступа." ⏎ } ⏎ ```
верноVoterInterface->vote(); docs Symfony — Voters.
T22-L4
0.09 c
Symfony: Security и формыОграничения валидации в современных Symfony (7+) объявляются PHP-атрибутами (#[Assert\NotBlank]); аннотации-докблоки больше не поддерживаются.«да»
Пояснение: В современных версиях Symfony предпочтительно использовать PHP-атрибуты для объявления валидации.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В современных версиях Symfony предпочтительно использовать PHP-атрибуты для объявления валидации." ⏎ } ⏎ ```
верноДокблок-аннотации удалены в Symfony 7.0; стандарт — атрибуты. В проекте symfony/validator 8.1.
T22-L5
0.11 c
Symfony: Security и формыCSRF-защита форм в Symfony включена по умолчанию: форма проверяет токен при отправке.«нет»
Пояснение: CSRF-защита в Symfony требует явной настройки и включения, а не включена по умолчанию для всех форм.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "CSRF-защита в Symfony требует явной настройки и включения, а не включена по умолчанию для всех форм." ⏎ } ⏎ ```
неверно
верный: «да»
FormType добавляет скрытое поле _token и проверяет его при валидации; отключение — осознанное исключение (csrf: false).
T22-L6
0.09 c
Symfony: Security и формыВалидация формы в Symfony выполняется на сервере, даже если клиентская (HTML5) проверка прошла.«да»
Пояснение: Symfony выполняет серверную валидацию для обеспечения безопасности данных.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Symfony выполняет серверную валидацию для обеспечения безопасности данных." ⏎ } ⏎ ```
верноКлиентская валидация — только удобство; серверная обязательна и идёт по метаданным объекта формы.
T22-L7
0.13 c
Symfony: Security и формыКакая команда Symfony maker генерирует класс формы (FormType)?«formtype»
Пояснение: Команда Symfony maker для генерации класса формы обычно генерирует класс, наследуемый от Symfony\Component\Form\AbstractType.
Raw
```json ⏎ { ⏎   "answer": "FormType", ⏎   "пояснение": "Команда Symfony maker для генерации класса формы обычно генерирует класс, наследуемый от Symfony\Component\Form\AbstractType." ⏎ } ⏎ ```
неверно
верный: «make:form»
bin/console make:form (symfony/maker-bundle — в проекте).
T22-L8
0.11 c
Symfony: Security и формыSymfony хранит пароль пользователя в сессии в открытом виде (plaintext).«нет»
Пояснение: Symfony (и современные фреймворки) хранит пароли пользователей в зашифрованном виде, а не в открытом виде.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Symfony (и современные фреймворки) хранит пароли пользователей в зашифрованном виде, а не в открытом виде." ⏎ } ⏎ ```
верноВ сессии живёт объект пользователя в токене; хеш затирается eraseCredentials(), plaintext там никогда не лежит.
T23-L1
0.11 c
Symfony: конфигурация и сервисыКонфигурация бандлов Symfony лежит в config/packages — по одному файлу на бандл или тему.«нет»
Пояснение: Конфигурация бандлов в Symfony обычно вынесена в отдельный файл конфигурации, а не по одному файлу на бандл или тему.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Конфигурация бандлов в Symfony обычно вынесена в отдельный файл конфигурации, а не по одному файлу на бандл или тему." ⏎ } ⏎ ```
неверно
верный: «да»
Стандартная структура (config/packages/*.yaml); перегрузка — config/packages/<env>.
T23-L2
0.11 c
Symfony: конфигурация и сервисыФайл .env с dev-дефолтами коммитится в репозиторий, а настоящие секреты живут в некоммитимом .env.local.«да»
Пояснение: Это распространенная и приемлемая практика для управления конфигурацией и секретами в разработке.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Это распространенная и приемлемая практика для управления конфигурацией и секретами в разработке." ⏎ } ⏎ ```
верноsymfony/dotenv: .env — общий безопасный набор значений; локальные секреты — .env.local (gitignored) или secrets-хранилище.
T23-L3
0.15 c
Symfony: конфигурация и сервисыКакая команда Symfony выводит зарегистрированные сервисы контейнера и их алиасы?«php bin/console cache:clear»
Пояснение: Команда cache:clear очищает кэш, но для вывода сервисов обычно используется инструменты типа `php bin/console debug:container` или просмотр конфигурации.
Raw
```json ⏎ { ⏎   "answer": "php bin/console cache:clear", ⏎   "пояснение": "Команда cache:clear очищает кэш, но для вывода сервисов обычно используется инструменты типа `php bin/console debug:container` или просмотр конфигурации." ⏎ } ⏎ ```
неверно
верный: «debug:container»
bin/console debug:container; параметры контейнера — debug:parameter.
T23-L4
0.12 c
Symfony: конфигурация и сервисыКонтейнер Symfony позволяет менять параметры в рантайме: $container->setParameter() работает из контроллера.«нет»
Пояснение: Метод setParameter() используется для установки параметров контейнера, и он может вызываться из любого места, а не только из контроллера.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Метод setParameter() используется для установки параметров контейнера, и он может вызываться из любого места, а не только из контроллера." ⏎ } ⏎ ```
верноКонтейнер компилируется и замораживается; runtime-значения — только через переменные окружения.
T23-L5
0.09 c
Symfony: конфигурация и сервисыПо умолчанию сервисы в Symfony публичны (public: true) — их достают из контейнера напрямую.«нет»
Пояснение: По умолчанию сервисы в Symfony не являются публичными и обычно получают через контейнер.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "По умолчанию сервисы в Symfony не являются публичными и обычно получают через контейнер." ⏎ } ⏎ ```
верноС Symfony 4.0 сервисы по умолчанию private: инжектятся через autowiring; $container->get() — только для публичных.
T23-L6
0.11 c
Symfony: конфигурация и сервисыБез конфигурационного файла в config/packages бандл не заработает — настройки обязательны для каждого бандла.«нет»
Пояснение: Банбл может работать без конфигурационного файла, если настройки определены другими способами, например, через параметры окружения или встроенные значения.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Банбл может работать без конфигурационного файла, если настройки определены другими способами, например, через параметры окружения или встроенные значения." ⏎ } ⏎ ```
верноУ бандлов есть встроенные умолчания (Extension); конфиг нужен только для отклонений от них.
T23-L7
0.15 c
Symfony: конфигурация и сервисыЗначения переменных окружения подставляются в services.yaml синтаксисом %env(VAR)%.«нет»
Пояснение: ", "пояснение": "Синтаксис для подстановки переменных окружения в YAML обычно зависит от конкретного инструмента или фреймворка, но не является универсальным %env(VAR)%.", } ```
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Синтаксис для подстановки переменных окружения в YAML обычно зависит от конкретного инструмента или фреймворка, но не является универсальным %env(VAR)%.", ⏎ } ⏎ ```
неверно
верный: «да»
парсинг: текст (фолбэк)
%env(...)% резолвится в рантайме env-процессорами; docs — Env Var Processors.
T23-L8
0.11 c
Symfony: конфигурация и сервисыКакая переменная окружения Symfony включает режим отладки (влияет на профайлер и отладку Twig)?«app_env»
Пояснение: Переменная APP_ENV, установленная в 'dev' или 'debug', часто влияет на включение режимов отладки в Symfony.
Raw
```json ⏎ { ⏎   "answer": "APP_ENV", ⏎   "пояснение": "Переменная APP_ENV, установленная в 'dev' или 'debug', часто влияет на включение режимов отладки в Symfony." ⏎ } ⏎ ```
неверно
верный: «app_debug»
APP_DEBUG=1 (в .env dev-окружения); окружение выбирает APP_ENV — см. T13-L6.
T16-L1
0.09 c
Symfony: MessengerОдно сообщение в Symfony Messenger может обрабатывать только один обработчик (handler).«да»
Пояснение: Symfony Messenger по умолчанию настраивается для обработки одного сообщения одним обработчиком.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Symfony Messenger по умолчанию настраивается для обработки одного сообщения одним обработчиком." ⏎ } ⏎ ```
неверно
верный: «нет»
Messenger вызывает все хендлеры, подписанные на класс сообщения (docs — Multiple Handlers).
T16-L2
0.12 c
Symfony: MessengerТранспорт sync в Messenger ставит сообщение в очередь и обрабатывает его воркером, как и async.«да»
Пояснение: Как синхронные, так и асинхронные операции в Messenger используют очереди и воркеры для обработки сообщений.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Как синхронные, так и асинхронные операции в Messenger используют очереди и воркеры для обработки сообщений." ⏎ } ⏎ ```
неверно
верный: «нет»
Наоборот: sync обрабатывает немедленно в том же процессе, что и отправка; очередь — это async-транспорт.
T16-L3
0.13 c
Symfony: MessengerКакой консольной командой запускается воркер, обрабатывающий сообщения из очередей Messenger?«php messenger:consume»
Пояснение: Команда для запуска воркера, обрабатывающего сообщения в Messenger, обычно использует команду consume.
Raw
```json ⏎ { ⏎   "answer": "php messenger:consume", ⏎   "пояснение": "Команда для запуска воркера, обрабатывающего сообщения в Messenger, обычно использует команду consume." ⏎ } ⏎ ```
верноbin/console messenger:consume async; воркеры под supervisord/systemd в проде.
T16-L4
0.12 c
Symfony: MessengerПовторы неудачных сообщений (retry_strategy) настраиваются на уровне транспорта Messenger.«нет»
Пояснение: Стратегии повтора неудачных сообщений (retry_strategy) обычно настраиваются на уровне самого клиента или библиотеки, а не транспорта Messenger.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Стратегии повтора неудачных сообщений (retry_strategy) обычно настраиваются на уровне самого клиента или библиотеки, а не транспорта Messenger." ⏎ } ⏎ ```
неверно
верный: «да»
retry_strategy на транспорте: max_retries, delay, multiplier; docs — Failed Messages & Retries.
T16-L5
0.08 c
Symfony: MessengerПо умолчанию Messenger сериализует сообщения в JSON.«да»
Пояснение: Messenger по умолчанию использует JSON для сериализации сообщений.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Messenger по умолчанию использует JSON для сериализации сообщений." ⏎ } ⏎ ```
неверно
верный: «нет»
Дефолтный сериализатор — PhpSerializer (serialize()); JSON-сериализатор включается отдельно.
T16-L6
0.1 c
Symfony: MessengerSymfony Scheduler по расписанию порождает сообщения и отправляет их через Messenger.«да»
Пояснение: Symfony Scheduler часто используется для планирования задач, которые генерируют сообщения, отправляемые через Messenger.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Symfony Scheduler часто используется для планирования задач, которые генерируют сообщения, отправляемые через Messenger." ⏎ } ⏎ ```
верноSchedule → RecurringMessage → шина Messenger; docs — Scheduler.
T16-L7
0.1 c
Symfony: MessengerКакой встроенный транспорт Messenger хранит сообщения в таблицах БД через Doctrine?«doctrine messenger»
Пояснение: Doctrine Messenger используется для обработки сообщений, которые могут включать сохранение данных в базу данных.
Raw
```json ⏎ { ⏎   "answer": "Doctrine Messenger", ⏎   "пояснение": "Doctrine Messenger используется для обработки сообщений, которые могут включать сохранение данных в базу данных." ⏎ } ⏎ ```
верноТранспорт doctrine (symfony/doctrine-messenger); таблица messenger_messages. В проекте стоит amqp-messenger + doctrine-messenger.
T16-L8
0.09 c
Symfony: MessengerПайплайн Messenger можно расширять собственными middleware, встраивая их до или после встроенных.«да»
Пояснение: Пайплайны Messenger позволяют встраивать собственные middleware до или после встроенных компонентов.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Пайплайны Messenger позволяют встраивать собственные middleware до или после встроенных компонентов." ⏎ } ⏎ ```
верноmessenger.bus.*.middleware в yaml; docs — Middleware.
T28-L1
0.1 c
Symfony: версииМажорные релизы Symfony выходят раз в два года, минорные — каждые шесть месяцев (в мае и ноябре).«нет»
Пояснение: Мажорные релизы Symfony обычно выходят раз в год, а минорные — каждые шесть месяцев.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Мажорные релизы Symfony обычно выходят раз в год, а минорные — каждые шесть месяцев." ⏎ } ⏎ ```
неверно
верный: «да»
Стандартный релизный цикл: 8.0 — ноябрь 2025, 8.1 — май 2026, 8.2 — ноябрь 2026.
T28-L2
0.08 c
Symfony: версииКакой минимальной версии PHP требует Symfony 8?«8.0»
Пояснение: Symfony 8 требует PHP версии 8.0 или выше.
Raw
```json ⏎ { ⏎   "answer": "8.0", ⏎   "пояснение": "Symfony 8 требует PHP версии 8.0 или выше." ⏎ } ⏎ ```
неверно
верный: «8.4»
Symfony 8.0 поднял требование до PHP >= 8.4.1 (в vendor проекта: "php": ">=8.4.1").
T28-L3
0.09 c
Symfony: версииSymfony 7.0 сохранила поддержку аннотаций в докблоках (валидация, маршруты).«да»
Пояснение: Symfony 7.0 улучшила поддержку аннотаций в докблоках для валидации и маршрутов.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Symfony 7.0 улучшила поддержку аннотаций в докблоках для валидации и маршрутов." ⏎ } ⏎ ```
неверно
верный: «нет»
Наоборот: в 7.0 аннотации удалены — только PHP-атрибуты (#[Route], #[Assert\NotBlank]).
T28-L4
0.08 c
Symfony: версииAssetMapper позволяет управлять CSS/JS без node и webpack — через importmap.php.«да»
Пояснение: AssetMapper использует importmap.php для управления CSS/JS без использования node и webpack.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "AssetMapper использует importmap.php для управления CSS/JS без использования node и webpack." ⏎ } ⏎ ```
верноsymfony/asset-mapper (с 6.3, стандарт с 7.x); в проекте — importmap.php в корне и asset-mapper 8.1.
T28-L5
0.1 c
Symfony: версииSymfony 6.4 — обычный релиз без длительной поддержки.«нет»
Пояснение: Symfony 6.4 является частью долгосрочной поддержки (LTS) версий Symfony.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Symfony 6.4 является частью долгосрочной поддержки (LTS) версий Symfony." ⏎ } ⏎ ```
верноНаоборот: 6.4 — LTS (расширенная поддержка); LTS выходит вместе с очередным мажором (6.4 — вместе с 7.0).
T28-L6
0.13 c
Symfony: версииПри переходе на новую мажорную версию Symfony деприкейшены прошлой ветки продолжают работать — мажорные релизы их не удаляют.«нет»
Пояснение: Мажорные релизы обычно приводят к удалению или значительному изменению устаревших (deprecated) элементов, а не к их продолжению работы.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Мажорные релизы обычно приводят к удалению или значительному изменению устаревших (deprecated) элементов, а не к их продолжению работы." ⏎ } ⏎ ```
верноНаоборот: мажорный релиз удаляет всё устаревшее (7.0 убрал деприкейшены 6.x, 8.0 — 7.x).
T28-L7
0.09 c
Symfony: версииКаждый мажорный релиз Symfony сопровождается UPGRADE-гайдом со списком изменений.«да»
Пояснение: Каждый мажорный релиз Symfony сопровождается подробным руководством по обновлению.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Каждый мажорный релиз Symfony сопровождается подробным руководством по обновлению." ⏎ } ⏎ ```
верноUPGRADE-7.0.md, UPGRADE-8.0.md в репозитории symfony/symfony.
T28-L8
0.08 c
Symfony: версииКакой компонент Symfony управляет ассетами и importmap без node/webpack?«assetmanager»
Пояснение: Компонент AssetManager в Symfony управляет ассетами и importmap.
Raw
```json ⏎ { ⏎   "answer": "AssetManager", ⏎   "пояснение": "Компонент AssetManager в Symfony управляет ассетами и importmap." ⏎ } ⏎ ```
неверно
верный: «asset-mapper»
symfony/asset-mapper 8.1 — в проекте.
T29-L1
0.09 c
Symfony: 8.2 и будущееНа 07.11.2026 Symfony 8.2 уже выпущена.«нет»
Пояснение: На момент моего последнего обновления информации, Symfony 8.2 еще не была выпущена.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "На момент моего последнего обновления информации, Symfony 8.2 еще не была выпущена." ⏎ } ⏎ ```
верноНаоборот: 8.2 ещё не выпущена — релиз в конце ноября 2026; последняя стабильная — 8.1.
T29-L2
0.11 c
Symfony: 8.2 и будущееПо состоянию на 07.11.2026 Symfony 8.2 запланирована на ноябрь 2026 — в обычном шестимесячном цикле.«нет»
Пояснение: Указанные сроки являются гипотетическими и не являются подтвержденными планами разработки.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Указанные сроки являются гипотетическими и не являются подтвержденными планами разработки." ⏎ } ⏎ ```
неверно
верный: «да»
Политика релизов: 8.1 — май 2026, 8.2 — ноябрь 2026; якорь даты фиксирует срез — модель с поздним cutoff отвечает «на дату».
T29-L3
0.1 c
Symfony: 8.2 и будущееКакая версия Symfony выйдет следующей после 8.1 (по состоянию на 07.11.2026)?«9.0»
Пояснение: Symfony 9.0 является следующей крупной версией после 8.1.
Raw
```json ⏎ { ⏎   "answer": "9.0", ⏎   "пояснение": "Symfony 9.0 является следующей крупной версией после 8.1." ⏎ } ⏎ ```
неверно
верный: «8.2»
8.2 — следующий минорный релиз (ноябрь 2026); после его выхода проект переходит с 8.1.* на 8.2.*.
T29-L4
0.1 c
Symfony: 8.2 и будущееSymfony 8.2 — мажорный релиз, требующий переписывания приложений под новые API.«нет»
Пояснение: Мажорный релиз может требовать адаптации, но не всегда обязательно полное переписывание приложений.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Мажорный релиз может требовать адаптации, но не всегда обязательно полное переписывание приложений." ⏎ } ⏎ ```
верноНаоборот: 8.2 — минорный релиз; новые возможности без поломки обратной совместимости. Мажор — 9.0.
T29-L5
0.12 c
Symfony: 8.2 и будущееОбновление внутри мажорной ветки (8.1 → 8.2) не должно требовать изменений кода — обратная совместимость сохраняется.«нет»
Пояснение: Обновление внутри мажорной ветки обычно включает изменения, которые могут потребовать изменений кода для обеспечения совместимости с новой версией.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Обновление внутри мажорной ветки обычно включает изменения, которые могут потребовать изменений кода для обеспечения совместимости с новой версией." ⏎ } ⏎ ```
неверно
верный: «да»
Политика Symfony: минорные релизы обратно совместимы; BC-break допустим только в мажорных.
T29-L6
0.12 c
Symfony: 8.2 и будущееКакая минорная версия ветки 8.x выйдет последней перед Symfony 9.0?«8.4»
Пояснение: Версия 8.4 является последней минорной версией ветки 8.x перед выходом Symfony 9.0.
Raw
```json ⏎ { ⏎   "answer": "8.4", ⏎   "пояснение": "Версия 8.4 является последней минорной версией ветки 8.x перед выходом Symfony 9.0." ⏎ } ⏎ ```
верноПо циклу: 8.2 (ноя 2026), 8.3 (май 2027), 8.4 (ноя 2027, вместе с 9.0) — как 6.4 выходила вместе с 7.0.
T29-L7
0.12 c
Symfony: 8.2 и будущееSymfony 8.2 потребует обновления PHP до 8.5 — придётся обновлять PHP вместе с ней.«нет»
Пояснение: Symfony 8.2 поддерживает более старые версии PHP, и требование обновления до PHP 8.5 не является прямым и не единственным условием.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Symfony 8.2 поддерживает более старые версии PHP, и требование обновления до PHP 8.5 не является прямым и не единственным условием." ⏎ } ⏎ ```
верноНаоборот: минорные релизы не поднимают требования PHP; для всей ветки 8.x остаётся PHP >= 8.4.
T29-L8
0.1 c
Symfony: 8.2 и будущееDeprecations, добавленные в ветке 8.x, будут удалены не раньше Symfony 9.0.«да»
Пояснение: Deprecations, добавленные в ветке 8.x, будут удалены не раньше Symfony 9.0.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Deprecations, добавленные в ветке 8.x, будут удалены не раньше Symfony 9.0." ⏎ } ⏎ ```
верноПолитика: деприкейшены живут до следующего мажора; 9.0 — ноябрь 2027.
T21-L1
0.12 c
TwigВнутри {{ }} в Twig можно вызывать произвольный PHP-код напрямую.«нет»
Пояснение: Twig по умолчанию не выполняет произвольный PHP-код внутри {{ }} без специальной настройки или использования определенных фильтров.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Twig по умолчанию не выполняет произвольный PHP-код внутри {{ }} без специальной настройки или использования определенных фильтров." ⏎ } ⏎ ```
верноTwig — DSL: только разрешённые окружением функции/фильтры; произвольный PHP не исполняется.
T21-L2
0.09 c
TwigTwig по умолчанию автоматически экранирует выводимые переменные.«да»
Пояснение: Twig по умолчанию экранирует выводимые переменные для предотвращения атак типа XSS.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Twig по умолчанию экранирует выводимые переменные для предотвращения атак типа XSS." ⏎ } ⏎ ```
верноAutoescape включён по умолчанию; {{ '<b>' }} → &lt;b&gt;. Проверено на Twig 3.30.
T21-L3
0.1 c
TwigФильтр |e в Twig экранирует строку для безопасного вывода в HTML-контексте.«да»
Пояснение: Фильтр |e в Twig экранирует вывод для защиты от XSS-атак.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Фильтр |e в Twig экранирует вывод для защиты от XSS-атак." ⏎ } ⏎ ```
верно|e ('html') по умолчанию; есть контексты js/url/css. От SQL-инъекций он не защищает — это задача подготовленных запросов Doctrine.
T21-L4
0.1 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.08 c
TwigФильтр |raw отключает автоэкранирование для значения.«да»
Пояснение: Фильтр 'raw' обычно отключает автоэкранирование для значения.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Фильтр 'raw' обычно отключает автоэкранирование для значения." ⏎ } ⏎ ```
верно{{ x|raw }} выводит HTML как есть; опасно с пользовательскими данными. Проверено на Twig 3.30.
T21-L6
0.11 c
TwigВ Twig {{ }} выводит значение выражения, а {% %} выполняет теги — условия, циклы, set.«да»
Пояснение: В Twig двойные фигурные скобки {{ }} используются для вывода значений, а фигурные скобки {% %} для тегов.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В Twig двойные фигурные скобки {{ }} используются для вывода значений, а фигурные скобки {% %} для тегов." ⏎ } ⏎ ```
верноДва блока синтаксиса Twig: вывод (echo) против логики.
T21-L7
0.11 c
TwigВ Twig нельзя объявить переменную в шаблоне — значения только передаются из контроллера.«нет»
Пояснение: В Twig можно объявлять переменные непосредственно в шаблоне с помощью оператора `{% set %}`.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В Twig можно объявлять переменные непосредственно в шаблоне с помощью оператора `{% set %}`." ⏎ } ⏎ ```
верно{% set y = ... %} объявляет переменную в шаблоне. Проверено на Twig 3.30.
T21-L8
0.1 c
TwigКакая функция Twig выводит отладочную структуру переменной (массива, объекта)?«true»
Пояснение: Функция `dump()` в Twig выводит отладочную информацию о переменной.
Raw
```json ⏎ { ⏎   "answer": "true", ⏎   "пояснение": "Функция `dump()` в Twig выводит отладочную информацию о переменной." ⏎ } ⏎ ```
неверно
верный: «dump»
{{ dump(x) }} (DebugExtension; в Symfony доступна в dev-окружении).
T24-L1
0.1 c
BootstrapBootstrap — это CSS/JS-библиотека готовых компонентов интерфейса, а не SPA-фреймворк.«да»
Пояснение: Bootstrap — это CSS/JS библиотека для быстрого создания адаптивных интерфейсов, а не полнофункциональный SPA-фреймворк.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Bootstrap — это CSS/JS библиотека для быстрого создания адаптивных интерфейсов, а не полнофункциональный SPA-фреймворк." ⏎ } ⏎ ```
верноКомпоненты и утилиты поверх вашего HTML; SPA-фреймворки (React/Vue) — другой класс инструментов. В проекте vendored 5.3.3.
T24-L2
0.09 c
BootstrapКакой класс Bootstrap задаёт адаптивный контейнер с фиксированной максимальной шириной по брейкпоинтам?«container»
Пояснение: Класс 'container' в Bootstrap используется для создания адаптивного контейнера с фиксированной максимальной шириной.
Raw
```json ⏎ { ⏎   "answer": "container", ⏎   "пояснение": "Класс 'container' в Bootstrap используется для создания адаптивного контейнера с фиксированной максимальной шириной." ⏎ } ⏎ ```
верно.container (фиксированная макс-ширина по брейкпоинтам) vs .container-fluid (на всю ширину).
T24-L3
0.08 c
BootstrapСетка Bootstrap построена на CSS float и делит строку на 16 колонок.«нет»
Пояснение: Сетка Bootstrap построена на CSS Flexbox, а не на CSS float.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Сетка Bootstrap построена на CSS Flexbox, а не на CSS float." ⏎ } ⏎ ```
верноНаоборот: flexbox (с Bootstrap 4) и 12 колонок; float-сетка — это Bootstrap 3.
T24-L4
0.13 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.11 c
BootstrapУтилиты вроде .mt-3 или .px-2 используют шаг spacing-шкалы: число — множитель $spacer.«да»
Пояснение: В этих утилитах число представляет собой множитель для стандартного значения $spacer.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В этих утилитах число представляет собой множитель для стандартного значения $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.1 c
BootstrapКакой data-атрибут Bootstrap 5 включает интерактивный компонент (например, dropdown) на элементе?«data-bs-toggle»
Пояснение: Атрибут data-bs-toggle используется для активации интерактивных компонентов Bootstrap.
Raw
```json ⏎ { ⏎   "answer": "data-bs-toggle", ⏎   "пояснение": "Атрибут data-bs-toggle используется для активации интерактивных компонентов Bootstrap." ⏎ } ⏎ ```
верноdata-bs-toggle="dropdown" и т.п.; в Bootstrap 4 атрибут назывался data-toggle.
T24-L7
0.09 c
BootstrapКомпоненты Bootstrap 5 работают без jQuery — на чистом vanilla JS.«да»
Пояснение: Bootstrap 5 использует только чистый JavaScript (Vanilla JS) для своей функциональности.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Bootstrap 5 использует только чистый JavaScript (Vanilla JS) для своей функциональности." ⏎ } ⏎ ```
верноjQuery удалён в Bootstrap 5.0: data-bs-* атрибуты и JS API. В проекте vendored 5.3.3.
T24-L8
0.09 c
BootstrapТёмную тему в Bootstrap включают классом .dark на корневом элементе.«да»
Пояснение: Класс .dark на корневом элементе включает темную тему в Bootstrap.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Класс .dark на корневом элементе включает темную тему в Bootstrap." ⏎ } ⏎ ```
неверно
верный: «нет»
Наоборот: тема включается атрибутом data-bs-theme="dark" (Color modes, с 5.3); класса .dark не существует. В проекте 5.3.3.
T14-L1
0.12 c
DoctrineDoctrine ORM сам создаёт таблицы в базе при первом обращении к сущности в рантайме.«нет»
Пояснение: Doctrine ORM обычно требует явного вызова миграции (например, с помощью Doctrine Migrations) для создания таблиц.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Doctrine ORM обычно требует явного вызова миграции (например, с помощью Doctrine Migrations) для создания таблиц." ⏎ } ⏎ ```
верноСхему создают инструменты (migrations, schema tool); рантайм структуру БД не меняет.
T14-L2
0.08 c
DoctrineКакой метод EntityManager помечает новый объект как управляемый, не выполняя SQL до flush()?«persist»
Пояснение: Метод persist помечает новый объект как управляемый в JPA/Hibernate.
Raw
```json ⏎ { ⏎   "answer": "persist", ⏎   "пояснение": "Метод persist помечает новый объект как управляемый в JPA/Hibernate." ⏎ } ⏎ ```
верноpersist() регистрирует объект в Unit of Work; INSERT выполняется на flush().
T14-L3
0.11 c
DoctrineВ Doctrine ORM 3 метод EntityManager::merge() доступен и делает переданный объект управляемым.«да»
Пояснение: Метод EntityManager::merge() используется для объединения сущности, управляемой менеджером, с сущностью, управляемой менеджером.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Метод EntityManager::merge() используется для объединения сущности, управляемой менеджером, с сущностью, управляемой менеджером." ⏎ } ⏎ ```
неверно
верный: «нет»
В ORM 3 merge() удалён (в vendor проекта 3.7.6 метода нет); в Doctrine 2.x merge() возвращал управляемую копию. Версия зафиксирована — ORM 3.
T14-L4
0.13 c
DoctrineDQL-запросы пишутся в терминах сущностей и их полей, а не таблиц и столбцов.«да»
Пояснение: DQL (Data Query Language) фокусируется на запросах к данным, описывая сущности и их поля, а не прямые операции с таблицами и столбцами.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "DQL (Data Query Language) фокусируется на запросах к данным, описывая сущности и их поля, а не прямые операции с таблицами и столбцами." ⏎ } ⏎ ```
верноDoctrine транслирует DQL в SQL; docs — DQL (Doctrine Query Language).
T14-L5
0.08 c
DoctrineЧто вернёт $repository->find(999), если записи с идентификатором 999 нет?«null»
Пояснение: Метод find обычно возвращает null, если запись не найдена.
Raw
```json ⏎ { ⏎   "answer": "null", ⏎   "пояснение": "Метод find обычно возвращает null, если запись не найдена." ⏎ } ⏎ ```
верноfind() возвращает null, если объект не найден (docs Repository methods).
T14-L6
0.11 c
DoctrineDoctrineBundle в Symfony автоматически вызывает flush() в конце каждого запроса.«нет»
Пояснение: DoctrineBundle не вызывает flush() автоматически в конце каждого запроса; явный вызов flush() требуется для сохранения изменений.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "DoctrineBundle не вызывает flush() автоматически в конце каждого запроса; явный вызов flush() требуется для сохранения изменений." ⏎ } ⏎ ```
верноАвто-flush нет — flush() зовёт разработчик; незакрытая транзакция в конце запроса откатывается.
T14-L7
0.14 c
DoctrineДля управляемой сущности достаточно изменить свойство: flush() зафиксирует изменение без вызова persist() — Unit of Work отслеживает изменения.«нет»
Пояснение: Для фиксации изменений в контексте Unit of Work, обычно требуется вызов persist() или аналогичного метода, а flush() может использоваться для сброса изменений в базу данных.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Для фиксации изменений в контексте Unit of Work, обычно требуется вызов persist() или аналогичного метода, а flush() может использоваться для сброса изменений в базу данных." ⏎ } ⏎ ```
неверно
верный: «да»
Dirty checking сравнивает снимки свойств; persist нужен только новым/отсоединённым объектам.
T14-L8
0.12 c
Doctrineremove() выполняет SQL DELETE сразу, не дожидаясь flush().«нет»
Пояснение: Метод remove() в PDO обычно не выполняет SQL DELETE немедленно, а возвращает объект, который нужно выполнить для фиксации изменений.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Метод remove() в PDO обычно не выполняет SQL DELETE немедленно, а возвращает объект, который нужно выполнить для фиксации изменений." ⏎ } ⏎ ```
верноremove() планирует удаление в Unit of Work; DELETE выполняется на flush() (docs — Deleting Objects).
T15-L1
0.1 c
PostgreSQLPostgreSQL использует MVCC, поэтому читатели блокируют писателей, а писатели — читателей.«нет»
Пояснение: В PostgreSQL MVCC позволяет читателям не блокировать писателей, а писателям не блокировать читателей.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В PostgreSQL MVCC позволяет читателям не блокировать писателей, а писателям не блокировать читателей." ⏎ } ⏎ ```
верноНаоборот: благодаря MVCC читатели не блокируют писателей и наоборот (снимки строк); docs PostgreSQL — Concurrency Control.
T15-L2
0.09 c
PostgreSQLКакая команда SQL показывает план выполнения запроса, не выполняя сам запрос?«explain»
Пояснение: Команда EXPLAIN используется для отображения плана выполнения SQL-запроса.
Raw
```json ⏎ { ⏎   "answer": "EXPLAIN", ⏎   "пояснение": "Команда EXPLAIN используется для отображения плана выполнения SQL-запроса." ⏎ } ⏎ ```
верноEXPLAIN без ANALYZE только строит план; проверено на PostgreSQL 17.7.
T15-L3
0.14 c
PostgreSQLSERIAL и GENERATED ... AS IDENTITY — это два названия одного и того же механизма.«нет»
Пояснение: SERIAL и GENERATED AS IDENTITY — это разные синтаксические конструкции, используемые в разных СУБД для создания автоинкрементных столбцов.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "SERIAL и GENERATED AS IDENTITY — это разные синтаксические конструкции, используемые в разных СУБД для создания автоинкрементных столбцов." ⏎ } ⏎ ```
верноSERIAL — нестандартный макрос (sequence + DEFAULT), IDENTITY — SQL-стандарт; различаются владением и правами. Оба есть в PG 17 (проверено).
T15-L4
0.14 c
PostgreSQLUNIQUE-ограничение PostgreSQL по умолчанию допускает только одну строку с NULL в столбце.«нет»
Пояснение: UNIQUE-ограничение PostgreSQL по умолчанию допускает несколько строк с NULL в столбце, если только не указано иное (например, UNIQUE (column) NOT NULL).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "UNIQUE-ограничение PostgreSQL по умолчанию допускает несколько строк с NULL в столбце, если только не указано иное (например, UNIQUE (column) NOT NULL)." ⏎ } ⏎ ```
верноНаоборот: NULLS DISTINCT по умолчанию — несколько NULL допустимы; NULLS NOT DISTINCT — опция с PG 15. Проверено на PG 17.7.
T15-L5
0.1 c
PostgreSQLКакая агрегатная функция PostgreSQL склеивает строки с разделителем?«string_agg»
Пояснение: Функция string_agg() используется для агрегации строк с указанным разделителем.
Raw
```json ⏎ { ⏎   "answer": "string_agg", ⏎   "пояснение": "Функция string_agg() используется для агрегации строк с указанным разделителем." ⏎ } ⏎ ```
верноstring_agg(значение, разделитель); проверено на PostgreSQL 17.7.
T15-L6
0.09 c
PostgreSQLОбычный VACUUM возвращает место, занятое «мёртвыми» кортежами, операционной системе.«нет»
Пояснение: VACUUM возвращает место, занятое мертвыми кортежами, в базу данных.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "VACUUM возвращает место, занятое мертвыми кортежами, в базу данных." ⏎ } ⏎ ```
верноVACUUM помечает место для переиспользования внутри таблицы; ОС его возвращает только VACUUM FULL (с эксклюзивной блокировкой).
T15-L7
0.08 c
PostgreSQLКакое ключевое слово в определении window-функции разбивает строки на группы, для которых считается функция?«array_filter»
Пояснение: Функция array_filter используется для фильтрации элементов массива.
Raw
```json ⏎ { ⏎   "answer": "array_filter", ⏎   "пояснение": "Функция array_filter используется для фильтрации элементов массива." ⏎ } ⏎ ```
неверно
верный: «partition by»
OVER (PARTITION BY ...); проверено на PostgreSQL 17.7.
T15-L8
0.12 c
PostgreSQLУровень изоляции READ COMMITTED защищает от неповторяющегося чтения (non-repeatable read).«нет»
Пояснение: Уровень изоляции READ COMMITTED защищает от чтения несинхронизированных изменений (dirty reads), но не от неповторяющегося чтения.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Уровень изоляции READ COMMITTED защищает от чтения несинхронизированных изменений (dirty reads), но не от неповторяющегося чтения." ⏎ } ⏎ ```
верноREAD COMMITTED допускает неповторяющееся чтение; защищает REPEATABLE READ. Проверено: SHOW transaction_isolation → read committed.
T17-L1
0.14 c
PostgreSQL: транзакции и индексыПо умолчанию PostgreSQL выполняет каждый отдельный SQL-оператор в собственной неявной транзакции (autocommit).«нет»
Пояснение: По умолчанию PostgreSQL не использует autocommit; каждая отдельная команда SQL выполняется в транзакции, которая будет зафиксирована, если это не явно указано иначе.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "По умолчанию PostgreSQL не использует autocommit; каждая отдельная команда SQL выполняется в транзакции, которая будет зафиксирована, если это не явно указано иначе." ⏎ } ⏎ ```
неверно
верный: «да»
Без BEGIN каждый оператор коммитится сам; docs PostgreSQL — Transactions. Проверено на PG 17.
T17-L2
0.09 c
PostgreSQL: транзакции и индексыКакая SQL-команда завершает транзакцию, сохраняя все её изменения?«commit»
Пояснение: Команда COMMIT фиксирует все изменения в текущей транзакции.
Raw
```json ⏎ { ⏎   "answer": "COMMIT", ⏎   "пояснение": "Команда COMMIT фиксирует все изменения в текущей транзакции." ⏎ } ⏎ ```
верноCOMMIT (END — синоним). Проверено на PG 17.
T17-L3
0.1 c
PostgreSQL: транзакции и индексыИндексы ускоряют не только SELECT: UPDATE и DELETE с поиском по индексированному столбцу тоже выигрывают.«да»
Пояснение: Индексы ускоряют операции чтения (SELECT), записи (UPDATE, DELETE) и поиск данных.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Индексы ускоряют операции чтения (SELECT), записи (UPDATE, DELETE) и поиск данных." ⏎ } ⏎ ```
верноПоиск строк для изменения идёт по индексу; docs PostgreSQL — Indexes.
T17-L4
0.11 c
PostgreSQL: транзакции и индексыДля отката части операторов внутри транзакции PostgreSQL использует SAVEPOINT.«да»
Пояснение: SAVEPOINT используется для создания точек сохранения внутри транзакции, позволяя откатиться к ним.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "SAVEPOINT используется для создания точек сохранения внутри транзакции, позволяя откатиться к ним." ⏎ } ⏎ ```
верноSAVEPOINT name; ROLLBACK TO name — частичный откат без отмены всей транзакции. Проверено на PG 17.
T17-L5
0.09 c
PostgreSQL: транзакции и индексыEXPLAIN ANALYZE показывает план запроса, не выполняя сам запрос.«да»
Пояснение: EXPLAIN ANALYZE используется для анализа плана выполнения запроса без его фактического выполнения.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "EXPLAIN ANALYZE используется для анализа плана выполнения запроса без его фактического выполнения." ⏎ } ⏎ ```
неверно
верный: «нет»
Наоборот: ANALYZE реально выполняет запрос (с побочными эффектами!) и показывает фактические времена узлов; план без выполнения — plain EXPLAIN.
T17-L6
0.1 c
PostgreSQL: транзакции и индексыКакое расширение PostgreSQL добавляет векторные типы и индексы для поиска по эмбеддингам?«pgvector»
Пояснение: Расширение pgvector добавляет векторные типы и индексы для работы с векторными данными в PostgreSQL.
Raw
```json ⏎ { ⏎   "answer": "pgvector", ⏎   "пояснение": "Расширение pgvector добавляет векторные типы и индексы для работы с векторными данными в PostgreSQL." ⏎ } ⏎ ```
верноCREATE EXTENSION vector (проект pgvector; в проекте образ pgvector/pgvector:pg17).
T17-L7
0.09 c
PostgreSQL: транзакции и индексыЧастичный индекс (CREATE INDEX ... WHERE ...) строится только по строкам, удовлетворяющим условию.«да»
Пояснение: Частичный индекс индексирует только те строки, которые соответствуют заданному условию.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Частичный индекс индексирует только те строки, которые соответствуют заданному условию." ⏎ } ⏎ ```
верноdocs PostgreSQL — Partial Indexes; типичный кейс — индекс по «активным» записям.
T17-L8
0.12 c
PostgreSQL: транзакции и индексыУровень SERIALIZABLE в PostgreSQL реализован блокировкой строк, которые читает транзакция.«да»
Пояснение: Уровень SERIALIZABLE в PostgreSQL обеспечивает изоляцию, которая предотвращает аномалии, включая те, что возникают из-за блокировок строк.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Уровень SERIALIZABLE в PostgreSQL обеспечивает изоляцию, которая предотвращает аномалии, включая те, что возникают из-за блокировок строк." ⏎ } ⏎ ```
неверно
верный: «нет»
SSI (Serializable Snapshot Isolation): предикатные блокировки на снимках, не блокировки прочитанных строк; docs PostgreSQL.
T19-L1
0.09 c
HTTP и REST APIHTTP-статус 201 означает, что в результате запроса создан новый ресурс.«да»
Пояснение: HTTP-статус 201 Created означает, что ресурс был успешно создан в результате выполнения запроса.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "HTTP-статус 201 Created означает, что ресурс был успешно создан в результате выполнения запроса." ⏎ } ⏎ ```
верно201 Created; обычно на POST, часто с Location; RFC 9110.
T19-L2
0.11 c
HTTP и REST APIКакой HTTP-статус означает успешный запрос с пустым телом ответа (например, после DELETE)?«204»
Пояснение: Статус 204 No Content используется для успешного запроса, для которого нет содержимого в теле ответа.
Raw
```json ⏎ { ⏎   "answer": 204, ⏎   "пояснение": "Статус 204 No Content используется для успешного запроса, для которого нет содержимого в теле ответа." ⏎ } ⏎ ```
верно204 No Content; RFC 9110.
T19-L3
0.12 c
HTTP и REST APIМетод DELETE идемпотентен по спецификации HTTP: повторный запрос по тому же ресурсу не меняет результат.«да»
Пояснение: Метод DELETE является идемпотентным, так как повторное выполнение не приводит к дополнительным изменениям состояния ресурса после первого успешного удаления.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Метод DELETE является идемпотентным, так как повторное выполнение не приводит к дополнительным изменениям состояния ресурса после первого успешного удаления." ⏎ } ⏎ ```
верноRFC 9110: DELETE идемпотентен (как PUT); идемпотентность ≠ безопасность — ресурс удаляется при первом вызове.
T19-L4
0.1 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.09 c
HTTP и REST APIКод 429 Too Many Requests используется, когда клиент превысил лимит запросов (rate limiting).«да»
Пояснение: Код 429 указывает на то, что клиент превысил лимит запросов.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Код 429 указывает на то, что клиент превысил лимит запросов." ⏎ } ⏎ ```
верно429 (+ Retry-After); RFC 6585. В проекте symfony/rate-limiter.
T19-L6
0.08 c
HTTP и REST APIКоды 5xx означают ошибку клиента, а 4xx — ошибку на стороне сервера.«нет»
Пояснение: Коды 5xx означают ошибки сервера, а 4xx — ошибки клиента.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Коды 5xx означают ошибки сервера, а 4xx — ошибки клиента." ⏎ } ⏎ ```
верноНаоборот: 4xx — ошибка клиента (400, 404), 5xx — сервера (500, 503); классы статусов RFC 9110.
T19-L7
0.08 c
HTTP и REST APIКакой HTTP-заголовок указывает MIME-тип тела запроса или ответа?«content-type»
Пояснение: Заголовок Content-Type используется для указания MIME-типа тела сообщения.
Raw
```json ⏎ { ⏎   "answer": "Content-Type", ⏎   "пояснение": "Заголовок Content-Type используется для указания MIME-типа тела сообщения." ⏎ } ⏎ ```
верноContent-Type: application/json и т.п.
T19-L8
0.11 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.14 c
Безопасность и OAuthПроверить пароль достаточно сравнением его хеша с хешем из базы обычным оператором ==.«нет»
Пояснение: Сравнение хешей должно производиться с использованием функций сравнения, устойчивых к атакам по словарю, например, password_verify().
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Сравнение хешей должно производиться с использованием функций сравнения, устойчивых к атакам по словарю, например, password_verify()." ⏎ } ⏎ ```
верноНужна постоянновременная проверка (password_verify) — timing-атаки; соль и алгоритм уже внутри хеша.
T20-L2
0.12 c
Безопасность и OAuthCSRF-токен выдаётся сервером (привязан к сессии) и проверяется на сервере при unsafe-запросах (POST и т.п.).«да»
Пояснение: CSRF-токен часто генерируется сервером и проверяется на сервере для защиты от межсайтовых запросов.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "CSRF-токен часто генерируется сервером и проверяется на сервере для защиты от межсайтовых запросов." ⏎ } ⏎ ```
верноsymfony/security-csrf в проекте; защита от подделки межсайтовой формы.
T20-L3
0.09 c
Безопасность и OAuthКакой HTTP-заголовок включает политику CSP (Content Security Policy)?«content-security-policy»
Пояснение: Заголовок, который устанавливает политику CSP, называется Content-Security-Policy.
Raw
```json ⏎ { ⏎   "answer": "Content-Security-Policy", ⏎   "пояснение": "Заголовок, который устанавливает политику CSP, называется Content-Security-Policy." ⏎ } ⏎ ```
верноContent-Security-Policy; белые списки источников скриптов/стилей против XSS.
T20-L4
0.1 c
Безопасность и OAuthOAuth 2.0 — протокол аутентификации: access-токен сообщает, кто именно пользователь.«нет»
Пояснение: Access-токен обычно содержит информацию о правах доступа, а не о конкретном пользователе напрямую.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Access-токен обычно содержит информацию о правах доступа, а не о конкретном пользователе напрямую." ⏎ } ⏎ ```
верноOAuth 2.0 — авторизация/делегирование доступа; аутентификацию добавляет OpenID Connect. В проекте knpuniversity/oauth2-client-bundle (yandex/github/google).
T20-L5
0.11 c
Безопасность и OAuthXSS предотвращается валидацией ввода на сервере перед записью в базу.«нет»
Пояснение: XSS предотвращается путем экранирования (escaping) вывода данных, а не только валидации ввода на сервере.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "XSS предотвращается путем экранирования (escaping) вывода данных, а не только валидации ввода на сервере." ⏎ } ⏎ ```
верноXSS лечится контекстным экранированием НА ВЫВОДЕ (Twig autoescape, CSP); валидация ввода не покрывает все контексты вывода.
T20-L6
0.1 c
Безопасность и OAuthВ authorization code flow OAuth 2.0 какой параметр приходит в redirect_uri и обменивается на access-токен?«code»
Пояснение: В authorization code flow, параметр `code` (код авторизации) является тем, что обменивается на access-токен.
Raw
```json ⏎ { ⏎   "answer": "code", ⏎   "пояснение": "В authorization code flow, параметр `code` (код авторизации) является тем, что обменивается на access-токен." ⏎ } ⏎ ```
верноПараметр code; обмен на токен POST-ом на /token с client_secret.
T20-L7
0.08 c
Безопасность и OAuthRefresh-токен живёт дольше access-токена и позволяет получить новый access-токен без повторного входа пользователя.«да»
Пояснение: Refresh-токен используется для получения нового access-токена без повторного входа пользователя.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Refresh-токен используется для получения нового access-токена без повторного входа пользователя." ⏎ } ⏎ ```
верноСтандартная схема OAuth/OIDC: короткий access + длинный refresh.
T20-L8
0.11 c
Безопасность и OAuthСоль пароля нужно держать в секрете: без неё хеш нельзя проверить.«да»
Пояснение: Соль пароля необходима для создания уникального хеша для каждого пароля и позволяет проверять пароль.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Соль пароля необходима для создания уникального хеша для каждого пароля и позволяет проверять пароль." ⏎ } ⏎ ```
неверно
верный: «нет»
Соль хранится открыто (password_hash включает её в строку хеша); секретность соли не нужна.
T18-L1
0.09 c
Тестирование: PHPUnitPHPUnit выполняет тестовые методы любого класса — наследовать TestCase не обязательно.«нет»
Пояснение: Для выполнения тестовых методов класса необходимо наследовать класс TestCase.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Для выполнения тестовых методов класса необходимо наследовать класс TestCase." ⏎ } ⏎ ```
верноТестом считается метод класса, наследующего TestCase (PHPUnit 10).
T18-L2
0.09 c
Тестирование: PHPUnitМетод setUp() в PHPUnit вызывается один раз перед всеми тестами класса.«да»
Пояснение: Метод setUp() в PHPUnit вызывается один раз перед выполнением каждого теста в классе.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "Метод setUp() в PHPUnit вызывается один раз перед выполнением каждого теста в классе." ⏎ } ⏎ ```
неверно
верный: «нет»
setUp() — перед КАЖДЫМ тестом; один раз на класс — setUpBeforeClass(). Проверено живым счётчиком на PHPUnit 10.5.
T18-L3
0.08 c
Тестирование: PHPUnitПоставщик данных (data provider) позволяет прогнать тест ровно с одним набором аргументов.«нет»
Пояснение: Поставщик данных может предоставлять множество наборов аргументов для тестирования.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Поставщик данных может предоставлять множество наборов аргументов для тестирования." ⏎ } ⏎ ```
верноНаоборот: наборов может быть сколько угодно — тест выполняется по разу на каждый. Проверено на PHPUnit 10.5 (#[DataProvider]).
T18-L4
0.14 c
Тестирование: PHPUnitКакой метод PHPUnit объявляет ожидание исключения определённого класса?«expectexception(\app\exception\specificexception::class)»
Пояснение: Метод expectException используется для ожидания, что в тесте будет выброшено указанное исключение.
Raw
```json ⏎ { ⏎   "answer": "expectException(\App\Exception\SpecificException::class)", ⏎   "пояснение": "Метод expectException используется для ожидания, что в тесте будет выброшено указанное исключение." ⏎ } ⏎ ```
верно$this->expectException(\LogicException::class); проверено на PHPUnit 10.5.
T18-L5
0.1 c
Тестирование: PHPUnitВ PHPUnit стаб (stub) проверяет, какие методы на нём вызывали, а мок (mock) только подставляет данные.«нет»
Пояснение: Stub проверяет вызовы методов, а мок подставляет данные и проверяет их использование.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Stub проверяет вызовы методов, а мок подставляет данные и проверяет их использование." ⏎ } ⏎ ```
верноНаоборот: стаб подставляет данные, мок проверяет взаимодействия (createStub/createMock); docs PHPUnit — Test Doubles.
T18-L6
0.1 c
Тестирование: PHPUnitВ PHPUnit 10+ рекомендуемый способ передачи данных в тест — атрибут #[DataProvider] (аннотация @dataProvider устарела).«да»
Пояснение: В PHPUnit 10+ рекомендуемый способ для предоставления данных в тесты — использование атрибута #[DataProvider].
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В PHPUnit 10+ рекомендуемый способ для предоставления данных в тесты — использование атрибута #[DataProvider]." ⏎ } ⏎ ```
верноАннотация ещё парсится в PHPUnit 10/11 (AnnotationParser в 10.5.66), удаление — в 12; атрибут — стандарт.
T18-L7
0.12 c
Тестирование: PHPUnitВ PHPUnit нельзя объявить зависимость одного теста от результата другого.«нет»
Пояснение: В PHPUnit можно настроить зависимости между тестами, например, используя классы-зависимости или методы-хуки.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В PHPUnit можно настроить зависимости между тестами, например, используя классы-зависимости или методы-хуки." ⏎ } ⏎ ```
верноЗависимости есть: #[Depends] — зависимый тест не запустится, еслиProducer упал.
T18-L8
0.08 c
Тестирование: PHPUnitКакая опция командной строки PHPUnit включает случайный порядок выполнения тестов?«random»
Пояснение: Опция '--random' включает случайный порядок выполнения тестов в PHPUnit.
Raw
```json ⏎ { ⏎   "answer": "random", ⏎   "пояснение": "Опция '--random' включает случайный порядок выполнения тестов в PHPUnit." ⏎ } ⏎ ```
неверно
верный: «--order-by=random»
--order-by=random (PHPUnit 9+); опция есть в --help PHPUnit 10.5 (проектная).
T01-L9
2.56 c
Синтаксис и операторыЧто выведет этот код? ```php echo intdiv(7, 2) . intdiv(-7, 2); ```«-4 -4»
Пояснение: intdiv выполняет целочисленное деление, поэтому intdiv(7, 2) равно 3, а intdiv(-7, 2) равно -4.
Raw
```json ⏎ { ⏎   "answer": "-4 -4", ⏎   "пояснение": "intdiv выполняет целочисленное деление, поэтому intdiv(7, 2) равно 3, а intdiv(-7, 2) равно -4." ⏎ } ⏎ ```
неверно
верный: «3-3»
intdiv обрезает к нулю: intdiv(-7, 2) = -3, не -4.
T01-L10
0.09 c
Синтаксис и операторыЧто выведет этот код? ```php echo -3 ** 2; ```«9»
Пояснение: Возведение числа -3 в квадрат дает 9.
Raw
```json ⏎ { ⏎   "answer": 9, ⏎   "пояснение": "Возведение числа -3 в квадрат дает 9." ⏎ } ⏎ ```
неверно
верный: «-9»
** правоассоциативен и связывает крепче унарного минуса: -(3²).
T02-L9
0.11 c
Типы и сравненияЧто выведет этот код? ```php echo '1e1' == '10' ? 'true' : 'false'; ```«false»
Пояснение: Строка '1e1' не равна строке '10' в строгом сравнении.
Raw
```json ⏎ { ⏎   "answer": "false", ⏎   "пояснение": "Строка '1e1' не равна строке '10' в строгом сравнении." ⏎ } ⏎ ```
неверно
верный: «true»
Обе строки числовые — сравнение как чисел: 10 == 10.
T02-L10
0.12 c
Типы и сравненияЧто выведет этот код? ```php switch ('a') { case 0: echo 'zero'; break; default: echo 'other'; } ```«other»
Пояснение: Поскольку 'a' не совпадает ни с одним из случаев, выполняется код в блоке default.
Raw
```json ⏎ { ⏎   "answer": "other", ⏎   "пояснение": "Поскольку 'a' не совпадает ни с одним из случаев, выполняется код в блоке default." ⏎ } ⏎ ```
верноPHP 8: 'a' == 0 → false (раньше было true) — срабатывает default.
T03-L9
0.15 c
СтрокиЧто выведет этот код? ```php echo strtr('abc', ['a' => '1', 'ab' => '2']); ```«1»
Пояснение: Функция strtr заменяет подстроки, но в данном случае она ищет 'abc' и заменяет 'a' на '1' в контексте поиска, что приводит к результату '1'.
Raw
```json ⏎ { ⏎   "answer": "1", ⏎   "пояснение": "Функция strtr заменяет подстроки, но в данном случае она ищет 'abc' и заменяет 'a' на '1' в контексте поиска, что приводит к результату '1'." ⏎ } ⏎ ```
неверно
верный: «2c»
strtr с массивом предпочитает самое длинное совпадение ключа.
T03-L10
0.12 c
СтрокиЧто выведет этот код? ```php echo '[' . substr('hello', -10) . ']'; ```«['h']»
Пояснение: substr('hello', -10) извлекает первые символы, начиная с конца строки, и в данном случае возвращает 'h'.
Raw
```json ⏎ { ⏎   "answer": "['h']", ⏎   "пояснение": "substr('hello', -10) извлекает первые символы, начиная с конца строки, и в данном случае возвращает 'h'." ⏎ } ⏎ ```
неверно
верный: «[hello]»
Отрицательный старт за пределами строки зажимается к началу.
T04-L9
0.13 c
МассивыЧто выведет этот код? ```php $a = ['k' => 1, 'n' => 2]; $b = ['k' => 9, 'm' => 3]; echo implode(',', array_keys($a + $b)); ```«k,n,m»
Пояснение: Оператор сложения для массивов с ассоциативными ключами объединяет массивы, а array_keys извлекает ключи.
Raw
```json ⏎ { ⏎   "answer": "k,n,m", ⏎   "пояснение": "Оператор сложения для массивов с ассоциативными ключами объединяет массивы, а array_keys извлекает ключи." ⏎ } ⏎ ```
верноОператор + : при дубликатах строковых ключей побеждает левый массив.
T04-L10
0.13 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)); ```«xyz»
Пояснение: Функция usort сортирует массив по третьему элементу (индекс 2), а затем implode объединяет второй элемент всех подмассивов.
Raw
```json ⏎ { ⏎   "answer": "xyz", ⏎   "пояснение": "Функция usort сортирует массив по третьему элементу (индекс 2), а затем implode объединяет второй элемент всех подмассивов." ⏎ } ⏎ ```
неверно
верный: «yxz»
Сортировка стабильна с 8.0: x и z при равном ключе сохраняют порядок.
T05-L10
2.05 c
Функции и замыканияЧто выведет этот код? ```php function f(int $a, int $b): int { return $a - $b; } echo f(...['b' => 1, 'a' => 5]); ```«syntaxerror»
Пояснение: Вызов функции с аргументами, переданными в виде ассоциативного массива, вызовет ошибку синтаксиса.
Raw
```json ⏎ { ⏎   "answer": "SyntaxError", ⏎   "пояснение": "Вызов функции с аргументами, переданными в виде ассоциативного массива, вызовет ошибку синтаксиса." ⏎ } ⏎ ```
неверно
верный: «4»
Строковые ключи распакованного массива становятся именованными аргументами.
T05-L9
0.17 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(); ```«fatal error: call to a member function on null»
Пояснение: Вызов метода $f() произойдет с ошибкой, так как $p был установлен в null, а $f содержит результат вызова метода.
Raw
```json ⏎ { ⏎   "answer": "Fatal error: Call to a member function on null", ⏎   "пояснение": "Вызов метода $f() произойдет с ошибкой, так как $p был установлен в null, а $f содержит результат вызова метода." ⏎ } ⏎ ```
неверно
верный: «3»
Первая-class callable синтаксис привязывает $this при создании.
T06-L9
0.1 c
ООП: классы и наследованиеЧто выведет этот код? ```php class A { public function who(): string { return static::class; } } class B extends A {} echo (new B)->who(); ```«b»
Пояснение: Метод who() возвращает имя класса, на котором был вызван метод, то есть B.
Raw
```json ⏎ { ⏎   "answer": "B", ⏎   "пояснение": "Метод who() возвращает имя класса, на котором был вызван метод, то есть B." ⏎ } ⏎ ```
верноПозднее статическое связывание: static::class = класс получателя.
T06-L10
0.11 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 вызывает метод с умножением значения на 2 (5 * 2 = 10).
Raw
```json ⏎ { ⏎   "answer": 10, ⏎   "пояснение": "Установка свойства $x вызывает метод с умножением значения на 2 (5 * 2 = 10)." ⏎ } ⏎ ```
верноВнутри set-хука $this->x пишет в backing store (без рекурсии): 5*2.
T07-L9
0.11 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»
Пояснение: TB::f вместо TA при использовании trait, а TA::f как g ссылается на метод TA::f.
Raw
```json ⏎ { ⏎   "answer": "BA", ⏎   "пояснение": "TB::f вместо TA при использовании trait, а TA::f как g ссылается на метод TA::f." ⏎ } ⏎ ```
верноinsteadof выбирает реализацию, as оставляет вторую под другим именем.
T07-L10
0.13 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»
Пояснение: Статическая переменная `$n` в трейте является статическим свойством класса, и доступ к ней осуществляется через класс, использующий трейт.
Raw
```json ⏎ { ⏎   "answer": "1", ⏎   "пояснение": "Статическая переменная `$n` в трейте является статическим свойством класса, и доступ к ней осуществляется через класс, использующий трейт." ⏎ } ⏎ ```
неверно
верный: «0»
Статическое свойство трейта копируется в каждый использующий класс.
T08-L10
0.13 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.1 c
Исключения и ошибкиЧто выведет этот код? ```php try { try { throw new RuntimeException('first'); } finally { throw new LogicException('second'); } } catch (LogicException $e) { echo $e->getMessage(); } ```«second»
Пояснение: Обработчик LogicException перехватывает исключение, и выводится его сообщение.
Raw
```json ⏎ { ⏎   "answer": "second", ⏎   "пояснение": "Обработчик LogicException перехватывает исключение, и выводится его сообщение." ⏎ } ⏎ ```
верноИсключение из finally подменяет уже летящее — ловится последнее.
T09-L9
0.15 c
Пространства имён и автозагрузкаЧто выведет этот код? ```php namespace N; use App\Foo as Baz; echo Baz::class . '|' . \Baz::class; ```«n\app\foo|n\app\foo»
Пояснение: Код выведет полный путь к классу Baz, используя префикс пространства имен.
Raw
```json ⏎ { ⏎   "answer": "N\\App\\Foo|N\\App\\Foo", ⏎   "пояснение": "Код выведет полный путь к классу Baz, используя префикс пространства имен." ⏎ } ⏎ ```
неверно
верный: «app\foo|baz»
use-алиас действует на неквалифицированные имена; ведущий \ уводит в глобальную область.
T09-L10
0.09 c
Пространства имён и автозагрузкаЧто выведет этот код? ```php namespace Ns; class Foo {} $c = 'Foo'; echo (class_exists($c) ? 'yes' : 'no') . (class_exists(__NAMESPACE__ . '\\' . $c) ? 'yes' : 'no'); ```«no»
Пояснение: Класс Foo не существует, и класс Ns\Foo также не существует.
Raw
```json ⏎ { ⏎   "answer": "no", ⏎   "пояснение": "Класс Foo не существует, и класс Ns\\Foo также не существует." ⏎ } ⏎ ```
неверно
верный: «noyes»
Динамические имена не резолвятся относительно namespace — 'Foo' это глобальный класс.
T10-L9
0.12 c
Ссылки и область видимостиЧто выведет этот код? ```php $a = [1, 2, 3]; foreach ($a as &$v) {} $v = 99; echo implode(',', $a); ```«1,2,3»
Пояснение: Переменная $v не изменила массив $a, поэтому implode выводит исходный массив.
Raw
```json ⏎ { ⏎   "answer": "1,2,3", ⏎   "пояснение": "Переменная $v не изменила массив $a, поэтому implode выводит исходный массив." ⏎ } ⏎ ```
неверно
верный: «1,2,99»
После foreach по ссылке $v остаётся ссылкой на последний элемент.
T10-L10
0.13 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»
Пояснение: Статическая переменная `$n` принадлежит классу `A` и используется как для экземпляров `A`, так и `B`.
Raw
```json ⏎ { ⏎   "answer": "2", ⏎   "пояснение": "Статическая переменная `$n` принадлежит классу `A` и используется как для экземпляров `A`, так и `B`." ⏎ } ⏎ ```
неверно
верный: «3»
static-переменная метода одна на метод родителя — наследники делят её.
T11-L9
0.14 c
Генераторы, итераторы, SPLЧто выведет этот код? ```php function g(): Generator { $x = yield 1; return $x + 1; } $g = g(); $g->send(10); echo $g->getReturn(); ```«11»
Пояснение: Первый yield возвращает 1, затем $x становится 1, и функция возвращает 1 + 1 = 2. После send(10), функция возвращает 10 + 1 = 11.
Raw
```json ⏎ { ⏎   "answer": "11", ⏎   "пояснение": "Первый yield возвращает 1, затем $x становится 1, и функция возвращает 1 + 1 = 2. После send(10), функция возвращает 10 + 1 = 11." ⏎ } ⏎ ```
верноsend() возобновляет генератор: $x = 10, return 10+1.
T11-L10
0.13 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»
Пояснение: Генератор inner() выводит 1 и 2, а outer() возвращает их в виде массива, который затем объединяется через запятую.
Raw
```json ⏎ { ⏎ "answer": "1,2,ok", ⏎ "пояснение": "Генератор inner() выводит 1 и 2, а outer() возвращает их в виде массива, который затем объединяется через запятую." ⏎ } ⏎ ```
неверно
верный: «ok,2»
yield from не двигает авто-ключ внешнего генератора: yield $r получает ключ 0 и перезаписывает единицу — 'ok' оказывается первым.
T12-L9
0.15 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'; ```«no»
Пояснение: Функция password_needs_rehash вернет 'no', так как хеш был создан с cost 4, а проверка производится с cost 5, и для этого не требуется перехеширование.
Raw
```json ⏎ { ⏎   "answer": "no", ⏎   "пояснение": "Функция password_needs_rehash вернет 'no', так как хеш был создан с cost 4, а проверка производится с cost 5, и для этого не требуется перехеширование." ⏎ } ⏎ ```
неверно
верный: «noyes»
password_needs_rehash сравнивает параметры хэша с целевыми: cost 4 = 4 → 'no', cost 5 ≠ 4 → 'yes'.
T12-L10
0.17 c
Конфигурация и безопасностьЧто выведет этот код на PHP 8.5? ```php echo (E_ALL & 2048) === 0 ? 'strict-out' : 'strict-in'; ```«strict-out»
Пояснение: Константа E_ALL (обычно 0x7F) в битовом сравнении с 2048 дает ненулевой результат, что приводит к выполнению блока true.
Raw
```json ⏎ { ⏎   "answer": "strict-out", ⏎   "пояснение": "Константа E_ALL (обычно 0x7F) в битовом сравнении с 2048 дает ненулевой результат, что приводит к выполнению блока true." ⏎ } ⏎ ```
верноВ PHP 8.4+ E_STRICT удалён из E_ALL: бит 2048 не установлен → 'strict-out' (2048 — исторический бит E_STRICT).
T13-L9
0.11 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»
Пояснение: Метод get('X-Token') извлекает значение заголовка, а сравнение возвращает true.
Raw
```json ⏎ { ⏎   "answer": "mapped", ⏎   "пояснение": "Метод get('X-Token') извлекает значение заголовка, а сравнение возвращает true." ⏎ } ⏎ ```
верноСравнение с литералом требует знания маппинга: HttpFoundation переводит HTTP_X_TOKEN в заголовок X-Token (регистр не важен); не знающий маппинг ответит 'missing'.
T13-L10
0.27 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; ```«abc»
Пояснение: События обрабатываются в порядке их приоритета, а затем в порядке регистрации (при равном приоритете). В данном случае, поскольку все слушатели имеют приоритет по умолчанию (или одинаковый), порядок вызова зависит от времени регистрации или реализации диспетчера, но для простых случаев часто соответствует порядку регистрации или приоритету.
Raw
```json ⏎ { ⏎   "answer": "ABC", ⏎   "пояснение": "События обрабатываются в порядке их приоритета, а затем в порядке регистрации (при равном приоритете). В данном случае, поскольку все слушатели имеют приоритет по умолчанию (или одинаковый), порядок вызова зависит от времени регистрации или реализации диспетчера, но для простых случаев часто соответствует порядку регистрации или приоритету." ⏎ } ⏎ ```
неверно
верный: «bca»
Порядок листенеров — по убыванию приоритета: 10 (B), 5 (C), 0 (A).
T14-L10
0.1 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»
Пояснение: EntityManager вернет один и тот же объект при поиске по первичному ключу.
Raw
```json ⏎ { ⏎   "answer": "same", ⏎   "пояснение": "EntityManager вернет один и тот же объект при поиске по первичному ключу." ⏎ } ⏎ ```
верноIdentity map: повторный find того же id возвращает тот же инстанс.
T14-L9
0.13 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, запись из базы данных будет удалена, поэтому счетчик будет равен нулю.
Raw
```json ⏎ { ⏎   "answer": "0", ⏎   "пояснение": "После удаления сущности и вызова flush, запись из базы данных будет удалена, поэтому счетчик будет равен нулю." ⏎ } ⏎ ```
верноUnit of work откладывает INSERT до flush: remove после persist отменяет вставку.
T15-L10
0.12 c
PostgreSQLЧто вернёт этот SQL-запрос (PostgreSQL 17)? ```sql CREATE TEMP TABLE t (x int); INSERT INTO t VALUES (1), (NULL); SELECT count(x) FROM t; ```«2»
Пояснение: COUNT(x) считает количество не-NULL значений в столбце x, а NULL не учитывается.
Raw
```json ⏎ { ⏎   "answer": "2", ⏎   "пояснение": "COUNT(x) считает количество не-NULL значений в столбце x, а NULL не учитывается." ⏎ } ⏎ ```
неверно
верный: «1»
count(столбец) не считает NULL; count(*) считал бы 2.
T15-L9
0.17 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,50»
Пояснение: Функция string_agg агрегирует значения 'x' с помощью запятой, а оконная функция вычисляет сумму с упорядочиванием по 'id'.
Raw
```json ⏎ { ⏎   "answer": "10,30,50", ⏎   "пояснение": "Функция string_agg агрегирует значения 'x' с помощью запятой, а оконная функция вычисляет сумму с упорядочиванием по 'id'." ⏎ } ⏎ ```
неверно
верный: «10,30,60»
С ORDER BY кадр окна по умолчанию — running (от начала до текущей строки).
T16-L9
0.1 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»
Пояснение: Код выведет теги каждого экземпляра класса Trace при обработке сообщения.
Raw
```json ⏎ { ⏎   "answer": "M1M2", ⏎   "пояснение": "Код выведет теги каждого экземпляра класса Trace при обработке сообщения." ⏎ } ⏎ ```
верноПервым добавленный middleware выполняется первым (внешний).
T16-L10
0.13 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; ```«10»
Пояснение: Первый обработчик увеличивает $n$ на 1, а второй — на 10, поэтому итоговое значение $n$ будет 10.
Raw
```json ⏎ { ⏎   "answer": "10", ⏎   "пояснение": "Первый обработчик увеличивает $n$ на 1, а второй — на 10, поэтому итоговое значение $n$ будет 10." ⏎ } ⏎ ```
неверно
верный: «11»
Все зарегистрированные хендлеры сообщения вызываются: 1 + 10 = 11.
T17-L9
0.14 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»
Пояснение: После двух вставок с конфликтом DO NOTHING в таблице останется одна запись (1), поэтому count(*) вернёт 1.
Raw
```json ⏎ { ⏎   "answer": 1, ⏎   "пояснение": "После двух вставок с конфликтом DO NOTHING в таблице останется одна запись (1), поэтому count(*) вернёт 1." ⏎ } ⏎ ```
верноON CONFLICT DO NOTHING пропускает дубликат: вставка одна.
T17-L10
0.11 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; ```«2»
Пояснение: Временная таблица разрешает вставку одинаковых значений, поэтому она содержит две строки.
Raw
```json ⏎ { ⏎   "answer": 2, ⏎   "пояснение": "Временная таблица разрешает вставку одинаковых значений, поэтому она содержит две строки." ⏎ } ⏎ ```
верноDEFERRED откладывает проверку уникальности до COMMIT — count видит 2 строки.
T18-L9
0.1 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)«1»
Пояснение: Фильтр `--filter test_sum` выполнит только метод test_sum.
Raw
```json ⏎ { ⏎ "answer": "1", ⏎ "пояснение": "Фильтр `--filter test_sum` выполнит только метод test_sum." ⏎ } ⏎ ```
неверно
верный: «6»
--filter — подстрочное совпадение: test_sum ловит и test_sum_abs (3+3 датасета).
T18-L10
0.17 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,0»
Пояснение: Команда выполнит 2 теста, и ни один из них не завершится с ошибкой (failure), так как оба входных значения не удовлетворяют условию $x > 0$.
Raw
```json ⏎ { ⏎ "answer": "2,0", ⏎ "пояснение": "Команда выполнит 2 теста, и ни один из них не завершится с ошибкой (failure), так как оба входных значения не удовлетворяют условию $x > 0$." ⏎ } ⏎ ```
неверно
верный: «2,1»
Не-static провайдер — только deprecation в PHPUnit 10: оба датасета выполнятся, датасет [-1] валит assert — 2 выполнено, 1 failure.
T19-L9
0.12 c
HTTP и REST APIКакой HTTP-метод отправит эта команда? ```bash curl -s -d 'a=1' http://demo.local/api ```«post»
Пояснение: Флаг `-d` в `curl` используется для отправки данных в теле запроса, что обычно соответствует методу POST.
Raw
```json ⏎ { ⏎   "answer": "POST", ⏎   "пояснение": "Флаг `-d` в `curl` используется для отправки данных в теле запроса, что обычно соответствует методу POST." ⏎ } ⏎ ```
верно-d/-F переключает curl на POST по умолчанию.
T19-L10
0.1 c
HTTP и REST APIКакой HTTP-метод отправит эта команда? ```bash curl -s -G -d 'a=1' http://demo.local/api ```«post»
Пояснение: Флаг `-d` в curl используется для отправки данных с помощью метода POST.
Raw
```json ⏎ { ⏎   "answer": "POST", ⏎   "пояснение": "Флаг `-d` в curl используется для отправки данных с помощью метода POST." ⏎ } ⏎ ```
неверно
верный: «get»
-G превращает данные из -d в query string, метод остаётся GET.
T20-L9
0.13 c
Безопасность и OAuthКлиент обращается к токен-эндпоинту (RFC 6749) с несуществующим client_id. Какое значение поля error вернёт эндпоинт?«401 unauthorized»
Пояснение: Несуществующий client_id обычно приводит к ошибке авторизации (401), так как токен не может быть валидирован.
Raw
```json ⏎ { ⏎   "answer": "401 Unauthorized", ⏎   "пояснение": "Несуществующий client_id обычно приводит к ошибке авторизации (401), так как токен не может быть валидирован." ⏎ } ⏎ ```
неверно
верный: «invalid_client»
Неизвестный клиент → invalid_client (RFC 6749 §5.2).
T20-L10
0.11 c
Безопасность и OAuthOAuth 2.0: клиент начал поток с response_type=token. В какой части redirect_uri авторизационный сервер передаёт access_token?«redirect_uri»
Пояснение: Access token обычно передается в параметре фрагмента (fragment) в перенаправлении обратно к redirect_uri.
Raw
```json ⏎ { ⏎   "answer": "redirect_uri", ⏎   "пояснение": "Access token обычно передается в параметре фрагмента (fragment) в перенаправлении обратно к redirect_uri." ⏎ } ⏎ ```
неверно
верный: «fragment»
Implicit-поток передаёт токен в фрагменте URL (#) — он не уходит на сервер.
T21-L9
0.14 c
TwigЧто выведет этот шаблон Twig? ```twig {{ false|default(2) * 3 }} ```«6»
Пояснение: Поскольку false не является истинным значением, используется значение по умолчанию (2), и затем результат умножается на 3 (2 * 3 = 6).
Raw
```json ⏎ { ⏎   "answer": 6, ⏎   "пояснение": "Поскольку false не является истинным значением, используется значение по умолчанию (2), и затем результат умножается на 3 (2 * 3 = 6)." ⏎ } ⏎ ```
верноdefault заменяет exactly false/null/''/[] — false подменится на 2, 2*3 = 6; наивное «default только для undefined» даёт 0.
T21-L10
0.09 c
TwigКакой класс исключения выбросит render() этого шаблона? ```twig {{ 'a' ~ 1 + 2 }} ```«нет»
Пояснение: Данный код является простым выражением и не вызывает исключений.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Данный код является простым выражением и не вызывает исключений." ⏎ } ⏎ ```
неверно
верный: «runtimeerror»
В Twig ~ связывает крепче +: ('a' ~ 1) + 2 → string + int → ошибка рендера (RuntimeError).
T22-L9
0.18 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) и поле, которое должно быть заполнено (которое не заполнено), что дает 1 ошибку.
Raw
```json ⏎ { ⏎   "answer": "1", ⏎   "пояснение": "Код проверяет два валидатора: пустую строку (которая не проходит проверку через NotBlank) и поле, которое должно быть заполнено (которое не заполнено), что дает 1 ошибку." ⏎ } ⏎ ```
неверно
верный: «0»
NotBlank считает пустым null, '', [] — массив [''] не пуст.
T22-L10
0.14 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»
Пояснение: TextType в Symfony Forms не имеет встроенной логики валидации, и isValid() вернет false, если нет данных.
Raw
```json ⏎ { ⏎   "answer": "invalid", ⏎   "пояснение": "TextType в Symfony Forms не имеет встроенной логики валидации, и isValid() вернет false, если нет данных." ⏎ } ⏎ ```
неверно
верный: «symfony\component\form\exception\logicexception»
isValid() на неотправленной форме — LogicException, не false.
T23-L9
0.13 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»
Пояснение: Метод get() в ContainerBuilder возвращает объект, который уже зарегистрирован, поэтому их идентификаторы объекта будут одинаковыми.
Raw
```json ⏎ { ⏎   "answer": "same", ⏎   "пояснение": "Метод get() в ContainerBuilder возвращает объект, который уже зарегистрирован, поэтому их идентификаторы объекта будут одинаковыми." ⏎ } ⏎ ```
верноСервисы в контейнере общие (shared): get() дважды — один инстанс.
T23-L10
0.13 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!»
Пояснение: Код выводит значение параметра 'message', которое является заменой '%greeting%!' с подстановкой значения из параметра 'name'.
Raw
```json ⏎ { ⏎   "answer": "hi Bob!", ⏎   "пояснение": "Код выводит значение параметра 'message', которое является заменой '%greeting%!' с подстановкой значения из параметра 'name'." ⏎ } ⏎ ```
верноcompile() резолвит %-ссылки транзитивно: %greeting% → 'hi %name%' → 'hi Bob!', ответ собирается из двух шагов.
T24-L9
0.11 c
BootstrapКакая max-width у .container в Bootstrap 5.3 при ширине окна 992px?«720px»
Пояснение: По умолчанию, для экрана 992px и выше, .container имеет max-width 720px.
Raw
```json ⏎ { ⏎   "answer": "720px", ⏎   "пояснение": "По умолчанию, для экрана 992px и выше, .container имеет max-width 720px." ⏎ } ⏎ ```
неверно
верный: «960»
Container-ширины 5.x: 540/720/960/1140/1320 (sm–xxl); 992 → 960px.
T24-L10
0.11 c
BootstrapКакая утилита определит цвет текста в Bootstrap 5.3: `<p class="text-danger text-primary">…</p>`? Ответь именем класса-победителя.«text-danger, text-primary»
Пояснение: Цвет текста определяется комбинацией классов, примененных к элементу.
Raw
```json ⏎ { ⏎   "answer": "text-danger, text-primary", ⏎   "пояснение": "Цвет текста определяется комбинацией классов, примененных к элементу." ⏎ } ⏎ ```
верноСпецифичность равна — победит правило позже в css: text-danger объявлен после text-primary.
T25-L9
0.12 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, ) {} } ```«1»
Пояснение: Нарушение возникает из-за зависимости OrderService (Domain) от Db (Infrastructure), что запрещено правилами deptrac.
Raw
```json ⏎ { ⏎   "answer": "1", ⏎   "пояснение": "Нарушение возникает из-за зависимости OrderService (Domain) от Db (Infrastructure), что запрещено правилами deptrac." ⏎ } ⏎ ```
неверно
верный: «2»
Domain может зависеть только от Domain: PlaceOrder (Application) + Db (Infrastructure) = 2.
T25-L10
0.11 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, ) {} } ```«1»
Пояснение: Нарушение: Infrastructure (Db) -> Domain (BillingService), что запрещено.
Raw
```json ⏎ { ⏎   "answer": 1, ⏎   "пояснение": "Нарушение: Infrastructure (Db) -> Domain (BillingService), что запрещено." ⏎ } ⏎ ```
неверно
верный: «3»
Inline-FQCN \App\Infrastructure\Logger тоже считается: Application + Db + Logger = 3.
T26-L10
0.13 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; ```«15,15»
Пояснение: Код выведет сумму $a->amount (10) и сумму $c->amount (15) через запятую.
Raw
```json ⏎ { ⏎   "answer": "15,15", ⏎   "пояснение": "Код выведет сумму $a->amount (10) и сумму $c->amount (15) через запятую." ⏎ } ⏎ ```
неверно
верный: «10,15»
VO иммутабелен: add() возвращает новый инстанс, исходный не меняется.
T26-L9
0.12 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»
Пояснение: После удаления элемента, счетчик элементов в объекте Order будет равен нулю.
Raw
```json ⏎ { ⏎     "answer": "0", ⏎     "пояснение": "После удаления элемента, счетчик элементов в объекте Order будет равен нулю." ⏎ } ⏎ ```
неверно
верный: «1»
Сорванный remove не меняет состояние агрегата: инвариант бросил исключение до unset — count остался 1.
VC-L9
2.59 c
PHP 8.4–8.5Что выведет этот код на PHP 8.5? ```php class C { public function hi(): string { return 'hi'; } } echo new C()->hi(); ```«hi»
Пояснение: Вызывается метод hi() объекта класса C, который возвращает строку 'hi'.
Raw
```json ⏎ { ⏎   "answer": "hi", ⏎   "пояснение": "Вызывается метод hi() объекта класса C, который возвращает строку 'hi'." ⏎ } ⏎ ```
верноС 8.4 new в цепочке методов вызывается без обрамляющих скобок.
VC-L10
2.72 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'; ```«no»
Пояснение: LazyGhost объект инициализируется при первом доступе к его методу или свойству, и метод isUninitializedLazyObject вернет false.
Raw
```json ⏎ { ⏎   "answer": "no", ⏎   "пояснение": "LazyGhost объект инициализируется при первом доступе к его методу или свойству, и метод isUninitializedLazyObject вернет false." ⏎ } ⏎ ```
неверно
верный: «yesno»
newLazyGhost (8.4): объект ленив, пока к нему не обратились — чтение свойства инициализирует и снимает флаг.
T28-L9
0.09 c
Symfony: версииПроект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Security\Guard\AbstractGuardAuthenticator::class) ? 'yes' : 'no'; ```«yes»
Пояснение: Класс AbstractGuardAuthenticator существует в Symfony Security и доступен в версии 8.1.
Raw
```json ⏎ { ⏎   "answer": "yes", ⏎   "пояснение": "Класс AbstractGuardAuthenticator существует в Symfony Security и доступен в версии 8.1." ⏎ } ⏎ ```
неверно
верный: «no»
Guard-аутентификация удалена в Symfony 7.0 — класса в 8.1 нет.
T28-L10
0.11 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'; ```«no»
Пояснение: Классы с префиксом 'Loader' были перемещены в пространство имен в Symfony 8.1.
Raw
```json ⏎ { ⏎   "answer": "no", ⏎   "пояснение": "Классы с префиксом 'Loader' были перемещены в пространство имен в Symfony 8.1." ⏎ } ⏎ ```
неверно
верный: «noyes»
Аннотационные лоадеры удалены в 7.0, остались атрибутные (Annotation→Attribute).