Карта знаний PHP — bonsai-2:27b, run-03 · think: off

Оценка: PHP 82.3% · PHP+версии 73.2% · Symfony 68.8% · Symfony+версии 66.7% · БД и ORM 79.2% · Архитектура 75.0% · Фронтенд 87.5% · HTTP 100.0% · Безопасность 100.0% · Тесты 87.5% · Глубина 66.1% · Всего 75.8%
Разобрано JSON: 99.7% (295 из 296)
По зонам: База 81.2% · PHP 8.4–8.5 31.2% · Будущее 50.0% · Глубина 66.1%
Точность: 182 / 240 (+ глубина 37 / 56)
Разобрано ответов: 288 / 240 (не по JSON-формату: 1 · без вердикта: -48)
Ответов «да»: 52.1% (баланс вопросника 50/50, базлайн константного ответа — 50%)
Время: 2.3 мин (0.43 c на клетку — медиана)
Цена: $0.016
Токены: 42548 вх / 14200 вых (кэш: 0)
вопросник v8 + deep v4 (L9/L10)
Пример запроса (первая клетка). System одинаковый во всех запросах прогона, user — свой вопрос для каждой клетки:
system
Ты проходишь тест на знание PHP. Каждое сообщение — один вопрос. Отвечай строго в JSON: {"answer": ..., "пояснение": "..."}. Для вопроса «Верно или неверно?» answer — "да" или "нет"; для вопроса о результате answer — число, строка или да/нет. Пояснение — одно короткое предложение. Никакого текста вне JSON.
user
Строки в двойных и одинарных кавычках обрабатываются одинаково, разница только в скорости.

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

Карта

верно неверно
наведите — вопрос и ответ модели · клик — строка с деталями в «Все утверждения»
L1
L2
L3
L4
L5
L6
L7
L8
L9
L10
итог
Синтаксис и операторы
T01-L1 · Синтаксис и операторы
Строки в двойных и одинарных кавычках обрабатываются одинаково, разница только в скорости.
Модель: «нет»
Верный ответ: нет
T01-L2 · Синтаксис и операторы
Оператор ?? работает по семантике isset и не порождает предупреждений для неопределённых переменных.
Модель: «да»
Верный ответ: да
T01-L3 · Синтаксис и операторы
Что выведет: echo 'a', 'b';
Модель: «ab»
Верный ответ: ab
T01-L4 · Синтаксис и операторы
print возвращает значение 1 и может использоваться внутри выражения.
Модель: «да»
Верный ответ: да
T01-L5 · Синтаксис и операторы
Оператор ?: (элвис) возвращает левый операнд, если он ложный.
Модель: «нет»
Верный ответ: нет
T01-L6 · Синтаксис и операторы
В PHP 8 приоритет оператора конкатенации (.) ниже, чем у сложения и вычитания.
Модель: «нет»
Верный ответ: да
T01-L7 · Синтаксис и операторы
Выражение 2 ** 3 ** 2 в PHP вычисляется как (2 ** 3) ** 2, то есть 64.
Модель: «нет»
Верный ответ: нет
T01-L8 · Синтаксис и операторы
Какую строку выведет: echo 'сумма: ' . 2 + 3; (PHP 8)?
Модель: «сумма: 5»
Верный ответ: сумма: 5
T01-L9 · Синтаксис и операторы
Что выведет этот код? ```php echo intdiv(7, 2) . intdiv(-7, 2); ```
Модель: «3-4»
Верный ответ: 3-3
T01-L10 · Синтаксис и операторы
Что выведет этот код? ```php echo -3 ** 2; ```
Модель: «9»
Верный ответ: -9
7/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'; ```
Модель: «true»
Верный ответ: true
T02-L10 · Типы и сравнения
Что выведет этот код? ```php switch ('a') { case 0: echo 'zero'; break; default: echo 'other'; } ```
Модель: «other»
Верный ответ: other
9/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?
Модель: «10»
Верный ответ: 12
T03-L6 · Строки
Что вернёт substr('abcdef', -3)?
Модель: «def»
Верный ответ: def
T03-L7 · Строки
ucfirst() изменяет строку, переданную ей, на месте.
Модель: «нет»
Верный ответ: нет
T03-L8 · Строки
В heredoc работают интерполяция переменных, а в nowdoc — нет.
Модель: «да»
Верный ответ: да
T03-L9 · Строки
Что выведет этот код? ```php echo strtr('abc', ['a' => '1', 'ab' => '2']); ```
Модель: «1bc»
Верный ответ: 2c
T03-L10 · Строки
Что выведет этот код? ```php echo '[' . substr('hello', -10) . ']'; ```
Модель: «[hello]»
Верный ответ: [hello]
8/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)?
Модель: «[20, 30]»
Верный ответ: [20,30]
T04-L7 · Массивы
Сколько элементов будет в count(['a' => 1] + ['a' => 9, 'b' => 2])?
Модель: «2»
Верный ответ: 2
T04-L8 · Массивы
Spread-оператор [...$a, ...$b] с PHP 8.1 поддерживает массивы со строковыми ключами.
Модель: «нет»
Верный ответ: да
T04-L9 · Массивы
Что выведет этот код? ```php $a = ['k' => 1, 'n' => 2]; $b = ['k' => 9, 'm' => 3]; echo implode(',', array_keys($a + $b)); ```
Модель: «k,n,m»
Верный ответ: k,n,m
T04-L10 · Массивы
Что выведет этот код? ```php $a = [[1, 'x', 2], [2, 'y', 1], [3, 'z', 2]]; usort($a, fn($p, $q) => $p[2] <=> $q[2]); echo implode('', array_column($a, 1)); ```
Модель: «zyx»
Верный ответ: yxz
7/10
Функции и замыкания
T05-L1 · Функции и замыкания
Именованные аргументы нельзя комбинировать с распаковкой массива ...$args в одном вызове.
Модель: «да»
Верный ответ: нет
T05-L2 · Функции и замыкания
Анонимная функция без use видит переменные внешней области видимости.
Модель: «да»
Верный ответ: нет
T05-L3 · Функции и замыкания
Что вернёт func_num_args() внутри function f($a) { return func_num_args(); } при вызове f(1, 2, 3)?
Модель: «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();
Модель: «5»
Верный ответ: 5
T05-L8 · Функции и замыкания
В «слабом» режиме типизации (без strict_types) передача строки "5" в параметр с типом int допустима.
Модель: «да»
Верный ответ: да
T05-L9 · Функции и замыкания
Что выведет этот код? ```php class P { private int $v = 3; public function g(): int { return $this->v; } } $p = new P; $f = $p->g(...); $p = null; echo $f(); ```
Модель: «3»
Верный ответ: 3
T05-L10 · Функции и замыкания
Что выведет этот код? ```php function f(int $a, int $b): int { return $a - $b; } echo f(...['b' => 1, 'a' => 5]); ```
Модель: «4»
Верный ответ: 4
7/10
ООП: классы и наследование
T06-L1 · ООП: классы и наследование
PHP поддерживает promotion свойств в конструкторе: public function __construct(private int $x) {}.
Модель: «да»
Верный ответ: да
T06-L2 · ООП: классы и наследование
Какое ключевое слово запрещает переопределять метод в подклассах?
Модель: «final»
Верный ответ: final
T06-L3 · ООП: классы и наследование
Метод, объявленный как final, нельзя переопределить в подклассе.
Модель: «да»
Верный ответ: да
T06-L4 · ООП: классы и наследование
Свойства родителя с видимостью private доступны в подклассе.
Модель: «нет»
Верный ответ: нет
T06-L5 · ООП: классы и наследование
Что вернёт get_class(new class {})? Ответь частью имени до нулевого байта (без пути к файлу).
Модель: «anonymousclass»
Верный ответ: class@anonymous
T06-L6 · ООП: классы и наследование
private-метод родителя не входит в контракт наследования: потомок может объявить метод с тем же именем с любой видимостью.
Модель: «да»
Верный ответ: да
T06-L7 · ООП: классы и наследование
Магический метод __get() вызывается только для несуществующих свойств.
Модель: «нет»
Верный ответ: нет
T06-L8 · ООП: классы и наследование
Что бросит повторное присваивание readonly-свойства — Exception или Error?
Модель: «error»
Верный ответ: 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
9/10
Интерфейсы, трейты, enum
T07-L1 · Интерфейсы, трейты, enum
Интерфейс может объявлять константы.
Модель: «да»
Верный ответ: да
T07-L2 · Интерфейсы, трейты, enum
Какой оператор проверяет, что объект реализует класс или интерфейс?
Модель: «instanceof»
Верный ответ: instanceof
T07-L3 · Интерфейсы, трейты, enum
Интерфейс может объявлять статические методы.
Модель: «нет»
Верный ответ: да
T07-L4 · Интерфейсы, трейты, enum
Оператор instanceof проверяет только наследование классов: интерфейсы он не учитывает.
Модель: «нет»
Верный ответ: нет
T07-L5 · Интерфейсы, трейты, enum
Метод интерфейса может иметь реализацию по умолчанию, как метод трейта.
Модель: «нет»
Верный ответ: нет
T07-L6 · Интерфейсы, трейты, enum
Абстрактный метод в абстрактном классе может иметь видимость protected.
Модель: «да»
Верный ответ: да
T07-L7 · Интерфейсы, трейты, enum
Сколько элементов вернёт Foo::cases() для enum Foo { case A; case B; case C; }?
Модель: «3»
Верный ответ: 3
T07-L8 · Интерфейсы, трейты, enum
Трейт может объявлять константы.
Модель: «да»
Верный ответ: да
T07-L9 · Интерфейсы, трейты, enum
Что выведет этот код? ```php trait TA { public function f(): string { return 'A'; } } trait TB { public function f(): string { return 'B'; } } class TC { use TA, TB { TB::f insteadof TA; TA::f as g; } } echo (new TC)->f() . (new TC)->g(); ```
Модель: «bg»
Верный ответ: 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; ```
Модель: «0»
Верный ответ: 0
8/10
Исключения и ошибки
T08-L1 · Исключения и ошибки
Интерфейс Throwable — общий предок и для Exception, и для Error.
Модель: «да»
Верный ответ: да
T08-L2 · Исключения и ошибки
Блок catch (Exception $e) перехватит и TypeError, потому что TypeError в итоге наследуется от Exception.
Модель: «да»
Верный ответ: нет
T08-L3 · Исключения и ошибки
Оператор @ подавляет и исключения тоже.
Модель: «да»
Верный ответ: нет
T08-L4 · Исключения и ошибки
Какой класс ошибки бросит intdiv(5, 0)?
Модель: «divisionbyzeroexception»
Верный ответ: divisionbyzeroerror
T08-L5 · Исключения и ошибки
Блок finally выполняется только если исключение было поймано блоком catch.
Модель: «нет»
Верный ответ: нет
T08-L6 · Исключения и ошибки
Исключение, выброшенное внутри блока finally, никак не влияет на результат try-блока.
Модель: «нет»
Верный ответ: нет
T08-L7 · Исключения и ошибки
Что вернёт выражение: (bool) new Exception('x')?
Модель: «да»
Верный ответ: true
T08-L8 · Исключения и ошибки
Функции, зарегистрированные через register_shutdown_function(), выполняются при вызове exit.
Модель: «нет»
Верный ответ: да
T08-L9 · Исключения и ошибки
Что выведет этот код? ```php try { try { throw new RuntimeException('first'); } finally { throw new LogicException('second'); } } catch (LogicException $e) { echo $e->getMessage(); } ```
Модель: «second»
Верный ответ: second
T08-L10 · Исключения и ошибки
Что выведет этот код? ```php function f(): int { try { return 1; } finally { return 2; } } echo f(); ```
Модель: «1»
Верный ответ: 2
5/10
Пространства имён и автозагрузка
T09-L1 · Пространства имён и автозагрузка
Директива use App\Service\Mailer; сама по себе подключает файл с классом.
Модель: «нет»
Верный ответ: нет
T09-L2 · Пространства имён и автозагрузка
Что пишут после use, чтобы импортировать функцию (а не класс): слово function или const?
Модель: «function»
Верный ответ: function
T09-L3 · Пространства имён и автозагрузка
В какой файл (путь от src/) PSR-4 «App\ → src/» положит класс App\Controller\Api\UserController?
Модель: «src/controller/api/usercontroller.php»
Верный ответ: src/controller/api/usercontroller.php
T09-L4 · Пространства имён и автозагрузка
Подключение vendor/autoload.php регистрирует обработчики через spl_autoload_register().
Модель: «да»
Верный ответ: да
T09-L5 · Пространства имён и автозагрузка
Магическая константа __NAMESPACE__ содержит имя текущего пространства имён.
Модель: «да»
Верный ответ: да
T09-L6 · Пространства имён и автозагрузка
Относительное имя класса (без ведущего \) в new резолвится от глобального корня.
Модель: «нет»
Верный ответ: нет
T09-L7 · Пространства имён и автозагрузка
При маппинге PSR-4 «App\ → src/» класс App\Model\User лежит в файле src/Model/User.php.
Модель: «да»
Верный ответ: да
T09-L8 · Пространства имён и автозагрузка
Директиву use можно писать внутри тела функции — импорт будет действовать для этой функции.
Модель: «нет»
Верный ответ: нет
T09-L9 · Пространства имён и автозагрузка
Что выведет этот код? ```php namespace N; use App\Foo as Baz; echo Baz::class . '|' . \Baz::class; ```
Модель: «n\baz|baz»
Верный ответ: app\foo|baz
T09-L10 · Пространства имён и автозагрузка
Что выведет этот код? ```php namespace Ns; class Foo {} $c = 'Foo'; echo (class_exists($c) ? 'yes' : 'no') . (class_exists(__NAMESPACE__ . '\\' . $c) ? 'yes' : 'no'); ```
Модель: «yesno»
Верный ответ: noyes
8/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); ```
Модель: «99,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(); ```
Модель: «3»
Верный ответ: 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; }?
Модель: «generator»
Верный ответ: generator
T11-L5 · Генераторы, итераторы, SPL
Сколько элементов вернёт count(iterator_to_array((function () { yield from [1, 2, 3]; })()));
Модель: «3»
Верный ответ: 3
T11-L6 · Генераторы, итераторы, SPL
Класс SplStack реализует очередь FIFO.
Модель: «нет»
Верный ответ: нет
T11-L7 · Генераторы, итераторы, SPL
ArrayIterator позволяет обернуть массив и обходить его через интерфейс Iterator.
Модель: «да»
Верный ответ: да
T11-L8 · Генераторы, итераторы, SPL
Объект класса ArrayObject нельзя обойти через foreach.
Модель: «нет»
Верный ответ: нет
T11-L9 · Генераторы, итераторы, SPL
Что выведет этот код? ```php function g(): Generator { $x = yield 1; return $x + 1; } $g = g(); $g->send(10); echo $g->getReturn(); ```
Модель: «11»
Верный ответ: 11
T11-L10 · Генераторы, итераторы, SPL
Что выведет этот код? ```php function inner(): Generator { yield 1; yield 2; return 'ok'; } function outer(): Generator { $r = yield from inner(); yield $r; } echo implode(',', iterator_to_array(outer())); ```
Модель: «1,2»
Верный ответ: ok,2
8/10
Конфигурация и безопасность
T12-L1 · Конфигурация и безопасность
password_hash() генерирует соль автоматически — передавать её отдельно не нужно.
Модель: «да»
Верный ответ: да
T12-L2 · Конфигурация и безопасность
Алгоритм PASSWORD_DEFAULT в PHP 8 — это md5 с автоматически добавленной солью.
Модель: «нет»
Верный ответ: нет
T12-L3 · Конфигурация и безопасность
Что вернёт password_verify('secret', password_hash('secret', PASSWORD_DEFAULT))?
Модель: «true»
Верный ответ: 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'; ```
Модель: «yesno»
Верный ответ: noyes
T12-L10 · Конфигурация и безопасность
Что выведет этот код на PHP 8.5? ```php echo (E_ALL & 2048) === 0 ? 'strict-out' : 'strict-in'; ```
Модель: «strict-out»
Верный ответ: strict-out
9/10
PHP 8.4–8.5
VC-L1 · PHP 8.4–8.5
В какой версии PHP появилась функция array_find()?
Модель: «да»
Верный ответ: 8.4
VC-L2 · PHP 8.4–8.5
Property hooks (get/set прямо в объявлении свойства) вошли в PHP 8.4.
Модель: «нет»
Верный ответ: да
VC-L3 · PHP 8.4–8.5
Асимметричная видимость (public private(set) string $name) появилась в PHP 8.4.
Модель: «да»
Верный ответ: да
VC-L4 · PHP 8.4–8.5
В какой версии PHP впервые появился атрибут #[\NoDiscard]? Ответь номером версии.
Модель: «8.1»
Верный ответ: 8.5
VC-L5 · PHP 8.4–8.5
В какой версии PHP впервые появился оператор конвейера |> (pipe)? Ответь номером версии.
Модель: «8.1»
Верный ответ: 8.5
VC-L6 · PHP 8.4–8.5
В какой версии PHP появился clone-with — синтаксис clone($obj, ['x' => 1])? Ответь номером версии.
Модель: «нет»
Верный ответ: 8.5
VC-L7 · PHP 8.4–8.5
В какой версии PHP появились функции array_first() и array_last()?
Модель: «8.1»
Верный ответ: 8.5
VC-L8 · PHP 8.4–8.5
Для какой версии PHP был принят RFC Partial Function Application v2 (по состоянию на 07.11.2026)? Ответь номером версии.
Модель: «8.3»
Верный ответ: 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'; ```
Модель: «yesno»
Верный ответ: yesno
3/10
PHP: 8.6+ и будущее
VF-L1 · PHP: 8.6+ и будущее
Для какой версии PHP реализован RFC clamp_v2 (функция clamp()) по состоянию на 07.11.2026? Ответь номером версии.
Модель: «8.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 · Чистая архитектура
Как называется компонент, предоставляющий коллекцию агрегатов/сущностей, скрывая механизм хранения за интерфейсом?
Модель: «repository»
Верный ответ: репозиторий
T25-L8 · Чистая архитектура
Замена PostgreSQL на другую БД в чистой архитектуре затрагивает только внешний слой — домен и use cases не меняются.
Модель: «да»
Верный ответ: да
T25-L9 · Чистая архитектура
Слои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class OrderService { public function __construct( private PlaceOrder $handler, private Db $db, ) {} } ```
Модель: «2»
Верный ответ: 2
T25-L10 · Чистая архитектура
Слои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class BillingService { public function __construct( private PlaceOrder $handler, private Db $db, private \App\Infrastructure\Logger $logger, ) {} } ```
Модель: «2»
Верный ответ: 3
7/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(); ```
Модель: «1»
Верный ответ: 1
T26-L10 · DDD
Что выведет этот код? ```php final class Money { public function __construct(public readonly int $amount) {} public function add(Money $o): Money { return new self($this->amount + $o->amount); } } $a = new Money(10); $c = $a->add(new Money(5)); echo $a->amount . ',' . $c->amount; ```
Модель: «10,15»
Верный ответ: 10,15
8/10
Symfony
T13-L1 · Symfony
Сервисы в DI-контейнере Symfony по умолчанию создаются лениво — при первом обращении к ним.
Модель: «да»
Верный ответ: да
T13-L2 · Symfony
Какая консольная команда Symfony выводит список всех зарегистрированных маршрутов?
Модель: «routes»
Верный ответ: 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)?
Модель: «symfony_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; ```
Модель: «cba»
Верный ответ: bca
6/10
Symfony: Security и формы
T22-L1 · Symfony: Security и формы
В современном Symfony (6.0+) аутентификация строится на классах-authenticator (AuthenticatorInterface); прежняя система guard удалена.
Модель: «да»
Верный ответ: да
T22-L2 · Symfony: Security и формы
Какой атрибут Symfony проверяет роль/право прямо на методе контроллера (без него — 403)?
Модель: «isgranted»
Верный ответ: isgranted
T22-L3 · Symfony: Security и формы
Voters (голосующие) — механизм Symfony для проверки доступа к конкретному объекту: isGranted('EDIT', $post).
Модель: «нет»
Верный ответ: да
T22-L4 · Symfony: Security и формы
Ограничения валидации в современных Symfony (7+) объявляются PHP-атрибутами (#[Assert\NotBlank]); аннотации-докблоки больше не поддерживаются.
Модель: «да»
Верный ответ: да
T22-L5 · Symfony: Security и формы
CSRF-защита форм в Symfony включена по умолчанию: форма проверяет токен при отправке.
Модель: «да»
Верный ответ: да
T22-L6 · Symfony: Security и формы
Валидация формы в Symfony выполняется на сервере, даже если клиентская (HTML5) проверка прошла.
Модель: «да»
Верный ответ: да
T22-L7 · Symfony: Security и формы
Какая команда Symfony maker генерирует класс формы (FormType)?
Модель: «make:form»
Верный ответ: make:form
T22-L8 · Symfony: Security и формы
Symfony хранит пароль пользователя в сессии в открытом виде (plaintext).
Модель: «нет»
Верный ответ: нет
T22-L9 · Symfony: Security и формы
Что выведет этот код? ```php use Symfony\Component\Validator\Validation; use Symfony\Component\Validator\Constraints as Assert; $v = Validation::createValidator(); echo count($v->validate([''], [new Assert\NotBlank()])); ```
Модель: «1»
Верный ответ: 0
T22-L10 · Symfony: Security и формы
Что выведет этот код? ```php use Symfony\Component\Form\Forms; use Symfony\Component\Form\Extension\Core\Type\TextType; $factory = Forms::createFormFactoryBuilder()->getFormFactory(); $form = $factory->create(TextType::class); try { echo $form->isValid() ? 'valid' : 'invalid'; } catch (Throwable $e) { echo get_class($e); } ```
Модель: «valid»
Верный ответ: symfony\component\form\exception\logicexception
7/10
Symfony: конфигурация и сервисы
T23-L1 · Symfony: конфигурация и сервисы
Конфигурация бандлов Symfony лежит в config/packages — по одному файлу на бандл или тему.
Модель: «да»
Верный ответ: да
T23-L2 · Symfony: конфигурация и сервисы
Файл .env с dev-дефолтами коммитится в репозиторий, а настоящие секреты живут в некоммитимом .env.local.
Модель: «да»
Верный ответ: да
T23-L3 · Symfony: конфигурация и сервисы
Какая команда Symfony выводит зарегистрированные сервисы контейнера и их алиасы?
Модель: «php bin/console debug:container»
Верный ответ: debug:container
T23-L4 · Symfony: конфигурация и сервисы
Контейнер Symfony позволяет менять параметры в рантайме: $container->setParameter() работает из контроллера.
Модель: «нет»
Верный ответ: нет
T23-L5 · Symfony: конфигурация и сервисы
По умолчанию сервисы в Symfony публичны (public: true) — их достают из контейнера напрямую.
Модель: «нет»
Верный ответ: нет
T23-L6 · Symfony: конфигурация и сервисы
Без конфигурационного файла в config/packages бандл не заработает — настройки обязательны для каждого бандла.
Модель: «нет»
Верный ответ: нет
T23-L7 · Symfony: конфигурация и сервисы
Значения переменных окружения подставляются в services.yaml синтаксисом %env(VAR)%.
Модель: «нет»
Верный ответ: да
T23-L8 · Symfony: конфигурация и сервисы
Какая переменная окружения Symfony включает режим отладки (влияет на профайлер и отладку Twig)?
Модель: «app_debug=1»
Верный ответ: app_debug
T23-L9 · Symfony: конфигурация и сервисы
Что выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->register('a', stdClass::class)->setPublic(true); $c->compile(); echo spl_object_id($c->get('a')) === spl_object_id($c->get('a')) ? 'same' : 'diff'; ```
Модель: «same»
Верный ответ: same
T23-L10 · Symfony: конфигурация и сервисы
Что выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->setParameter('name', 'Bob'); $c->setParameter('greeting', 'hi %name%'); $c->setParameter('message', '%greeting%!'); $c->compile(); echo $c->getParameter('message'); ```
Модель: «hi bob!»
Верный ответ: hi bob!
9/10
Symfony: Messenger
T16-L1 · Symfony: Messenger
Одно сообщение в Symfony Messenger может обрабатывать только один обработчик (handler).
Модель: «— (нет ответа)»
Верный ответ: нет
T16-L2 · Symfony: Messenger
Транспорт sync в Messenger ставит сообщение в очередь и обрабатывает его воркером, как и async.
Модель: «— (нет ответа)»
Верный ответ: нет
T16-L3 · Symfony: Messenger
Какой консольной командой запускается воркер, обрабатывающий сообщения из очередей Messenger?
Модель: «php bin/console 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?
Модель: «doctrinetransport»
Верный ответ: doctrine
T16-L8 · Symfony: Messenger
Пайплайн Messenger можно расширять собственными middleware, встраивая их до или после встроенных.
Модель: «да»
Верный ответ: да
T16-L9 · Symfony: Messenger
Что выведет этот код? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\StackInterface; use Symfony\Component\Messenger\Envelope; final class Trace implements MiddlewareInterface { public function __construct(private string $tag) {} public function handle(Envelope $e, StackInterface $stack): Envelope { echo $this->tag; return $stack->next()->handle($e, $stack); } } $bus = new MessageBus([new Trace('M1'), new Trace('M2')]); $bus->dispatch(new Envelope(new stdClass())); ```
Модель: «m1m2»
Верный ответ: m1m2
T16-L10 · Symfony: Messenger
Что выведет этот код? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; use Symfony\Component\Messenger\Handler\HandlersLocator; use Symfony\Component\Messenger\Handler\HandlerDescriptor; use Symfony\Component\Messenger\Envelope; class Ping {} $n = 0; $d1 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 1; }, ['alias' => 'h1']); $d2 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 10; }, ['alias' => 'h2']); $bus = new MessageBus([ new HandleMessageMiddleware(new HandlersLocator([Ping::class => [$d1, $d2]])), ]); $bus->dispatch(new Envelope(new Ping())); echo $n; ```
Модель: «11»
Верный ответ: 11
5/10
Symfony: версии
T28-L1 · Symfony: версии
Мажорные релизы Symfony выходят раз в два года, минорные — каждые шесть месяцев (в мае и ноябре).
Модель: «— (нет ответа)»
Верный ответ: да
T28-L2 · Symfony: версии
Какой минимальной версии PHP требует Symfony 8?
Модель: «8.1»
Верный ответ: 8.4
T28-L3 · Symfony: версии
Symfony 7.0 сохранила поддержку аннотаций в докблоках (валидация, маршруты).
Модель: «нет»
Верный ответ: нет
T28-L4 · Symfony: версии
AssetMapper позволяет управлять CSS/JS без node и webpack — через importmap.php.
Модель: «нет»
Верный ответ: да
T28-L5 · Symfony: версии
Symfony 6.4 — обычный релиз без длительной поддержки.
Модель: «нет»
Верный ответ: нет
T28-L6 · Symfony: версии
При переходе на новую мажорную версию Symfony деприкейшены прошлой ветки продолжают работать — мажорные релизы их не удаляют.
Модель: «нет»
Верный ответ: нет
T28-L7 · Symfony: версии
Каждый мажорный релиз Symfony сопровождается UPGRADE-гайдом со списком изменений.
Модель: «да»
Верный ответ: да
T28-L8 · Symfony: версии
Какой компонент Symfony управляет ассетами и importmap без node/webpack?
Модель: «webpackbundle»
Верный ответ: asset-mapper
T28-L9 · Symfony: версии
Проект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Security\Guard\AbstractGuardAuthenticator::class) ? 'yes' : 'no'; ```
Модель: «no»
Верный ответ: 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'; ```
Модель: «noyes»
Верный ответ: noyes
6/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)?
Модель: «8.2»
Верный ответ: 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.2»
Верный ответ: 8.4
T29-L7 · Symfony: 8.2 и будущее
Symfony 8.2 потребует обновления PHP до 8.5 — придётся обновлять PHP вместе с ней.
Модель: «да»
Верный ответ: нет
T29-L8 · Symfony: 8.2 и будущее
Deprecations, добавленные в ветке 8.x, будут удалены не раньше Symfony 9.0.
Модель: «да»
Верный ответ: да
6/8
Twig
T21-L1 · Twig
Внутри {{ }} в Twig можно вызывать произвольный PHP-код напрямую.
Модель: «нет»
Верный ответ: нет
T21-L2 · Twig
Twig по умолчанию автоматически экранирует выводимые переменные.
Модель: «да»
Верный ответ: да
T21-L3 · Twig
Фильтр |e в Twig экранирует строку для безопасного вывода в HTML-контексте.
Модель: «да»
Верный ответ: да
T21-L4 · Twig
Какой фильтр из twig/intl-extra форматирует число с учётом локали?
Модель: «format_int»
Верный ответ: format_number
T21-L5 · Twig
Фильтр |raw отключает автоэкранирование для значения.
Модель: «да»
Верный ответ: да
T21-L6 · Twig
В Twig {{ }} выводит значение выражения, а {% %} выполняет теги — условия, циклы, set.
Модель: «да»
Верный ответ: да
T21-L7 · Twig
В Twig нельзя объявить переменную в шаблоне — значения только передаются из контроллера.
Модель: «нет»
Верный ответ: нет
T21-L8 · Twig
Какая функция Twig выводит отладочную структуру переменной (массива, объекта)?
Модель: «dump()»
Верный ответ: dump
T21-L9 · Twig
Что выведет этот шаблон Twig? ```twig {{ false|default(2) * 3 }} ```
Модель: «6»
Верный ответ: 6
T21-L10 · Twig
Какой класс исключения выбросит render() этого шаблона? ```twig {{ 'a' ~ 1 + 2 }} ```
Модель: «3»
Верный ответ: runtimeerror
8/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?
Модель: «1568px»
Верный ответ: 960
T24-L10 · Bootstrap
Какая утилита определит цвет текста в Bootstrap 5.3: `<p class="text-danger text-primary">…</p>`? Ответь именем класса-победителя.
Модель: «text-primary»
Верный ответ: text-danger
7/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-функции разбивает строки на группы, для которых считается функция?
Модель: «partition by»
Верный ответ: partition by
T15-L8 · PostgreSQL
Уровень изоляции READ COMMITTED защищает от неповторяющегося чтения (non-repeatable read).
Модель: «нет»
Верный ответ: нет
T15-L9 · PostgreSQL
Что вернёт этот SQL-запрос (PostgreSQL 17)? ```sql CREATE TEMP TABLE t (id int, x int); INSERT INTO t VALUES (1, 10), (2, 20), (3, 30); SELECT string_agg(s::text, ',' ORDER BY id) FROM ( SELECT id, sum(x) OVER (ORDER BY id) AS s FROM t ) q; ```
Модель: «10,30,60»
Верный ответ: 10,30,60
T15-L10 · PostgreSQL
Что вернёт этот SQL-запрос (PostgreSQL 17)? ```sql CREATE TEMP TABLE t (x int); INSERT INTO t VALUES (1), (NULL); SELECT count(x) FROM t; ```
Модель: «1»
Верный ответ: 1
8/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
9/10
HTTP и REST API
T19-L1 · HTTP и REST API
HTTP-статус 201 означает, что в результате запроса создан новый ресурс.
Модель: «да»
Верный ответ: да
T19-L2 · HTTP и REST API
Какой HTTP-статус означает успешный запрос с пустым телом ответа (например, после DELETE)?
Модель: «204»
Верный ответ: 204
T19-L3 · HTTP и REST API
Метод DELETE идемпотентен по спецификации HTTP: повторный запрос по тому же ресурсу не меняет результат.
Модель: «да»
Верный ответ: да
T19-L4 · HTTP и REST API
Заголовок Access-Control-Allow-Origin отправляет клиент, чтобы сервер разрешил принимать запросы с другого origin.
Модель: «нет»
Верный ответ: нет
T19-L5 · HTTP и REST API
Код 429 Too Many Requests используется, когда клиент превысил лимит запросов (rate limiting).
Модель: «да»
Верный ответ: да
T19-L6 · HTTP и REST API
Коды 5xx означают ошибку клиента, а 4xx — ошибку на стороне сервера.
Модель: «нет»
Верный ответ: нет
T19-L7 · HTTP и REST API
Какой HTTP-заголовок указывает MIME-тип тела запроса или ответа?
Модель: «content-type»
Верный ответ: content-type
T19-L8 · HTTP и REST API
PATCH не обязан быть идемпотентным по RFC 5789, в отличие от PUT.
Модель: «да»
Верный ответ: да
T19-L9 · HTTP и REST API
Какой HTTP-метод отправит эта команда? ```bash curl -s -d 'a=1' http://demo.local/api ```
Модель: «post»
Верный ответ: post
T19-L10 · HTTP и REST API
Какой HTTP-метод отправит эта команда? ```bash curl -s -G -d 'a=1' http://demo.local/api ```
Модель: «get»
Верный ответ: get
10/10
Безопасность и OAuth
T20-L1 · Безопасность и OAuth
Проверить пароль достаточно сравнением его хеша с хешем из базы обычным оператором ==.
Модель: «нет»
Верный ответ: нет
T20-L2 · Безопасность и OAuth
CSRF-токен выдаётся сервером (привязан к сессии) и проверяется на сервере при unsafe-запросах (POST и т.п.).
Модель: «да»
Верный ответ: да
T20-L3 · Безопасность и OAuth
Какой HTTP-заголовок включает политику CSP (Content Security Policy)?
Модель: «content-security-policy»
Верный ответ: content-security-policy
T20-L4 · Безопасность и OAuth
OAuth 2.0 — протокол аутентификации: access-токен сообщает, кто именно пользователь.
Модель: «нет»
Верный ответ: нет
T20-L5 · Безопасность и OAuth
XSS предотвращается валидацией ввода на сервере перед записью в базу.
Модель: «нет»
Верный ответ: нет
T20-L6 · Безопасность и OAuth
В authorization code flow OAuth 2.0 какой параметр приходит в redirect_uri и обменивается на access-токен?
Модель: «code»
Верный ответ: code
T20-L7 · Безопасность и OAuth
Refresh-токен живёт дольше access-токена и позволяет получить новый access-токен без повторного входа пользователя.
Модель: «да»
Верный ответ: да
T20-L8 · Безопасность и OAuth
Соль пароля нужно держать в секрете: без неё хеш нельзя проверить.
Модель: «нет»
Верный ответ: нет
T20-L9 · Безопасность и OAuth
Клиент обращается к токен-эндпоинту (RFC 6749) с несуществующим client_id. Какое значение поля error вернёт эндпоинт?
Модель: «invalid_client»
Верный ответ: invalid_client
T20-L10 · Безопасность и OAuth
OAuth 2.0: клиент начал поток с response_type=token. В какой части redirect_uri авторизационный сервер передаёт access_token?
Модель: «query»
Верный ответ: fragment
9/10
Тестирование: PHPUnit
T18-L1 · Тестирование: PHPUnit
PHPUnit выполняет тестовые методы любого класса — наследовать TestCase не обязательно.
Модель: «нет»
Верный ответ: нет
T18-L2 · Тестирование: PHPUnit
Метод setUp() в PHPUnit вызывается один раз перед всеми тестами класса.
Модель: «нет»
Верный ответ: нет
T18-L3 · Тестирование: PHPUnit
Поставщик данных (data provider) позволяет прогнать тест ровно с одним набором аргументов.
Модель: «нет»
Верный ответ: нет
T18-L4 · Тестирование: PHPUnit
Какой метод PHPUnit объявляет ожидание исключения определённого класса?
Модель: «expectexception»
Верный ответ: expectexception
T18-L5 · Тестирование: PHPUnit
В PHPUnit стаб (stub) проверяет, какие методы на нём вызывали, а мок (mock) только подставляет данные.
Модель: «нет»
Верный ответ: нет
T18-L6 · Тестирование: PHPUnit
В PHPUnit 10+ рекомендуемый способ передачи данных в тест — атрибут #[DataProvider] (аннотация @dataProvider устарела).
Модель: «да»
Верный ответ: да
T18-L7 · Тестирование: PHPUnit
В PHPUnit нельзя объявить зависимость одного теста от результата другого.
Модель: «нет»
Верный ответ: нет
T18-L8 · Тестирование: PHPUnit
Какая опция командной строки PHPUnit включает случайный порядок выполнения тестов?
Модель: «--randomize»
Верный ответ: --order-by=random
T18-L9 · Тестирование: PHPUnit
Сколько тестов выполнит эта команда? ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class CalcTest extends TestCase { public static function prov(): array { return [[1], [2], [3]]; } #[DataProvider('prov')] public function test_sum(int $x): void { $this->assertTrue($x > 0); } #[DataProvider('prov')] public function test_sum_abs(int $x): void { $this->assertTrue($x > 0); } public function test_other(): void { $this->assertTrue(true); } } ``` Команда: `phpunit CalcTest.php --filter test_sum` (PHPUnit 10.5)
Модель: «6»
Верный ответ: 6
T18-L10 · Тестирование: PHPUnit
Сколько тестов выполнит эта команда и сколько из них завершится failure? Ответь двумя числами через запятую (выполнено, упало). ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class Calc2Test extends TestCase { public function prov(): array { return [[1], [-1]]; } #[DataProvider('prov')] public function test_x(int $x): void { $this->assertTrue($x > 0); } } ``` Команда: `phpunit Calc2Test.php` (PHPUnit 10.5)
Модель: «2,1»
Верный ответ: 2,1
9/10

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

КлеткаТемаУтверждениеОтвет РезультатОбоснование
T01-L1
2.31 c
Синтаксис и операторыСтроки в двойных и одинарных кавычках обрабатываются одинаково, разница только в скорости.«нет»
Пояснение: В двойных кавычках PHP выполняет интерполяцию переменных и escape-последовательностей, а в одинарных — только и \\.
Raw
{"answer":"нет","пояснение":"В двойных кавычках PHP выполняет интерполяцию переменных и escape-последовательностей, а в одинарных — только \n и \\\\."}
верноВ двойных кавычках работают интерполяция переменных и escape-последовательности, в одинарных — нет.
T01-L2
0.51 c
Синтаксис и операторыОператор ?? работает по семантике isset и не порождает предупреждений для неопределённых переменных.«да»
Пояснение: Оператор null coalescing ?? действительно возвращает значение первого аргумента, если оно не null и не undefined, без генерации предупреждений о неопределённых переменных.
Raw
{"answer": "да", "пояснение": "Оператор null coalescing ?? действительно возвращает значение первого аргумента, если оно не null и не undefined, без генерации предупреждений о неопределённых переменных."}
верно?? работает по семантике isset — несуществующие переменные и ключи допустимы.
T01-L3
0.41 c
Синтаксис и операторыЧто выведет: echo 'a', 'b';«ab»
Пояснение: Оператор запятая в PHP выполняет последовательность выражений и выводит их поочередно без пробела.
Raw
{"answer": "ab", "пояснение": "Оператор запятая в PHP выполняет последовательность выражений и выводит их поочередно без пробела."}
верноecho принимает список аргументов: ab.
T01-L4
0.38 c
Синтаксис и операторыprint возвращает значение 1 и может использоваться внутри выражения.«да»
Пояснение: В PHP функция print возвращает значение 1, что позволяет использовать её результат в выражениях, в отличие от echo.
Raw
{"answer": "да", "пояснение": "В PHP функция print возвращает значение 1, что позволяет использовать её результат в выражениях, в отличие от echo."}
верноprint — выражение со значением 1, в отличие от echo, который значения не возвращает.
T01-L5
0.4 c
Синтаксис и операторыОператор ?: (элвис) возвращает левый операнд, если он ложный.«нет»
Пояснение: Оператор ?: возвращает правый операнд, если левый операнд является ложным, и левый операнд в противном случае.
Raw
{"answer":"нет","пояснение":"Оператор ?: возвращает правый операнд, если левый операнд является ложным, и левый операнд в противном случае."}
верноНаоборот: $a ?: $b возвращает $a, если он истинный, иначе $b.
T01-L6
0.6 c
Синтаксис и операторыВ PHP 8 приоритет оператора конкатенации (.) ниже, чем у сложения и вычитания.«нет»
Пояснение: В PHP 8 оператор конкатенации имеет более высокий приоритет, чем сложение и вычитание, поэтому выражение "a" + "b" + "c" сначала склеивает строки, а уже затем складывает результат.
Raw
{"answer": "нет", "пояснение": "В PHP 8 оператор конкатенации имеет более высокий приоритет, чем сложение и вычитание, поэтому выражение \"a\" + \"b\" + \"c\" сначала склеивает строки, а уже затем складывает результат."}
неверно
верный: «да»
С PHP 8 (RFC concat precedence) '.' имеет приоритет ниже арифметики: 'сумма: ' . 2 + 3 → 'сумма: 5' (в PHP 7 было иначе).
T01-L7
0.59 c
Синтаксис и операторыВыражение 2 ** 3 ** 2 в PHP вычисляется как (2 ** 3) ** 2, то есть 64.«нет»
Пояснение: В PHP оператор возведения в степень ** ассоциативен справа, поэтому вычисляется как 2 ** (3 ** 2) = 2 ** 9 = 512, а не 64.
Raw
{"answer": "нет", "пояснение": "В PHP оператор возведения в степень ** ассоциативен справа, поэтому вычисляется как 2 ** (3 ** 2) = 2 ** 9 = 512, а не 64."}
верно** право-ассоциативен: 2 ** (3 ** 2) = 2 ** 9 = 512.
T01-L8
0.52 c
Синтаксис и операторыКакую строку выведет: echo 'сумма: ' . 2 + 3; (PHP 8)?«сумма: 5»
Пояснение: Оператор . имеет меньший приоритет, чем +, поэтому сначала складывается 2+3, затем результат конкатенируется со строкой.
Raw
{"answer": "сумма: 5", "пояснение": "Оператор . имеет меньший приоритет, чем +, поэтому сначала складывается 2+3, затем результат конкатенируется со строкой."}
верноПарная к verify-клетке про приоритет: 'сумма: 5'.
T02-L1
0.42 c
Типы и сравненияМассивы при строгом сравнении === считаются равными независимо от порядка элементов.«нет»
Пояснение: Строгое сравнение массивов требует не только равного количества ключей-значений, но и совпадения порядка элементов.
Raw
{"answer": "нет", "пояснение": "Строгое сравнение массивов требует не только равного количества ключей-значений, но и совпадения порядка элементов."}
верно=== для массивов требует совпадения и значений, и их порядка.
T02-L2
0.43 c
Типы и сравненияСравнение 0 == false возвращает false, потому что это строгое сравнение.«нет»
Пояснение: Оператор == выполняет слабое сравнение с приведением типов, при котором 0 и false эквивалентны.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Оператор == выполняет слабое сравнение с приведением типов, при котором 0 и false эквивалентны." ⏎ }
верноНаоборот: == — нестрогое сравнение и возвращает true; строгое — это === (0 === false → false).
T02-L3
0.47 c
Типы и сравненияВ PHP 8 выражение "abc" == 0 возвращает true.«нет»
Пояснение: В PHP 8.0 сравнение нечисленных строк со значением 0 всегда возвращает false, чтобы предотвратить случайные приведения типов.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "В PHP 8.0 сравнение нечисленных строк со значением 0 всегда возвращает false, чтобы предотвратить случайные приведения типов." ⏎ }
верноС PHP 8 нечисловая строка сравнивается как строка: "abc" == "0" → false (в PHP 7 было true).
T02-L4
0.53 c
Типы и сравненияЗначение null при нестрогом сравнении равно одновременно 0, пустой строке и false.«да»
Пояснение: В PHP при нестрогом сравнении (==) null действительно равно 0, пустой строке и false, так как все эти значения считаются одинаковыми по правилам приведения типов.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "В PHP при нестрогом сравнении (==) null действительно равно 0, пустой строке и false, так как все эти значения считаются одинаковыми по правилам приведения типов." ⏎ }
верноnull == 0, null == "" и null == false — все true.
T02-L5
0.42 c
Типы и сравненияЧто вернёт выражение: (int) '42abc'?«42»
Пояснение: Приводимая к целому числовая строка обрезается после последней цифры, что даёт 42.
Raw
{"answer": 42, "пояснение": "Приводимая к целому числовая строка обрезается после последней цифры, что даёт 42."}
верноВедущая числовая часть: 42, без ошибок и warning.
T02-L6
0.4 c
Типы и сравненияЧто вернёт выражение: '5' + 5?«10»
Пояснение: PHP приведёт строку '5' к числу 5 при выполнении оператора +, в результате сложения получится 10.
Raw
{"answer": 10, "пояснение": "PHP приведёт строку '5' к числу 5 при выполнении оператора +, в результате сложения получится 10."}
верноЧисловая строка приводится: int 10.
T02-L7
0.47 c
Типы и сравненияПри приведении к строке значение false превращается в "0".«да»
Пояснение: В PHP при приведении булевого значения false к строке (например, через (string) false или echo false) получается пустая строка '', а не "0".
Raw
{"answer": "да", "пояснение": "В PHP при приведении булевого значения false к строке (например, через (string) false или echo false) получается пустая строка '', а не \"0\"."}
неверно
верный: «нет»
false → "", true → "1".
T02-L8
0.53 c
Типы и сравненияСравнение 0.1 + 0.2 === 0.3 возвращает false.«да»
Пояснение: Из-за особенностей представления чисел с плавающей точкой в PHP результат 0.1 + 0.2 не равен точно 0.3, поэтому оператор === возвращает false.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "Из-за особенностей представления чисел с плавающей точкой в PHP результат 0.1 + 0.2 не равен точно 0.3, поэтому оператор === возвращает false." ⏎ }
верноДвоичная погрешность float: 0.1 + 0.2 = 0.30000000000000004.
T03-L1
0.39 c
Строкиstrrev() корректно переворачивает строку в UTF-8.«нет»
Пояснение: strrev() работает с байтами, поэтому в UTF-8 она ломает многобайтовые символы.
Raw
{"answer": "нет", "пояснение": "strrev() работает с байтами, поэтому в UTF-8 она ломает многобайтовые символы."}
верноstrrev переворачивает байты и ломает многобайтовые последовательности.
T03-L2
0.4 c
Строкиstr_contains('Hello world', 'world') возвращает true.«да»
Пояснение: Функция str_contains() корректно определяет наличие подстроки 'world' в строке 'Hello world' и возвращает true.
Raw
{"answer": "да", "пояснение": "Функция str_contains() корректно определяет наличие подстроки 'world' в строке 'Hello world' и возвращает true."}
верноstr_contains с PHP 8.0 проверяет вхождение подстроки.
T03-L3
0.4 c
Строкиstr_pad() умеет дополнять строку только справа.«нет»
Пояснение: str_pad() умеет дополнять строку как справа, так и слева, а также по центру, в зависимости от параметра side.
Raw
{"answer": "нет", "пояснение": "str_pad() умеет дополнять строку как справа, так и слева, а также по центру, в зависимости от параметра side."}
верноSTR_PAD_LEFT / STR_PAD_BOTH меняют сторону дополнения.
T03-L4
0.46 c
СтрокиПо умолчанию trim() срезает только пробелы, не трогая табы и переводы строк.«нет»
Пояснение: По умолчанию trim() срезает все пробельные символы (пробелы, табы, переводы строк, возврата каретки и вертикальный таб).
Raw
{"answer": "нет", "пояснение": "По умолчанию trim() срезает все пробельные символы (пробелы, табы, переводы строк, возврата каретки и вертикальный таб)."}
верноСписок символов по умолчанию: « \t\n\r\0\x0B» — пробелы, табы, переводы строк, возврат каретки, null-байт, вертикальный таб. Проверено php -r.
T03-L5
0.44 c
СтрокиСколько БАЙТ вернёт strlen('привет') для строки в UTF-8?«10»
Пояснение: В UTF-8 каждый символ 'привет' занимает 2 байта, поэтому strlen вернёт 10.
Raw
{ ⏎   "answer": 10, ⏎   "пояснение": "В UTF-8 каждый символ 'привет' занимает 2 байта, поэтому strlen вернёт 10." ⏎ }
неверно
верный: «12»
6 букв по 2 байта: 12.
T03-L6
0.52 c
СтрокиЧто вернёт substr('abcdef', -3)?«def»
Пояснение: Функция substr() с отрицательным вторым аргументом -3 начинает извлечение символов с третьего по последнему, возвращая подстроку 'def'.
Raw
{"answer": "def", "пояснение": "Функция substr() с отрицательным вторым аргументом -3 начинает извлечение символов с третьего по последнему, возвращая подстроку 'def'."}
верноОтрицательное смещение — с конца: def.
T03-L7
0.43 c
Строкиucfirst() изменяет строку, переданную ей, на месте.«нет»
Пояснение: Функция ucfirst() в PHP не изменяет строку на месте, а возвращает новую строку с первой буквой в верхнем регистре.
Raw
{"answer": "нет", "пояснение": "Функция ucfirst() в PHP не изменяет строку на месте, а возвращает новую строку с первой буквой в верхнем регистре."}
верноСтроки неизменяемы; ucfirst возвращает новую строку.
T03-L8
0.3 c
СтрокиВ heredoc работают интерполяция переменных, а в nowdoc — нет.«да»
Пояснение: Heredoc поддерживает интерполяцию переменных, а nowdoc не интерполирует их.
Raw
{"answer":"да","пояснение":"Heredoc поддерживает интерполяцию переменных, а nowdoc не интерполирует их."}
верноNowdoc — «одинарные кавычки» в тройном синтаксисе: текст как есть.
T04-L1
0.39 c
МассивыФункция sort() сохраняет связь ключей и значений массива.«нет»
Пояснение: sort() сортирует только значения массива, а ключи переиндексуются, теряя исходную связь с значениями.
Raw
{"answer": "нет", "пояснение": "sort() сортирует только значения массива, а ключи переиндексуются, теряя исходную связь с значениями."}
верноsort перенумеровывает ключи; связь сохраняет asort.
T04-L2
0.41 c
МассивыСтроковый ключ '5' в массиве сохраняется как целое число 5.«да»
Пояснение: В PHP ключи строки, которые представляют собой целые числа, автоматически преобразуются в целые числа при хранении в массиве.
Raw
{"answer": "да", "пояснение": "В PHP ключи строки, которые представляют собой целые числа, автоматически преобразуются в целые числа при хранении в массиве."}
верноКаноничные десятичные строковые ключи приводятся к int.
T04-L3
0.43 c
МассивыФункция in_array() по умолчанию использует строгое сравнение (===).«нет»
Пояснение: По умолчанию in_array() использует слабое сравнение, строгое включается только при передаче третьего аргумента true.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "По умолчанию in_array() использует слабое сравнение, строгое включается только при передаче третьего аргумента true." ⏎ }
верноПо умолчанию сравнение нестрогое; строгое — третий аргумент true.
T04-L4
0.38 c
Массивыarray_filter() без колбэка удаляет из массива все «пустые» (falsy) элементы.«да»
Пояснение: Без предикатного колбэка array_filter() действительно оставляет только те элементы, которые не являются falsy.
Raw
{"answer": "да", "пояснение": "Без предикатного колбэка array_filter() действительно оставляет только те элементы, которые не являются falsy."}
верноУбирает 0, "", null, false и пустые массивы.
T04-L5
0.45 c
МассивыФункция array_slice() по умолчанию сохраняет исходные числовые ключи массива.«да»
Пояснение: Функция array_slice() по умолчанию сохраняет исходные числовые ключи массива, если третий параметр preserve_keys установлен в true, что является значением по умолчанию.
Raw
{"answer": "да", "пояснение": "Функция array_slice() по умолчанию сохраняет исходные числовые ключи массива, если третий параметр preserve_keys установлен в true, что является значением по умолчанию."}
неверно
верный: «нет»
По умолчанию ключи перенумеровываются; сохранение — preserve_keys = true.
T04-L6
0.54 c
МассивыЧто вернёт array_slice([10, 20, 30, 40], 1, 2)?«[20, 30]»
Пояснение: array_slice возвращает элементы массива начиная с индекса 1 (20) и берёт 2 элемента, то есть [20, 30].
Raw
{ ⏎   "answer": "[20, 30]", ⏎   "пояснение": "array_slice возвращает элементы массива начиная с индекса 1 (20) и берёт 2 элемента, то есть [20, 30]." ⏎ }
верно[20,30]; ключи перенумеровываются.
T04-L7
0.62 c
МассивыСколько элементов будет в count(['a' => 1] + ['a' => 9, 'b' => 2])?«2»
Пояснение: Оператор + объединяет массивы, при этом значение из первого массива ('a' => 1) перекрывает значение из второго ('a' => 9), в итоге остаются ключи 'a' и 'b'.
Raw
{"answer": 2, "пояснение": "Оператор + объединяет массивы, при этом значение из первого массива ('a' => 1) перекрывает значение из второго ('a' => 9), в итоге остаются ключи 'a' и 'b'."}
верноОператор + : по ключу 'a' побеждает левый; итого 2.
T04-L8
0.5 c
МассивыSpread-оператор [...$a, ...$b] с PHP 8.1 поддерживает массивы со строковыми ключами.«нет»
Пояснение: Spread-оператор в PHP 8.1 для массивов поддерживает только целочисленные ключи (включая последовательные), а строковые ключи не поддерживаются.
Raw
{"answer":"нет","пояснение":"Spread-оператор в PHP 8.1 для массивов поддерживает только целочисленные ключи (включая последовательные), а строковые ключи не поддерживаются."}
неверно
верный: «да»
В 8.0 — только числовые ключи; 8.1 снял ограничение.
T05-L1
0.57 c
Функции и замыканияИменованные аргументы нельзя комбинировать с распаковкой массива ...$args в одном вызове.«да»
Пояснение: В PHP действительно запрещено комбинировать именованные аргументы и оператор распаковки массива в одном вызове функции, так как это приводит к ошибке синтаксиса.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "В PHP действительно запрещено комбинировать именованные аргументы и оператор распаковки массива в одном вызове функции, так как это приводит к ошибке синтаксиса." ⏎ }
неверно
верный: «нет»
Можно: f(...$args, имя: значение). Нельзя только позиционный аргумент после распаковки.
T05-L2
0.39 c
Функции и замыканияАнонимная функция без use видит переменные внешней области видимости.«да»
Пояснение: Анонимные функции в PHP по умолчанию наследуют переменные из области видимости, где они определены.
Raw
{"answer": "да", "пояснение": "Анонимные функции в PHP по умолчанию наследуют переменные из области видимости, где они определены."}
неверно
верный: «нет»
Без use внешние переменные недоступны; авто-захват только у fn.
T05-L3
0.46 c
Функции и замыканияЧто вернёт func_num_args() внутри function f($a) { return func_num_args(); } при вызове f(1, 2, 3)?«3»
Пояснение: func_num_args() возвращает количество аргументов, переданных в текущую функцию, независимо от того, что указано в её определении.
Raw
{ ⏎   "answer": "3", ⏎   "пояснение": "func_num_args() возвращает количество аргументов, переданных в текущую функцию, независимо от того, что указано в её определении." ⏎ }
верноСчитает переданные аргументы: 3.
T05-L4
0.49 c
Функции и замыканияТело стрелочной функции fn может состоять из нескольких выражений в фигурных скобках.«— (нет ответа)»
Пояснение: Синтаксис fn() допускает как выражение-стрелку, так и блок кода в фигурных скобках с несколькими выражениями.
Raw
{"answer": "верно", "пояснение": "Синтаксис fn() допускает как выражение-стрелку, так и блок кода в фигурных скобках с несколькими выражениями."}
не разобрано
верный: «нет»
парсинг: нет
fn — всегда одно выражение; блок операторов делает обычная анонимная функция.
T05-L5
0.38 c
Функции и замыканияСтрелочная функция fn захватывает внешние переменные по ссылке (лениво, при использовании).«нет»
Пояснение: Стрелочная функция fn в PHP захватывает внешние переменные по значению, а не по ссылке.
Raw
{"answer": "нет", "пояснение": "Стрелочная функция fn в PHP захватывает внешние переменные по значению, а не по ссылке."}
верноfn захватывает только по значению, автоматически; по ссылке — только &$var в use у обычной функции (fn так не умеет).
T05-L6
0.44 c
Функции и замыканияЗамыкание, объявленное как static function () {}, не захватывает $this.«да»
Пояснение: Static closures в PHP всегда исполняются в статическом контексте и не имеют доступа к $this, поэтому они не могут захватывать текущий экземпляр.
Raw
{"answer": "да", "пояснение": "Static closures в PHP всегда исполняются в статическом контексте и не имеют доступа к $this, поэтому они не могут захватывать текущий экземпляр."}
верноstatic-замыкание отвязано от объекта: $this внутри недоступен.
T05-L7
0.36 c
Функции и замыканияЧто выведет: $x = 5; $f = function () use ($x) { return $x; }; $x = 7; echo $f();«5»
Пояснение: Closure захватывает $x по значению, поэтому возвращает значение 5, а не 7.
Raw
{"answer": 5, "пояснение": "Closure захватывает $x по значению, поэтому возвращает значение 5, а не 7."}
верноuse захватывает по значению в момент создания: 5.
T05-L8
0.41 c
Функции и замыканияВ «слабом» режиме типизации (без strict_types) передача строки "5" в параметр с типом int допустима.«да»
Пояснение: В слабой типизации PHP строка, представляющая собой целое число, автоматически приводится к типу int.
Raw
{"answer": "да", "пояснение": "В слабой типизации PHP строка, представляющая собой целое число, автоматически приводится к типу int."}
верноCoercive typing приводит "5" к 5; strict_types=1 требует точного типа.
T06-L1
0.31 c
ООП: классы и наследованиеPHP поддерживает promotion свойств в конструкторе: public function __construct(private int $x) {}.«да»
Пояснение: Конструктор с использованием promotion свойств был добавлен в PHP 8.0.
Raw
{"answer": "да", "пояснение": "Конструктор с использованием promotion свойств был добавлен в PHP 8.0."}
верноС PHP 8.0 параметр с модификатором создаёт свойство и присваивание.
T06-L2
0.36 c
ООП: классы и наследованиеКакое ключевое слово запрещает переопределять метод в подклассах?«final»
Пояснение: Ключевое слово final запрещает переопределять методы в подклассах и наследование класса.
Raw
{"answer": "final", "пояснение": "Ключевое слово final запрещает переопределять методы в подклассах и наследование класса."}
верноfinal.
T06-L3
0.35 c
ООП: классы и наследованиеМетод, объявленный как final, нельзя переопределить в подклассе.«да»
Пояснение: В PHP модификатор final запрещает переопределение метода в дочерних классах.
Raw
{"answer": "да", "пояснение": "В PHP модификатор final запрещает переопределение метода в дочерних классах."}
верноfinal запрещает переопределение метода и наследование класса.
T06-L4
0.38 c
ООП: классы и наследованиеСвойства родителя с видимостью private доступны в подклассе.«нет»
Пояснение: Свойства с видимостью private недоступны напрямую из подкласса, доступ возможен только внутри класса, где они объявлены.
Raw
{"answer": "нет", "пояснение": "Свойства с видимостью private недоступны напрямую из подкласса, доступ возможен только внутри класса, где они объявлены."}
верноВ подклассе видны protected и public; private — только внутри своего класса.
T06-L5
0.51 c
ООП: классы и наследованиеЧто вернёт get_class(new class {})? Ответь частью имени до нулевого байта (без пути к файлу).«anonymousclass»
Пояснение: get_class(new class {}) возвращает строку вида AnonymousClass#<номер> с нулевым байтом, а часть до нулевого байта — AnonymousClass.
Raw
{ ⏎   "answer": "AnonymousClass", ⏎   "пояснение": "get_class(new class {}) возвращает строку вида AnonymousClass#<номер> с нулевым байтом, а часть до нулевого байта — AnonymousClass." ⏎ }
неверно
верный: «class@anonymous»
get_class анонимного класса печатает class@anonymous\0<файл>:<строка>$n; короткая форма — часть до NUL-байта. Проверено php -r (hex).
T06-L6
0.57 c
ООП: классы и наследованиеprivate-метод родителя не входит в контракт наследования: потомок может объявить метод с тем же именем с любой видимостью.«да»
Пояснение: В PHP private-методы не наследуются и не участвуют в полиморфизме, поэтому потомок свободно может объявить метод с тем же именем с любой видимостью.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "В PHP private-методы не наследуются и не участвуют в полиморфизме, поэтому потомок свободно может объявить метод с тем же именем с любой видимостью." ⏎ }
верноprivate-члены не наследуются — правила совместимости подписей не действуют.
T06-L7
0.77 c
ООП: классы и наследованиеМагический метод __get() вызывается только для несуществующих свойств.«нет»
Пояснение: Магический метод __get() вызывается при попытке обращения к несуществующему свойству объекта (или при чтении защищённого/приватного свойства, если оно не было объявлено как публичное), но не «только для несуществующих», а для свойств, к которым нет прямого доступа.
Raw
{"answer": "нет", "пояснение": "Магический метод __get() вызывается при попытке обращения к несуществующему свойству объекта (или при чтении защищённого/приватного свойства, если оно не было объявлено как публичное), но не «только для несуществующих», а для свойств, к которым нет прямого доступа."}
верно__get срабатывает и для существующих, но недоступных (private/protected извне).
T06-L8
0.48 c
ООП: классы и наследованиеЧто бросит повторное присваивание readonly-свойства — Exception или Error?«error»
Пояснение: В PHP 8.1+ повторное присваивание readonly-свойства после инициализации вызывает фатальную ошибку (Error).
Raw
{"answer": "Error", "пояснение": "В PHP 8.1+ повторное присваивание readonly-свойства после инициализации вызывает фатальную ошибку (Error)."}
верноError (readonly с 8.1); оговорка: в __clone() переинициализация допустима (8.3+).
T07-L1
0.42 c
Интерфейсы, трейты, enumИнтерфейс может объявлять константы.«да»
Пояснение: Интерфейсы в PHP могут объявлять константы, которые должны быть определены в каждой реализации интерфейса.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "Интерфейсы в PHP могут объявлять константы, которые должны быть определены в каждой реализации интерфейса." ⏎ }
верноКонстанты интерфейса наследуются реализациями.
T07-L2
0.33 c
Интерфейсы, трейты, enumКакой оператор проверяет, что объект реализует класс или интерфейс?«instanceof»
Пояснение: Оператор instanceof проверяет, является ли объект экземпляром конкретного класса или реализует интерфейс.
Raw
{"answer": "instanceof", "пояснение": "Оператор instanceof проверяет, является ли объект экземпляром конкретного класса или реализует интерфейс."}
верноinstanceof.
T07-L3
0.62 c
Интерфейсы, трейты, enumИнтерфейс может объявлять статические методы.«нет»
Пояснение: В PHP 8.3+ интерфейсы могут объявлять static methods, но в предыдущих версиях это запрещено; однако, учитывая, что PHP 8.3 действительно позволяет это, нужно уточнить контекст: если вопрос из текущего актуального PHP, то верно.
Raw
{"answer":"нет","пояснение":"В PHP 8.3+ интерфейсы могут объявлять static methods, но в предыдущих версиях это запрещено; однако, учитывая, что PHP 8.3 действительно позволяет это, нужно уточнить контекст: если вопрос из текущего актуального PHP, то верно."}
неверно
верный: «да»
Реализация обязана дать статический метод с той же сигнатурой.
T07-L4
0.45 c
Интерфейсы, трейты, enumОператор instanceof проверяет только наследование классов: интерфейсы он не учитывает.«нет»
Пояснение: Оператор instanceof проверяет, является ли объект экземпляром конкретного класса или любого интерфейса, который этот класс реализует, поэтому он учитывает интерфейсы.
Raw
{"answer":"нет","пояснение":"Оператор instanceof проверяет, является ли объект экземпляром конкретного класса или любого интерфейса, который этот класс реализует, поэтому он учитывает интерфейсы."}
верноinstanceof возвращает true и для интерфейсов объекта.
T07-L5
0.31 c
Интерфейсы, трейты, enumМетод интерфейса может иметь реализацию по умолчанию, как метод трейта.«нет»
Пояснение: Интерфейсы в PHP не могут содержать реализаций методов, тогда как трейты их поддерживают.
Raw
{"answer":"нет","пояснение":"Интерфейсы в PHP не могут содержать реализаций методов, тогда как трейты их поддерживают."}
верноМетоды интерфейса — только сигнатуры; тело даёт реализующий класс.
T07-L6
0.43 c
Интерфейсы, трейты, enumАбстрактный метод в абстрактном классе может иметь видимость protected.«да»
Пояснение: Абстрактные методы в PHP по умолчанию имеют видимость public, но их видимость можно изменить на protected или private, что является допустимым.
Raw
{"answer": "да", "пояснение": "Абстрактные методы в PHP по умолчанию имеют видимость public, но их видимость можно изменить на protected или private, что является допустимым."}
верноВ абстрактном классе — любая видимость; в интерфейсе — только public.
T07-L7
0.4 c
Интерфейсы, трейты, enumСколько элементов вернёт Foo::cases() для enum Foo { case A; case B; case C; }?«3»
Пояснение: Свойство cases() у PHP enum возвращает массив всех объявленных случаев, в данном случае три: A, B и C.
Raw
{"answer": 3, "пояснение": "Свойство cases() у PHP enum возвращает массив всех объявленных случаев, в данном случае три: A, B и C."}
верноСтатический метод cases(): 3.
T07-L8
0.36 c
Интерфейсы, трейты, enumТрейт может объявлять константы.«да»
Пояснение: В PHP трейты могут объявлять константы, которые наследуются классами, использующими этот трейт.
Raw
{"answer":"да","пояснение":"В PHP трейты могут объявлять константы, которые наследуются классами, использующими этот трейт."}
верноС PHP 8.2 трейты могут объявлять константы (RFC constants_in_traits); до 8.2 — нет.
T08-L1
0.32 c
Исключения и ошибкиИнтерфейс Throwable — общий предок и для Exception, и для Error.«да»
Пояснение: Интерфейс Throwable является общим родителем для классов Exception и Error в PHP.
Raw
{"answer": "да", "пояснение": "Интерфейс Throwable является общим родителем для классов Exception и Error в PHP."}
верноИерархия с PHP 7: Throwable → Exception и Throwable → Error.
T08-L2
0.42 c
Исключения и ошибкиБлок catch (Exception $e) перехватит и TypeError, потому что TypeError в итоге наследуется от Exception.«да»
Пояснение: TypeError является дочерним классом Exception, поэтому блок catch (Exception $e) корректно его перехватит.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "TypeError является дочерним классом Exception, поэтому блок catch (Exception $e) корректно его перехватит." ⏎ }
неверно
верный: «нет»
TypeError наследуется от Error; catch (Exception) его не ловит.
T08-L3
0.52 c
Исключения и ошибкиОператор @ подавляет и исключения тоже.«да»
Пояснение: В PHP оператор @ подавляет все сообщения об ошибках, включая ошибки (E_USER_ERROR и выше), которые преобразуются в исключения, а также сами исключения, возникшие внутри выражения, где он используется.
Raw
{"answer": "да", "пояснение": "В PHP оператор @ подавляет все сообщения об ошибках, включая ошибки (E_USER_ERROR и выше), которые преобразуются в исключения, а также сами исключения, возникшие внутри выражения, где он используется."}
неверно
верный: «нет»
@ глушит диагностику (warnings/notices), исключения не перехватывает.
T08-L4
0.35 c
Исключения и ошибкиКакой класс ошибки бросит intdiv(5, 0)?«divisionbyzeroexception»
Пояснение: intdiv(5, 0) бросает исключение типа DivisionByZeroException.
Raw
{"answer": "DivisionByZeroException", "пояснение": "intdiv(5, 0) бросает исключение типа DivisionByZeroException."}
неверно
верный: «divisionbyzeroerror»
DivisionByZeroError (иерархия Error, не Exception); php-грейдер объективен.
T08-L5
0.34 c
Исключения и ошибкиБлок finally выполняется только если исключение было поймано блоком catch.«нет»
Пояснение: Блок finally выполняется всегда, независимо от того, было ли поймано исключение или нет.
Raw
{"answer": "нет", "пояснение": "Блок finally выполняется всегда, независимо от того, было ли поймано исключение или нет."}
верноНаоборот: finally выполняется всегда — даже когда исключение не поймано и уходит выше. Проверено php -r.
T08-L6
0.5 c
Исключения и ошибкиИсключение, выброшенное внутри блока finally, никак не влияет на результат try-блока.«нет»
Пояснение: Исключение в блоке finally может отменить или изменить исходное исключение из try-блока, перекрыв его и влияя на финальный результат выполнения.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Исключение в блоке finally может отменить или изменить исходное исключение из try-блока, перекрыв его и влияя на финальный результат выполнения." ⏎ }
верноИсключение из finally перекрывает исходное и уходит вместо него.
T08-L7
0.28 c
Исключения и ошибкиЧто вернёт выражение: (bool) new Exception('x')?«да»
Пояснение: Любой объект в PHP при приведении к bool даёт true.
Raw
{"answer": "да", "пояснение": "Любой объект в PHP при приведении к bool даёт true."}
верноЛюбой объект при приведении к bool — true. Формы ответа: true или да.
T08-L8
0.34 c
Исключения и ошибкиФункции, зарегистрированные через register_shutdown_function(), выполняются при вызове exit.«нет»
Пояснение: register_shutdown_function() выполняет функции при завершении исполнения скрипта, а не при каждом вызове exit().
Raw
{"answer": "нет", "пояснение": "register_shutdown_function() выполняет функции при завершении исполнения скрипта, а не при каждом вызове exit()."}
неверно
верный: «да»
exit завершает скрипт, но shutdown-функции отрабатывают.
T09-L1
0.39 c
Пространства имён и автозагрузкаДиректива use App\Service\Mailer; сама по себе подключает файл с классом.«нет»
Пояснение: Директива use только подключает алиас класса, но не выполняет файл с его определением.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Директива use только подключает алиас класса, но не выполняет файл с его определением." ⏎ }
верноuse — псевдоним на этапе компиляции; файл грузит автозагрузчик при первом обращении.
T09-L2
0.45 c
Пространства имён и автозагрузкаЧто пишут после use, чтобы импортировать функцию (а не класс): слово function или const?«function»
Пояснение: В PHP импортируются только классы и имена пространств, а функции и константы не импортируются через use.
Raw
{ ⏎   "answer": "function", ⏎   "пояснение": "В PHP импортируются только классы и имена пространств, а функции и константы не импортируются через use." ⏎ }
верноuse function ...; (и use const для констант).
T09-L3
0.52 c
Пространства имён и автозагрузкаВ какой файл (путь от src/) PSR-4 «App\ → src/» положит класс App\Controller\Api\UserController?«src/controller/api/usercontroller.php»
Пояснение: Согласно PSR-4, namespace преобразуется в путь к файлу, заменяя слэши в имени пространства имён на разделители директорий.
Raw
{"answer": "src/Controller/Api/UserController.php", "пояснение": "Согласно PSR-4, namespace преобразуется в путь к файлу, заменяя слэши в имени пространства имён на разделители директорий."}
верноОстаток имени после префикса, \ → /.
T09-L4
0.45 c
Пространства имён и автозагрузкаПодключение vendor/autoload.php регистрирует обработчики через spl_autoload_register().«да»
Пояснение: Функция spl_autoload_register() устанавливает функцию для автоматического загрузки классов, и именно так работает автозагрузчик Composer через vendor/autoload.php.
Raw
{"answer": "да", "пояснение": "Функция spl_autoload_register() устанавливает функцию для автоматического загрузки классов, и именно так работает автозагрузчик Composer через vendor/autoload.php."}
верноComposer ставит автозагрузчик именно на spl_autoload_register.
T09-L5
0.39 c
Пространства имён и автозагрузкаМагическая константа __NAMESPACE__ содержит имя текущего пространства имён.«да»
Пояснение: Магическая константа __NAMESPACE__ в PHP действительно содержит имя текущего пространства имён, в котором объявлен текущий код.
Raw
{"answer": "да", "пояснение": "Магическая константа __NAMESPACE__ в PHP действительно содержит имя текущего пространства имён, в котором объявлен текущий код."}
верноВ корневом пространстве — пустая строка.
T09-L6
0.41 c
Пространства имён и автозагрузкаОтносительное имя класса (без ведущего \) в new резолвится от глобального корня.«нет»
Пояснение: В PHP относительное имя класса в `new` резолвится от текущего пространства имён (current namespace), а не от глобального корня.
Raw
{"answer":"нет","пояснение":"В PHP относительное имя класса в `new` резолвится от текущего пространства имён (current namespace), а не от глобального корня."}
верноРезолвится относительно текущего namespace (с учётом импортов).
T09-L7
0.49 c
Пространства имён и автозагрузкаПри маппинге PSR-4 «App\ → src/» класс App\Model\User лежит в файле src/Model/User.php.«да»
Пояснение: PSR-4 преобразует namespace в путь к файлу с заменой слеших на каталоги, поэтому App\Model\User действительно лежит в src/Model/User.php.
Raw
{"answer": "да", "пояснение": "PSR-4 преобразует namespace в путь к файлу с заменой слеших на каталоги, поэтому App\\Model\\User действительно лежит в src/Model/User.php."}
верноОстаток имени после префикса переносится в путь как есть.
T09-L8
0.38 c
Пространства имён и автозагрузкаДирективу use можно писать внутри тела функции — импорт будет действовать для этой функции.«нет»
Пояснение: Директивы use в PHP работают только на уровне файла, а не внутри функций.
Raw
{ ⏎ "answer": "нет", ⏎ "пояснение": "Директивы use в PHP работают только на уровне файла, а не внутри функций." ⏎ }
верноuse внутри тела функции — parse error; импорты файловые и компиляционные.
T10-L1
0.3 c
Ссылки и область видимостиМассивы при присваивании копируются, а не передаются по ссылке.«— (нет ответа)»
Пояснение: По умолчанию массивы в PHP копируются при присваивании и изменении.
Raw
{"answer":"верно","пояснение":"По умолчанию массивы в PHP копируются при присваивании и изменении."}
не разобрано
верный: «да»
парсинг: нет
Присваивание массива — копия (в движке — copy-on-write).
T10-L2
0.35 c
Ссылки и область видимостиЧто выведет: $a = [1, 2]; $b = $a; $b[] = 3; echo count($a);«2»
Пояснение: В PHP массив копируется при присваивании, поэтому изменение $b не влияет на $a.
Raw
{"answer": 2, "пояснение": "В PHP массив копируется при присваивании, поэтому изменение $b не влияет на $a."}
верноПрисваивание — копия: в $a по-прежнему 2 элемента.
T10-L3
0.44 c
Ссылки и область видимостиВнутри функции пользовательские переменные глобальной области недоступны без global, $GLOBALS или передачи параметром.«да»
Пояснение: Пользовательские переменные глобального уровня не видны внутри функций без явного объявления global, доступа через $GLOBALS или передачи аргументом.
Raw
{"answer": "да", "пояснение": "Пользовательские переменные глобального уровня не видны внутри функций без явного объявления global, доступа через $GLOBALS или передачи аргументом."}
верноОбласть видимости функций изолирована; исключение — суперглобалы ($_GET и др.).
T10-L4
0.44 c
Ссылки и область видимостиunset($GLOBALS['x']) внутри функции удаляет глобальную переменную только для этой функции.«нет»
Пояснение: unset($GLOBALS['x']) удаляет переменную из глобального пространства имён полностью, а не только в рамках текущей функции.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "unset($GLOBALS['x']) удаляет переменную из глобального пространства имён полностью, а не только в рамках текущей функции." ⏎ }
верно$GLOBALS — прямое окно в глобальную область: unset удалит её по-настоящему.
T10-L5
0.35 c
Ссылки и область видимостиЧто выведет: function inc(&$x) { $x++; } $n = 5; inc($n); echo $n;«6»
Пояснение: Функция инкрементирует $n по ссылке, поэтому переменная изменяется до 6.
Raw
{"answer": 6, "пояснение": "Функция инкрементирует $n по ссылке, поэтому переменная изменяется до 6."}
верноСсылка меняет оригинал: 6.
T10-L6
0.36 c
Ссылки и область видимостиForeach по массиву (по значению) работает с «живым» массивом: изменения массива внутри цикла видны в этом же проходе.«нет»
Пояснение: foreach по значению работает с копией массива и не отражает изменения массива в текущем проходе.
Raw
{"answer": "нет", "пояснение": "foreach по значению работает с копией массива и не отражает изменения массива в текущем проходе."}
верноПо значению foreach итерирует копию-снимок.
T10-L7
0.51 c
Ссылки и область видимостиСтатическое свойство класса у каждого экземпляра своё: изменения в одном объекте не видны в других.«нет»
Пояснение: Статическое свойство принадлежит классу, а не экземплярам, и все объекты разделяют одну и ту же переменную, поэтому изменения видны во всех экземплярах.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Статическое свойство принадлежит классу, а не экземплярам, и все объекты разделяют одну и ту же переменную, поэтому изменения видны во всех экземплярах." ⏎ }
верноНаоборот: статическое свойство общее для всех экземпляров класса. Проверено php -r.
T10-L8
0.38 c
Ссылки и область видимостиМассив может иметь булев ключ true, и он сохранится как bool.«да»
Пояснение: В PHP массивы могут содержать булевые ключи, которые сохраняются в виде true или false.
Raw
{"answer": "да", "пояснение": "В PHP массивы могут содержать булевые ключи, которые сохраняются в виде true или false."}
неверно
верный: «нет»
Булев ключ приводится к int: true → 1, false → 0.
T11-L1
0.4 c
Генераторы, итераторы, SPLВнутри генератора можно использовать return со значением, и оно попадёт в $gen->getReturn().«да»
Пояснение: Использование return с аргументом внутри генератора возвращает значение в результат getReturn().
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "Использование return с аргументом внутри генератора возвращает значение в результат getReturn()." ⏎ }
верноreturn-значение генератора доступно через getReturn() после прохода.
T11-L2
0.38 c
Генераторы, итераторы, SPLПолностью пройденный генератор можно «перемотать» через rewind() и пройти снова.«да»
Пояснение: Метод rewind() действительно позволяет сбросить полностью пройденный генератор к началу для повторного перебора.
Raw
{"answer": "да", "пояснение": "Метод rewind() действительно позволяет сбросить полностью пройденный генератор к началу для повторного перебора."}
неверно
верный: «нет»
Генератор одноразовый: rewind после начала итерации бросает Exception.
T11-L3
0.34 c
Генераторы, итераторы, SPLКонструкция yield from делегирует проход другому генератору или итерируемому объекту.«да»
Пояснение: yield from действительно делегирует получение значений другому генератору или итерируемому объекту.
Raw
{"answer": "да", "пояснение": "yield from действительно делегирует получение значений другому генератору или итерируемому объекту."}
верноyield from проксирует значения, ключи и return-значение внутреннего генератора.
T11-L4
0.3 c
Генераторы, итераторы, SPLЧто вернёт get_class(g()) для function g() { yield 1; }?«generator»
Пояснение: Функции с yield создают объекты Generator, и get_class возвращает их имя класса.
Raw
{"answer":"Generator","пояснение":"Функции с yield создают объекты Generator, и get_class возвращает их имя класса."}
верноФункция с yield возвращает Generator.
T11-L5
0.44 c
Генераторы, итераторы, SPLСколько элементов вернёт count(iterator_to_array((function () { yield from [1, 2, 3]; })()));«3»
Пояснение: yield from [1, 2, 3] создаёт генератор с тремя элементами, а count(iterator_to_array(...)) возвращает 3.
Raw
{"answer": 3, "пояснение": "yield from [1, 2, 3] создаёт генератор с тремя элементами, а count(iterator_to_array(...)) возвращает 3."}
верноyield from делегирует все 3 элемента.
T11-L6
0.39 c
Генераторы, итераторы, SPLКласс SplStack реализует очередь FIFO.«нет»
Пояснение: Класс SplStack реализует структуру данных LIFO (стек), а не FIFO (очередь).
Raw
{"answer": "нет", "пояснение": "Класс SplStack реализует структуру данных LIFO (стек), а не FIFO (очередь)."}
верноSplStack — стек LIFO; очередь FIFO — SplQueue.
T11-L7
0.37 c
Генераторы, итераторы, SPLArrayIterator позволяет обернуть массив и обходить его через интерфейс Iterator.«да»
Пояснение: ArrayIterator — это встроенный класс PHP, который реализует интерфейсы Iterator и SeekableIterator для обхода массивов.
Raw
{"answer": "да", "пояснение": "ArrayIterator — это встроенный класс PHP, который реализует интерфейсы Iterator и SeekableIterator для обхода массивов."}
верноОбъектная обёртка над массивом.
T11-L8
0.3 c
Генераторы, итераторы, SPLОбъект класса ArrayObject нельзя обойти через foreach.«нет»
Пояснение: ArrayObject можно обойти через foreach, так как он реализует интерфейс Traversable.
Raw
{"answer": "нет", "пояснение": "ArrayObject можно обойти через foreach, так как он реализует интерфейс Traversable."}
верноArrayObject реализует IteratorAggregate — foreach по нему работает.
T12-L1
0.42 c
Конфигурация и безопасностьpassword_hash() генерирует соль автоматически — передавать её отдельно не нужно.«да»
Пояснение: Функция password_hash() автоматически генерирует соль, храня её в возвращаемом хеше, поэтому передавать её отдельно не нужно.
Raw
{"answer": "да", "пояснение": "Функция password_hash() автоматически генерирует соль, храня её в возвращаемом хеше, поэтому передавать её отдельно не нужно."}
верноСоль встраивается в строку результата; параметр salt устарел.
T12-L2
0.33 c
Конфигурация и безопасностьАлгоритм PASSWORD_DEFAULT в PHP 8 — это md5 с автоматически добавленной солью.«нет»
Пояснение: PASSWORD_DEFAULT в PHP 8 использует алгоритм bcrypt (а не MD5 с солью).
Raw
{"answer": "нет", "пояснение": "PASSWORD_DEFAULT в PHP 8 использует алгоритм bcrypt (а не MD5 с солью)."}
верноPASSWORD_DEFAULT — bcrypt; md5 для паролей непригоден (перебирается массово).
T12-L3
0.39 c
Конфигурация и безопасностьЧто вернёт password_verify('secret', password_hash('secret', PASSWORD_DEFAULT))?«true»
Пояснение: password_hash с PASSWORD_DEFAULT использует bcrypt, и password_verify вернёт true при совпадении пароля с его хешем.
Raw
{"answer": true, "пояснение": "password_hash с PASSWORD_DEFAULT использует bcrypt, и password_verify вернёт true при совпадении пароля с его хешем."}
верноСоль и хеш в одной строке: true (форма ответа: true или да).
T12-L4
0.4 c
Конфигурация и безопасностьФункция strip_tags() защищает от SQL-инъекций.«нет»
Пояснение: strip_tags() удаляет HTML-теги для защиты от XSS, а не SQL-инъекции.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "strip_tags() удаляет HTML-теги для защиты от XSS, а не SQL-инъекции." ⏎ }
верноstrip_tags режет HTML-теги (помощник против XSS), к параметризации SQL отношения не имеет.
T12-L5
0.51 c
Конфигурация и безопасностьФункция session_regenerate_id() используется для защиты от фиксации сессии при входе пользователя.«да»
Пояснение: session_regenerate_id() сменяет идентификатор сессии, что предотвращает атаки на фиксацию сессии после изменения привилегий пользователя, например, при входе.
Raw
{"answer": "да", "пояснение": "session_regenerate_id() сменяет идентификатор сессии, что предотвращает атаки на фиксацию сессии после изменения привилегий пользователя, например, при входе."}
верноНовый ID сессии после логина — стандартная защита от session fixation.
T12-L6
0.32 c
Конфигурация и безопасностьКакая встроенная функция возвращает имя SAPI (например, cli)?«php_sapi_name»
Пояснение: Функция php_sapi_name() возвращает имя активного SAPI.
Raw
{"answer": "php_sapi_name", "пояснение": "Функция php_sapi_name() возвращает имя активного SAPI."}
верноphp_sapi_name().
T12-L7
0.54 c
Конфигурация и безопасностьsession_destroy() удаляет данные сессии на сервере, но не cookie в браузере пользователя.«да»
Пояснение: session_destroy() удаляет данные сессии с сервера, но cookie с идентификатором сессии (SID) остаётся в браузере, пока не будет удалена отдельно.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "session_destroy() удаляет данные сессии с сервера, но cookie с идентификатором сессии (SID) остаётся в браузере, пока не будет удалена отдельно." ⏎ }
верноУдаление cookie — отдельный шаг через setcookie с истёкшим сроком.
T12-L8
0.42 c
Конфигурация и безопасностьБез вызова session_start() массив $_SESSION автоматически загружается данными сессии.«нет»
Пояснение: Без вызова session_start() сессия не инициализируется, и массив $_SESSION остаётся пустым.
Raw
{"answer": "нет", "пояснение": "Без вызова session_start() сессия не инициализируется, и массив $_SESSION остаётся пустым."}
верноБез session_start() данные сессии в массив не загружаются ($_SESSION можно заполнить вручную, но привязки к сессии нет).
VC-L1
0.4 c
PHP 8.4–8.5В какой версии PHP появилась функция array_find()?«да»
Пояснение: Функция array_find() не существует в PHP, она была предложена в RFC и не была принята в официальные версии языка.
Raw
{"answer": "да", "пояснение": "Функция array_find() не существует в PHP, она была предложена в RFC и не была принята в официальные версии языка."}
неверно
верный: «8.4»
PHP 8.4 (RFC array_find).
VC-L2
0.4 c
PHP 8.4–8.5Property hooks (get/set прямо в объявлении свойства) вошли в PHP 8.4.«нет»
Пояснение: Property hooks (get/set в объявлении свойства) не вошли в PHP 8.4, они не являются частью языка на данный момент.
Raw
{"answer": "нет", "пояснение": "Property hooks (get/set в объявлении свойства) не вошли в PHP 8.4, они не являются частью языка на данный момент."}
неверно
верный: «да»
Property hooks — PHP 8.4 (ноябрь 2024).
VC-L3
0.36 c
PHP 8.4–8.5Асимметричная видимость (public private(set) string $name) появилась в PHP 8.4.«да»
Пояснение: Синтаксис public private(set) string $name действительно был введён в PHP 8.4.
Raw
{"answer": "да", "пояснение": "Синтаксис public private(set) string $name действительно был введён в PHP 8.4."}
верноAsymmetric visibility v2 — PHP 8.4.
VC-L4
0.35 c
PHP 8.4–8.5В какой версии PHP впервые появился атрибут #[\NoDiscard]? Ответь номером версии.«8.1»
Пояснение: Атрибут #[\NoDiscard] был впервые представлен в PHP 8.1.
Raw
{"answer": "8.1", "пояснение": "Атрибут #[\\NoDiscard] был впервые представлен в PHP 8.1."}
неверно
верный: «8.5»
#[\NoDiscard] — PHP 8.5 (marking return values as important).
VC-L5
0.36 c
PHP 8.4–8.5В какой версии PHP впервые появился оператор конвейера |> (pipe)? Ответь номером версии.«8.1»
Пояснение: Оператор конвейера (pipe) |> был впервые представлен в PHP 8.1.
Raw
{"answer": "8.1", "пояснение": "Оператор конвейера (pipe) |> был впервые представлен в PHP 8.1."}
неверно
верный: «8.5»
Pipe operator — PHP 8.5 (2025).
VC-L6
0.28 c
PHP 8.4–8.5В какой версии PHP появился clone-with — синтаксис clone($obj, ['x' => 1])? Ответь номером версии.«нет»
Пояснение: Синтаксис clone-with в PHP никогда не существовал.
Raw
{"answer":"нет", "пояснение":"Синтаксис clone-with в PHP никогда не существовал."}
неверно
верный: «8.5»
Clone with v2 — PHP 8.5.
VC-L7
0.35 c
PHP 8.4–8.5В какой версии PHP появились функции array_first() и array_last()?«8.1»
Пояснение: Функции array_first() и array_last() были добавлены в PHP 8.1.
Raw
{"answer": 8.1, "пояснение": "Функции array_first() и array_last() были добавлены в PHP 8.1."}
неверно
верный: «8.5»
PHP 8.5.
VC-L8
0.37 c
PHP 8.4–8.5Для какой версии PHP был принят RFC Partial Function Application v2 (по состоянию на 07.11.2026)? Ответь номером версии.«8.3»
Пояснение: RFC Partial Function Application v2 был принят для PHP 8.3.
Raw
{ ⏎   "answer": 8.3, ⏎   "пояснение": "RFC Partial Function Application v2 был принят для PHP 8.3." ⏎ }
неверно
верный: «8.6»
PFA v2 принят 05.12.2025 (33-0-0), реализован в PHP 8.6.
VF-L1
0.38 c
PHP: 8.6+ и будущееДля какой версии PHP реализован RFC clamp_v2 (функция clamp()) по состоянию на 07.11.2026? Ответь номером версии.«8.4»
Пояснение: Функция clamp() была реализована в PHP 8.4 в соответствии с RFC clamp_v2.
Raw
{"answer": "8.4", "пояснение": "Функция clamp() была реализована в PHP 8.4 в соответствии с RFC clamp_v2."}
неверно
верный: «8.6»
По данным владельца (wiki.php.net/rfc): clamp_v2 — 8.6; clamp() в 8.5.11 отсутствует (косвенное подтверждение). Дата-якорь делает клетку монотонной.
VF-L2
0.84 c
PHP: 8.6+ и будущееRFC Context Managers v2 уже принят в PHP (на 07.11.2026).«да»
Пояснение: RFC Context Managers v2 был принят на 28 ноября 2023 года (vote: 2023-11-17, 2023-11-24), и реализован в PHP 8.5, что соответствует утверждению о принятии к дате 07.11.2026.
Raw
{"answer": "да", "пояснение": "RFC Context Managers v2 был принят на 28 ноября 2023 года (vote: 2023-11-17, 2023-11-24), и реализован в PHP 8.5, что соответствует утверждению о принятии к дате 07.11.2026."}
неверно
верный: «нет»
На 06.11.2026 — в обсуждении (создан 2026-10-23); не принят.
VF-L3
0.36 c
PHP: 8.6+ и будущееRFC Bound-Erased Generic Types (generics) был отклонён в 2026 году.«— (нет ответа)»
Пояснение: RFC о generics для PHP действительно был отклонён в 2026 году.
Raw
{"answer": "верно", "пояснение": "RFC о generics для PHP действительно был отклонён в 2026 году."}
не разобрано
верный: «да»
парсинг: нет
Голосование завершилось 2026-06-28: отклонён (wiki.php.net/rfc).
VF-L4
0.5 c
PHP: 8.6+ и будущееНа 07.11.2026 RFC о включении многопоточности (ZTS) по умолчанию уже принят в PHP.«нет»
Пояснение: На дату 07.11.2026 такой RFC не был принят, так как текущее состояние проекта не подтверждает принятие ZTS по умолчанию именно на этой дате.
Raw
{"answer": "нет", "пояснение": "На дату 07.11.2026 такой RFC не был принят, так как текущее состояние проекта не подтверждает принятие ZTS по умолчанию именно на этой дате."}
верноТакого принятого RFC нет на дату якоря; якорь делает клетку монотонной — при принятии RFC позже клетка не перевернётся.
VF-L5
0.34 c
PHP: 8.6+ и будущееВ PHP 8.5 дженериков (параметризованных типов) по-прежнему нет.«нет»
Пояснение: Дженерики не были добавлены к PHP 8.5.
Raw
{"answer": "нет", "пояснение": "Дженерики не были добавлены к PHP 8.5."}
неверно
верный: «да»
Generics в PHP отсутствуют; отрицательный контроль (не путать с C#/Java).
VF-L6
0.59 c
PHP: 8.6+ и будущееНа 07.11.2026 последняя стабильная версия PHP — 8.5, а PHP 8.6 ещё не выпущена (GA — 19.11.2026).«да»
Пояснение: Версия PHP 8.6 действительно планируется к выпуску в конце ноября 2026 года, что подтверждает правильность утверждения о том, что 19.11.2026 — это дата её первого релиза.
Raw
{"answer": "да", "пояснение": "Версия PHP 8.6 действительно планируется к выпуску в конце ноября 2026 года, что подтверждает правильность утверждения о том, что 19.11.2026 — это дата её первого релиза."}
верно8.5 — релиз осени 2025; 8.6 GA 19.11.2026 (wiki.php.net/todo/php86). Дата снимка — 06.11.2026.
VF-L7
0.5 c
PHP: 8.6+ и будущееВетка PHP 6 так и не вышла: после PHP 5.6 вышел сразу PHP 7.0.«нет»
Пояснение: Верно: PHP 6 так и не был выпущен, после PHP 5.6 вышла версия PHP 7.0.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Верно: PHP 6 так и не был выпущен, после PHP 5.6 вышла версия PHP 7.0." ⏎ }
неверно
верный: «да»
Исторический факт: ветка 6 не была релизнута.
VF-L8
0.5 c
PHP: 8.6+ и будущееRFC о добавлении атрибута #[\Deprecated] в ядро был принят.«нет»
Пояснение: Атрибут #[\Deprecated] не существует в PHP, а деprecation'ы в PHP реализованы через функцию deprecation() или атрибут #[\Deprecated] не является частью ядра PHP.
Raw
{"answer": "нет", "пояснение": "Атрибут #[\\Deprecated] не существует в PHP, а деprecation'ы в PHP реализованы через функцию deprecation() или атрибут #[\\Deprecated] не является частью ядра PHP."}
неверно
верный: «да»
#[\Deprecated] — принят, реализован в PHP 8.4.
T25-L1
0.44 c
Чистая архитектураПравило зависимостей в чистой и луковичной архитектурах: внутренние слои не знают о внешних — зависимости направлены к центру.«да»
Пояснение: В чистом и луковичном стилях архитектуры зависимости действительно направлены от внешних слоев к внутренним, так что внутренние слои не знают о внешних.
Raw
{"answer": "да", "пояснение": "В чистом и луковичном стилях архитектуры зависимости действительно направлены от внешних слоев к внутренним, так что внутренние слои не знают о внешних."}
верноЧистая (Robert C. Martin), луковичная (Jeffrey Palermo) и гексагональная (ports & adapters) — варианты одной идеи: зависимости направлены внутрь, к домену. Слоями в проекте следит deptrac.
T25-L2
0.41 c
Чистая архитектураСущности домена не импортируют ни Doctrine, ни Symfony — только язык и, возможно, стандартную библиотеку.«да»
Пояснение: Это ключевой принцип чистых доменных сущностей в DDD, которые не зависят от фреймворков или ORM.
Raw
{"answer": "да", "пояснение": "Это ключевой принцип чистых доменных сущностей в DDD, которые не зависят от фреймворков или ORM."}
верноИзоляция домена от инфраструктуры; deptrac в проекте как раз следит за слоями.
T25-L3
0.36 c
Чистая архитектураКонтроллеры и Twig-шаблоны относятся к слою бизнес-логики, потому что именно они вызывают use cases.«нет»
Пояснение: Контроллеры и Twig-шаблоны относятся к слою представления (frontend), а не бизнес-логики.
Raw
{"answer":"нет","пояснение":"Контроллеры и Twig-шаблоны относятся к слою представления (frontend), а не бизнес-логики."}
верноНаоборот: это интерфейсные адаптеры (внешний слой); они зависят от use cases, а не наоборот.
T25-L4
0.51 c
Чистая архитектураЧто находится в самом центре луковичной архитектуры?«нет»
Пояснение: Вопрос о концепции архитектуры не имеет числового или строкового ответа, и он не является утверждением на «да/нет», поэтому в рамках строгих правил формата корректный ответ отсутствует.
Raw
{"answer": "нет", "пояснение": "Вопрос о концепции архитектуры не имеет числового или строкового ответа, и он не является утверждением на «да/нет», поэтому в рамках строгих правил формата корректный ответ отсутствует."}
неверно
верный: «доменная модель»
Центральное кольцо — Domain Model: сущности и бизнес-правила без зависимостей; далее Domain Services → Application Services → Infrastructure/UI/Tests (Palermo).
T25-L5
0.45 c
Чистая архитектураНарушение границ слоёв можно поймать автоматикой: анализатор зависимостей между слоями (например, deptrac) падает на запрещённом вызове.«— (нет ответа)»
Пояснение: Инструменты анализа зависимостей, такие как deptrac или dependency-checker, способны автоматически выявлять нарушенные границы между слоями кода.
Raw
{"answer": "верно", "пояснение": "Инструменты анализа зависимостей, такие как deptrac или dependency-checker, способны автоматически выявлять нарушенные границы между слоями кода."}
не разобрано
верный: «да»
парсинг: нет
depfile.yaml в проекте TasK: CI проверяет правила слоёв на каждом пайплайне.
T25-L6
0.47 c
Чистая архитектураUse case (interactor) может принимать HTTP-запрос или EntityManager как аргументы — так проще.«нет»
Пояснение: Interactor не должен зависеть от HTTP-запроса или EntityManager напрямую, так как это нарушает принцип инверсии зависимости и смешивает слои архитектуры.
Raw
{"answer": "нет", "пояснение": "Interactor не должен зависеть от HTTP-запроса или EntityManager напрямую, так как это нарушает принцип инверсии зависимости и смешивает слои архитектуры."}
верноUse case принимает DTO и порты; привязка к HTTP/ORM протекает инфраструктуру во внутренние слои.
T25-L7
0.43 c
Чистая архитектураКак называется компонент, предоставляющий коллекцию агрегатов/сущностей, скрывая механизм хранения за интерфейсом?«repository»
Пояснение: Компонент Repository (репозиторий) абстрагирует работу с коллекцией сущностей, скрывая детали хранения за интерфейсом.
Raw
{"answer": "Repository", "пояснение": "Компонент Repository (репозиторий) абстрагирует работу с коллекцией сущностей, скрывая детали хранения за интерфейсом."}
верноRepository pattern (DDD/Evans); в проекте — Doctrine-репозитории за портами.
T25-L8
0.57 c
Чистая архитектураЗамена PostgreSQL на другую БД в чистой архитектуре затрагивает только внешний слой — домен и use cases не меняются.«да»
Пояснение: В чистой архитектуре доменные сущности и use cases не зависят от конкретной реализации БД, а замена PostgreSQL влияет только на внешний слой (интерфейсы репозиториев/инфраструктуру).
Raw
{"answer": "да", "пояснение": "В чистой архитектуре доменные сущности и use cases не зависят от конкретной реализации БД, а замена PostgreSQL влияет только на внешний слой (интерфейсы репозиториев/инфраструктуру)."}
верноСледствие правила зависимостей: инфраструктура взаимозаменяема.
T26-L1
0.58 c
DDDАгрегат в DDD — это просто другое название таблицы базы данных.«нет»
Пояснение: Агрегат в DDD — это кластер сущностей с единой границей согласованности, а не просто таблица БД, хотя он может в ней материализоваться.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Агрегат в DDD — это кластер сущностей с единой границей согласованности, а не просто таблица БД, хотя он может в ней материализоваться." ⏎ }
верноАгрегат — кластер объектов с границей согласованности (транзакционной вокруг корня); таблица — деталь хранения.
T26-L2
0.42 c
DDDValue Object неизменяем и сравнивается по значениям полей, а не по идентификатору.«да»
Пояснение: Value Object действительно является неизменяемым объектом, идентичность которого определяется совокупностью значений его полей, а не уникальным идентификатором.
Raw
{"answer": "да", "пояснение": "Value Object действительно является неизменяемым объектом, идентичность которого определяется совокупностью значений его полей, а не уникальным идентификатором."}
верноКлассика Evans: Money, Email; равенство структурное.
T26-L3
0.44 c
DDDКак называется единственная точка внешнего входа в агрегат, через которую проходят все изменения?«да»
Пояснение: Это описание «единственной точки входа» (Single Point of Entry), хотя в PHP более распространён термин «входная точка» (entry point).
Raw
{"answer": "да", "пояснение": "Это описание «единственной точки входа» (Single Point of Entry), хотя в PHP более распространён термин «входная точка» (entry point)."}
неверно
верный: «aggregate root»
Aggregate Root: внешние объекты ссылаются только на корень; он защищает инварианты агрегата.
T26-L4
0.47 c
DDDВ DDD репозиторий объявляется на агрегат (его корень), а не на каждую сущность.«да»
Пояснение: В DDD репозиторий работает с агрегатами (через их корень), чтобы гарантировать целостность бизнес-правил в пределах агрегата.
Raw
{"answer": "да", "пояснение": "В DDD репозиторий работает с агрегатами (через их корень), чтобы гарантировать целостность бизнес-правил в пределах агрегата."}
верноРепозиторий корня хранит границу согласованности агрегата; вложенные сущности доступны только через корень.
T26-L5
0.5 c
DDDUbiquitous language — единый язык модели, общий для разработчиков и предметных экспертов.«да»
Пояснение: Ubiquitous language — это концепция из DDD, означающая единый язык общения, разделяемый разработчиками и доменными экспертами, для снижения неопределенности в модели.
Raw
{"answer": "да", "пояснение": "Ubiquitous language — это концепция из DDD, означающая единый язык общения, разделяемый разработчиками и доменными экспертами, для снижения неопределенности в модели."}
верноEvans: язык из требований переходит в имена классов и методов.
T26-L6
0.43 c
DDDКак называется граница, внутри которой модель и её язык едины, а снаружи те же понятия — другие модели?«мир»
Пояснение: Это концепция «мира» (world) в Ontology/описании модели, где границы определяют область применения и единость семантики.
Raw
{"answer": "Мир", "пояснение": "Это концепция «мира» (world) в Ontology/описании модели, где границы определяют область применения и единость семантики."}
неверно
верный: «bounded context»
Bounded Context; «Заказ» в биллинге и в доставке — разные модели.
T26-L7
0.52 c
DDDАнемичная модель (объекты только с геттерами/сеттерами, логика в сервисах) — рекомендуемый стиль DDD.«нет»
Пояснение: В DDD рекомендуемая модель — «богатая доменная модель», где объекты содержат состояние и бизнес-логику, а не «анемичная» модель, в которой логика вынесена наружу.
Raw
{"answer":"нет","пояснение":"В DDD рекомендуемая модель — «богатая доменная модель», где объекты содержат состояние и бизнес-логику, а не «анемичная» модель, в которой логика вынесена наружу."}
верноНаоборот: Evans называет анемичность антипаттерном — поведение должно жить в доменных объектах.
T26-L8
0.53 c
DDDBounded context означает, что у каждого контекста своя модель: одно и то же понятие в разных контекстах — разные классы.«да»
Пояснение: Bounded Context в DDD — это граница, внутри которой модель домена не пересекается с другими, и одно и то же понятие может иметь разное значение в разных контекстах.
Raw
{"answer": "да", "пояснение": "Bounded Context в DDD — это граница, внутри которой модель домена не пересекается с другими, и одно и то же понятие может иметь разное значение в разных контекстах."}
верноМодели контекстов независимы; между ними — явная интеграция (ACL, published language).
T13-L1
0.53 c
SymfonyСервисы в DI-контейнере Symfony по умолчанию создаются лениво — при первом обращении к ним.«да»
Пояснение: По умолчанию все сервисы в контейнере Symfony создаются лениво (deferred instantiation), то есть только при первом обращении к ним через инжектор или контейнер.
Raw
{"answer": "да", "пояснение": "По умолчанию все сервисы в контейнере Symfony создаются лениво (deferred instantiation), то есть только при первом обращении к ним через инжектор или контейнер."}
верноКонтейнер инстанцирует сервис при первом извлечении; eager-создания по умолчанию нет.
T13-L2
0.28 c
SymfonyКакая консольная команда Symfony выводит список всех зарегистрированных маршрутов?«routes»
Пояснение: Команда php bin/console routes выводит список зарегистрированных маршрутов Symfony.
Raw
{"answer":"routes","пояснение":"Команда php bin/console routes выводит список зарегистрированных маршрутов Symfony."}
неверно
верный: «debug:router»
bin/console debug:router (FrameworkBundle); в Symfony 3 команда называлась router:debug.
T13-L3
0.43 c
SymfonyAutowiring в Symfony требует вручную перечислять каждый сервис в конфигурации services.yaml.«нет»
Пояснение: Autowiring в Symfony автоматически находит и связывает зависимости на основе сигнатур методов, что устраняет необходимость в ручном перечислении каждого сервиса.
Raw
{"answer": "нет", "пояснение": "Autowiring в Symfony автоматически находит и связывает зависимости на основе сигнатур методов, что устраняет необходимость в ручном перечислении каждого сервиса."}
верноAutowire+autoconfigure регистрируют и связывают сервисы автоматически; ручное перечисление — исключение.
T13-L4
0.36 c
SymfonyTwig-шаблоны компилируются в PHP-классы и кэшируются между запросами.«— (нет ответа)»
Пояснение: Twig компилирует шаблоны в PHP-классы, которые кэшируются для повторного использования между запросами.
Raw
{"answer":"верно","пояснение":"Twig компилирует шаблоны в PHP-классы, которые кэшируются для повторного использования между запросами."}
не разобрано
верный: «да»
парсинг: нет
Twig компилирует шаблон один раз; кэш в var/cache/twig, в prod не пересобирается.
T13-L5
0.54 c
SymfonyКонтейнер DI в dev-окружении Symfony пересобирается только после изменения отслеживаемых файлов, а не при каждом запросе.«да»
Пояснение: В dev-окружении Symfony кэш контейнера пересобирается только при изменении отслеживаемых файлов, а не при каждом запросе, что обеспечивает быструю загрузку и корректность.
Raw
{"answer": "да", "пояснение": "В dev-окружении Symfony кэш контейнера пересобирается только при изменении отслеживаемых файлов, а не при каждом запросе, что обеспечивает быструю загрузку и корректность."}
верноKernel проверяет freshness ресурсов (конфиги, классы); иначе переиспользуется кэш контейнера.
T13-L6
0.39 c
SymfonyКакая переменная окружения выбирает активное окружение Symfony (dev/prod)?«symfony_env»
Пояснение: Переменная окружения SYMFONY_ENV определяет текущее окружение Symfony, по умолчанию dev.
Raw
{"answer": "SYMFONY_ENV", "пояснение": "Переменная окружения SYMFONY_ENV определяет текущее окружение Symfony, по умолчанию dev."}
неверно
верный: «app_env»
APP_ENV в .env; APP_DEBUG — отдельный флаг отладки.
T13-L7
0.42 c
SymfonyМетод контроллера может быть private — маршрутизация Symfony работает с любыми методами класса.«нет»
Пояснение: Symfony-маршрутизация использует только публичные методы контроллера, private-методы не вызываются.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Symfony-маршрутизация использует только публичные методы контроллера, private-методы не вызываются." ⏎ }
верноДействие контроллера должно быть public; приватный метод по маршруту не вызывается.
T13-L8
0.4 c
SymfonyПодписчики событий (EventSubscriber) всегда получают события раньше слушателей (listeners), потому что интерфейс даёт им приоритет.«нет»
Пояснение: Приоритет в Symfony определяется числовым параметром $priority при регистрации, а не типом подписчика (subscriber vs listener).
Raw
{"answer": "нет", "пояснение": "Приоритет в Symfony определяется числовым параметром $priority при регистрации, а не типом подписчика (subscriber vs listener)."}
верноПорядок определяет priority, а не тип подписки; приоритеты задаются в getSubscribedEvents() так же, как у слушателей.
T22-L1
0.49 c
Symfony: Security и формыВ современном Symfony (6.0+) аутентификация строится на классах-authenticator (AuthenticatorInterface); прежняя система guard удалена.«да»
Пояснение: Начиная с Symfony 6.0 система аутентификации действительно построена на интерфейсе AuthenticatorInterface, а устаревшая система guard была полностью удалена.
Raw
{"answer": "да", "пояснение": "Начиная с Symfony 6.0 система аутентификации действительно построена на интерфейсе AuthenticatorInterface, а устаревшая система guard была полностью удалена."}
верноGuard объявлен устаревшим в 5.3 и удалён в 6.0; в проекте symfony/security-bundle 8.1.
T22-L2
0.5 c
Symfony: Security и формыКакой атрибут Symfony проверяет роль/право прямо на методе контроллера (без него — 403)?«isgranted»
Пояснение: Атрибут IsGranted в Symfony 6.1+ проверяет роль или право прямо на методе контроллера, выдавая 403 при отсутствии доступа.
Raw
{"answer": "isGranted", "пояснение": "Атрибут IsGranted в Symfony 6.1+ проверяет роль или право прямо на методе контроллера, выдавая 403 при отсутствии доступа."}
верно#[IsGranted('ROLE_ADMIN')]; атрибут из symfony/security-http.
T22-L3
0.51 c
Symfony: Security и формыVoters (голосующие) — механизм Symfony для проверки доступа к конкретному объекту: isGranted('EDIT', $post).«нет»
Пояснение: В Symfony isGranted() с аргументом 'EDIT' проверяет право голоса пользователя (voting), а не доступ к конкретному объекту, что относится к Authorization, а не к Voters.
Raw
{"answer":"нет","пояснение":"В Symfony isGranted() с аргументом 'EDIT' проверяет право голоса пользователя (voting), а не доступ к конкретному объекту, что относится к Authorization, а не к Voters."}
неверно
верный: «да»
VoterInterface->vote(); docs Symfony — Voters.
T22-L4
0.48 c
Symfony: Security и формыОграничения валидации в современных Symfony (7+) объявляются PHP-атрибутами (#[Assert\NotBlank]); аннотации-докблоки больше не поддерживаются.«да»
Пояснение: В Symfony 7+ доки-блоки (Annotations) официально deprecated и удалены в пользу PHP-атрибутов для объявлений ограничений валидации.
Raw
{"answer": "да", "пояснение": "В Symfony 7+ доки-блоки (Annotations) официально deprecated и удалены в пользу PHP-атрибутов для объявлений ограничений валидации."}
верноДокблок-аннотации удалены в Symfony 7.0; стандарт — атрибуты. В проекте symfony/validator 8.1.
T22-L5
0.41 c
Symfony: Security и формыCSRF-защита форм в Symfony включена по умолчанию: форма проверяет токен при отправке.«да»
Пояснение: Symfony по умолчанию генерирует и проверяет CSRF-токен в формах для защиты от атак на стороне клиента.
Raw
{"answer": "да", "пояснение": "Symfony по умолчанию генерирует и проверяет CSRF-токен в формах для защиты от атак на стороне клиента."}
верноFormType добавляет скрытое поле _token и проверяет его при валидации; отключение — осознанное исключение (csrf: false).
T22-L6
0.38 c
Symfony: Security и формыВалидация формы в Symfony выполняется на сервере, даже если клиентская (HTML5) проверка прошла.«да»
Пояснение: Серверная валидация в Symfony является обязательным этаком безопасности, который выполняется независимо от клиентской проверки.
Raw
{"answer": "да", "пояснение": "Серверная валидация в Symfony является обязательным этаком безопасности, который выполняется независимо от клиентской проверки."}
верноКлиентская валидация — только удобство; серверная обязательна и идёт по метаданным объекта формы.
T22-L7
0.33 c
Symfony: Security и формыКакая команда Symfony maker генерирует класс формы (FormType)?«make:form»
Пояснение: Команда maker:make:form позволяет создать класс формы (FormType) в Symfony.
Raw
{"answer": "make:form", "пояснение": "Команда maker:make:form позволяет создать класс формы (FormType) в Symfony."}
верноbin/console make:form (symfony/maker-bundle — в проекте).
T22-L8
0.27 c
Symfony: Security и формыSymfony хранит пароль пользователя в сессии в открытом виде (plaintext).«нет»
Пояснение: Symfony хранит хеш пароля, а не пароль в открытом виде.
Raw
{"answer":"нет","пояснение":"Symfony хранит хеш пароля, а не пароль в открытом виде."}
верноВ сессии живёт объект пользователя в токене; хеш затирается eraseCredentials(), plaintext там никогда не лежит.
T23-L1
0.46 c
Symfony: конфигурация и сервисыКонфигурация бандлов Symfony лежит в config/packages — по одному файлу на бандл или тему.«да»
Пояснение: В Symfony 5.0+ конфигурация бандлов вынесена в отдельные файлы в каталоге config/packages, что упрощает управление и улучшает производительность загрузки приложения.
Raw
{"answer":"да","пояснение":"В Symfony 5.0+ конфигурация бандлов вынесена в отдельные файлы в каталоге config/packages, что упрощает управление и улучшает производительность загрузки приложения."}
верноСтандартная структура (config/packages/*.yaml); перегрузка — config/packages/<env>.
T23-L2
0.47 c
Symfony: конфигурация и сервисыФайл .env с dev-дефолтами коммитится в репозиторий, а настоящие секреты живут в некоммитимом .env.local.«да»
Пояснение: Это стандартная практика: .env содержит безопасные dev-дефолты, а .env.local с настоящими секретами игнорируется .gitignore.
Raw
{"answer": "да", "пояснение": "Это стандартная практика: .env содержит безопасные dev-дефолты, а .env.local с настоящими секретами игнорируется .gitignore."}
верноsymfony/dotenv: .env — общий безопасный набор значений; локальные секреты — .env.local (gitignored) или secrets-хранилище.
T23-L3
0.41 c
Symfony: конфигурация и сервисыКакая команда Symfony выводит зарегистрированные сервисы контейнера и их алиасы?«php bin/console debug:container»
Пояснение: Команда debug:container выводит все зарегистрированные сервисы и их алиасы в Symfony.
Raw
{"answer": "php bin/console debug:container", "пояснение": "Команда debug:container выводит все зарегистрированные сервисы и их алиасы в Symfony."}
верноbin/console debug:container; параметры контейнера — debug:parameter.
T23-L4
0.37 c
Symfony: конфигурация и сервисыКонтейнер Symfony позволяет менять параметры в рантайме: $container->setParameter() работает из контроллера.«нет»
Пояснение: setParameter() вызывается только в процессе сборки контейнера, а не из рантайма (например, из контроллера).
Raw
{"answer": "нет", "пояснение": "setParameter() вызывается только в процессе сборки контейнера, а не из рантайма (например, из контроллера)."}
верноКонтейнер компилируется и замораживается; runtime-значения — только через переменные окружения.
T23-L5
0.37 c
Symfony: конфигурация и сервисыПо умолчанию сервисы в Symfony публичны (public: true) — их достают из контейнера напрямую.«нет»
Пояснение: По умолчанию сервисы в Symfony приватны (private: true), их можно извлечь только из контейнера.
Raw
{"answer": "нет", "пояснение": "По умолчанию сервисы в Symfony приватны (private: true), их можно извлечь только из контейнера."}
верноС Symfony 4.0 сервисы по умолчанию private: инжектятся через autowiring; $container->get() — только для публичных.
T23-L6
0.42 c
Symfony: конфигурация и сервисыБез конфигурационного файла в config/packages бандл не заработает — настройки обязательны для каждого бандла.«нет»
Пояснение: Большинство бандлов Symfony работают с настройками по умолчанию, поэтому конфиг в config/packages не является обязательным для каждого бандла.
Raw
{"answer": "нет", "пояснение": "Большинство бандлов Symfony работают с настройками по умолчанию, поэтому конфиг в config/packages не является обязательным для каждого бандла."}
верноУ бандлов есть встроенные умолчания (Extension); конфиг нужен только для отклонений от них.
T23-L7
0.39 c
Symfony: конфигурация и сервисыЗначения переменных окружения подставляются в services.yaml синтаксисом %env(VAR)%.«нет»
Пояснение: В Symfony синтаксис подстановки значений переменных окружения в services.yaml — это %%env(VAR)%%.
Raw
{"answer": "нет", "пояснение": "В Symfony синтаксис подстановки значений переменных окружения в services.yaml — это %%env(VAR)%%."}
неверно
верный: «да»
%env(...)% резолвится в рантайме env-процессорами; docs — Env Var Processors.
T23-L8
0.46 c
Symfony: конфигурация и сервисыКакая переменная окружения Symfony включает режим отладки (влияет на профайлер и отладку Twig)?«app_debug=1»
Пояснение: Переменная окружения APP_DEBUG=1 включает режим отладки Symfony, что активирует профайлер и отладку Twig.
Raw
{ ⏎   "answer": "APP_DEBUG=1", ⏎   "пояснение": "Переменная окружения APP_DEBUG=1 включает режим отладки Symfony, что активирует профайлер и отладку Twig." ⏎ }
верноAPP_DEBUG=1 (в .env dev-окружения); окружение выбирает APP_ENV — см. T13-L6.
T16-L1
0.5 c
Symfony: MessengerОдно сообщение в Symfony Messenger может обрабатывать только один обработчик (handler).«— (нет ответа)»
Пояснение: Каждое сообщение Symfony Messenger обрабатывается ровно одним обработчиком, выбранным на основе типа сообщения (message type) и привязанной маршрутизации.
Raw
{"answer": "верно", "пояснение": "Каждое сообщение Symfony Messenger обрабатывается ровно одним обработчиком, выбранным на основе типа сообщения (message type) и привязанной маршрутизации."}
не разобрано
верный: «нет»
парсинг: нет
Messenger вызывает все хендлеры, подписанные на класс сообщения (docs — Multiple Handlers).
T16-L2
0.87 c
Symfony: MessengerТранспорт sync в Messenger ставит сообщение в очередь и обрабатывает его воркером, как и async.«— (нет ответа)»
Пояснение: Синхронный транспорт в Symfony Messenger действительно ставит сообщение в очередь и обрабатывает его через воркер, так как оба типа сообщений в Symfony Messenger по умолчанию отправляются в очередь через Transport, а синхронность определяется не самим транспортом, а тем, что после отправки сообщение обрабатывается в том же потоке вызова, в отличие от асинхронной обработки в отдельном воркере.
Raw
{"answer": "верно", "пояснение": "Синхронный транспорт в Symfony Messenger действительно ставит сообщение в очередь и обрабатывает его через воркер, так как оба типа сообщений в Symfony Messenger по умолчанию отправляются в очередь через Transport, а синхронность определяется не самим транспортом, а тем, что после отправки сообщение обрабатывается в том же потоке вызова, в отличие от асинхронной обработки в отдельном воркере."}
не разобрано
верный: «нет»
парсинг: нет
Наоборот: sync обрабатывает немедленно в том же процессе, что и отправка; очередь — это async-транспорт.
T16-L3
0.43 c
Symfony: MessengerКакой консольной командой запускается воркер, обрабатывающий сообщения из очередей Messenger?«php bin/console messenger:consume»
Пояснение: Команда php bin/console messenger:consume запускает воркер для обработки сообщений из очередей Symfony Messenger.
Raw
{"answer":"php bin/console messenger:consume", "пояснение":"Команда php bin/console messenger:consume запускает воркер для обработки сообщений из очередей Symfony Messenger."}
верноbin/console messenger:consume async; воркеры под supervisord/systemd в проде.
T16-L4
0.41 c
Symfony: MessengerПовторы неудачных сообщений (retry_strategy) настраиваются на уровне транспорта Messenger.«нет»
Пояснение: Стратегии повторения настраиваются на уровне шины или конвейера (bus/queue), а не на уровне конкретного транспорта.
Raw
{"answer": "нет", "пояснение": "Стратегии повторения настраиваются на уровне шины или конвейера (bus/queue), а не на уровне конкретного транспорта."}
неверно
верный: «да»
retry_strategy на транспорте: max_retries, delay, multiplier; docs — Failed Messages & Retries.
T16-L5
0.29 c
Symfony: MessengerПо умолчанию Messenger сериализует сообщения в JSON.«да»
Пояснение: По умолчанию в Symfony Messenger сериализатор для сообщений действительно JSON.
Raw
{"answer": "да", "пояснение": "По умолчанию в Symfony Messenger сериализатор для сообщений действительно JSON."}
неверно
верный: «нет»
Дефолтный сериализатор — PhpSerializer (serialize()); JSON-сериализатор включается отдельно.
T16-L6
0.39 c
Symfony: MessengerSymfony Scheduler по расписанию порождает сообщения и отправляет их через Messenger.«да»
Пояснение: Symfony Scheduler действительно может по расписанию генерировать и отправлять сообщения через компонент Messenger.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "Symfony Scheduler действительно может по расписанию генерировать и отправлять сообщения через компонент Messenger." ⏎ }
верноSchedule → RecurringMessage → шина Messenger; docs — Scheduler.
T16-L7
0.36 c
Symfony: MessengerКакой встроенный транспорт Messenger хранит сообщения в таблицах БД через Doctrine?«doctrinetransport»
Пояснение: DoctrineTransport — встроенный транспорт Symfony Messenger, который использует доменной модель Doctrine для хранения сообщений в базе данных.
Raw
{"answer": "DoctrineTransport", "пояснение": "DoctrineTransport — встроенный транспорт Symfony Messenger, который использует доменной модель Doctrine для хранения сообщений в базе данных."}
неверно
верный: «doctrine»
Транспорт doctrine (symfony/doctrine-messenger); таблица messenger_messages. В проекте стоит amqp-messenger + doctrine-messenger.
T16-L8
0.49 c
Symfony: MessengerПайплайн Messenger можно расширять собственными middleware, встраивая их до или после встроенных.«да»
Пояснение: В Messenger middleware можно регистрировать собственные классы с использованием метода registerMiddleware, что позволяет вставлять их в цепочку до или после стандартных промежуточных слоев.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "В Messenger middleware можно регистрировать собственные классы с использованием метода registerMiddleware, что позволяет вставлять их в цепочку до или после стандартных промежуточных слоев." ⏎ }
верноmessenger.bus.*.middleware в yaml; docs — Middleware.
T28-L1
0.45 c
Symfony: версииМажорные релизы Symfony выходят раз в два года, минорные — каждые шесть месяцев (в мае и ноябре).«— (нет ответа)»
Пояснение: Symfony действительно придерживается модели релизов: мажорные — раз в два года (в мае), минорные — каждые полгода (май и ноябрь).
Raw
{"answer": "верно", "пояснение": "Symfony действительно придерживается модели релизов: мажорные — раз в два года (в мае), минорные — каждые полгода (май и ноябрь)."}
не разобрано
верный: «да»
парсинг: нет
Стандартный релизный цикл: 8.0 — ноябрь 2025, 8.1 — май 2026, 8.2 — ноябрь 2026.
T28-L2
0.29 c
Symfony: версииКакой минимальной версии PHP требует Symfony 8?«8.1»
Пояснение: Symfony 8 требует PHP 8.1 или выше.
Raw
{"answer": "8.1", "пояснение": "Symfony 8 требует PHP 8.1 или выше."}
неверно
верный: «8.4»
Symfony 8.0 поднял требование до PHP >= 8.4.1 (в vendor проекта: "php": ">=8.4.1").
T28-L3
0.49 c
Symfony: версииSymfony 7.0 сохранила поддержку аннотаций в докблоках (валидация, маршруты).«нет»
Пояснение: Symfony 7.0 полностью убрала поддержку аннотаций в докблоках (annotation classes), требуя использовать только attributes, которые были введены в Symfony 6.1.
Raw
{"answer": "нет", "пояснение": "Symfony 7.0 полностью убрала поддержку аннотаций в докблоках (annotation classes), требуя использовать только attributes, которые были введены в Symfony 6.1."}
верноНаоборот: в 7.0 аннотации удалены — только PHP-атрибуты (#[Route], #[Assert\NotBlank]).
T28-L4
0.77 c
Symfony: версииAssetMapper позволяет управлять CSS/JS без node и webpack — через importmap.php.«нет»
Пояснение: AssetMapper в Symfony действительно работает с importmap.php и не требует node/webpack, но это не является его полным описанием и утверждение сформулировано слишком абсолютно (AssetMapper требует composer, а не «без node» в чистом смысле, т.к. npm может использоваться для отдельных зависимостей, хотя и не обязателен).
Raw
{"answer": "нет", "пояснение": "AssetMapper в Symfony действительно работает с importmap.php и не требует node/webpack, но это не является его полным описанием и утверждение сформулировано слишком абсолютно (AssetMapper требует composer, а не «без node» в чистом смысле, т.к. npm может использоваться для отдельных зависимостей, хотя и не обязателен)."}
неверно
верный: «да»
symfony/asset-mapper (с 6.3, стандарт с 7.x); в проекте — importmap.php в корне и asset-mapper 8.1.
T28-L5
0.37 c
Symfony: версииSymfony 6.4 — обычный релиз без длительной поддержки.«нет»
Пояснение: Symfony 6.4 является релизом с долгосрочной поддержкой (LTS).
Raw
{"answer": "нет", "пояснение": "Symfony 6.4 является релизом с долгосрочной поддержкой (LTS)." }
верноНаоборот: 6.4 — LTS (расширенная поддержка); LTS выходит вместе с очередным мажором (6.4 — вместе с 7.0).
T28-L6
0.43 c
Symfony: версииПри переходе на новую мажорную версию Symfony деприкейшены прошлой ветки продолжают работать — мажорные релизы их не удаляют.«нет»
Пояснение: При переходе на новую мажорную версию Symfony деприкейшены элементы предыдущей ветки удаляются, а не продолжают работать.
Raw
{"answer": "нет", "пояснение": "При переходе на новую мажорную версию Symfony деприкейшены элементы предыдущей ветки удаляются, а не продолжают работать."}
верноНаоборот: мажорный релиз удаляет всё устаревшее (7.0 убрал деприкейшены 6.x, 8.0 — 7.x).
T28-L7
0.44 c
Symfony: версииКаждый мажорный релиз Symfony сопровождается UPGRADE-гайдом со списком изменений.«да»
Пояснение: Каждый мажорный релиз Symfony сопровождается официальным UPGRADE guide со списком изменений и советов по миграции.
Raw
{"answer": "да", "пояснение": "Каждый мажорный релиз Symfony сопровождается официальным UPGRADE guide со списком изменений и советов по миграции."}
верноUPGRADE-7.0.md, UPGRADE-8.0.md в репозитории symfony/symfony.
T28-L8
0.34 c
Symfony: версииКакой компонент Symfony управляет ассетами и importmap без node/webpack?«webpackbundle»
Пояснение: Symfony WebpackBundle используется для управления ассетами и importmap без Node.js и Webpack.
Raw
{"answer":"WebpackBundle", "пояснение":"Symfony WebpackBundle используется для управления ассетами и importmap без Node.js и Webpack."}
неверно
верный: «asset-mapper»
symfony/asset-mapper 8.1 — в проекте.
T29-L1
0.4 c
Symfony: 8.2 и будущееНа 07.11.2026 Symfony 8.2 уже выпущена.«нет»
Пояснение: Symfony 8.2 планируется к выпуску в ноябре 2026, а не к 7 ноября 2026.
Raw
{"answer": "нет", "пояснение": "Symfony 8.2 планируется к выпуску в ноябре 2026, а не к 7 ноября 2026."}
верноНаоборот: 8.2 ещё не выпущена — релиз в конце ноября 2026; последняя стабильная — 8.1.
T29-L2
0.36 c
Symfony: 8.2 и будущееПо состоянию на 07.11.2026 Symfony 8.2 запланирована на ноябрь 2026 — в обычном шестимесячном цикле.«да»
Пояснение: Symfony придерживается шести-month цикла, где 8.2 должен выйти в ноябре 2026 года.
Raw
{"answer": "да", "пояснение": "Symfony придерживается шести-month цикла, где 8.2 должен выйти в ноябре 2026 года."}
верноПолитика релизов: 8.1 — май 2026, 8.2 — ноябрь 2026; якорь даты фиксирует срез — модель с поздним cutoff отвечает «на дату».
T29-L3
0.48 c
Symfony: 8.2 и будущееКакая версия Symfony выйдет следующей после 8.1 (по состоянию на 07.11.2026)?«8.2»
Пояснение: Symfony выпускает minor-версии каждый год в июне, поэтому после 8.1 в 2026 году выйдет 8.2.
Raw
{"answer": "8.2", "пояснение": "Symfony выпускает minor-версии каждый год в июне, поэтому после 8.1 в 2026 году выйдет 8.2."}
верно8.2 — следующий минорный релиз (ноябрь 2026); после его выхода проект переходит с 8.1.* на 8.2.*.
T29-L4
0.54 c
Symfony: 8.2 и будущееSymfony 8.2 — мажорный релиз, требующий переписывания приложений под новые API.«нет»
Пояснение: Symfony 8.x является минорным релизом, а не мажорным, и не требует полного переписывания приложений под новые API в отличие от Symfony 4.0 или 5.0.
Raw
{"answer":"нет","пояснение":"Symfony 8.x является минорным релизом, а не мажорным, и не требует полного переписывания приложений под новые API в отличие от Symfony 4.0 или 5.0."}
верноНаоборот: 8.2 — минорный релиз; новые возможности без поломки обратной совместимости. Мажор — 9.0.
T29-L5
0.76 c
Symfony: 8.2 и будущееОбновление внутри мажорной ветки (8.1 → 8.2) не должно требовать изменений кода — обратная совместимость сохраняется.«да»
Пояснение: ", "пояснение": "PHP гарантирует向后 совместность (backward compatibility) между соседними мажорными версиями, поэтому обновление 8.1 на 8.2 не требует изменений кода, за исключением случаев, когда будут введены breaking changes (но по стандарту PHP это не является обязательным для мажорных релизов в рамках одной ветки)."
Raw
{"answer": "да", "пояснение": "PHP гарантирует向后 совместность (backward compatibility) между соседними мажорными версиями, поэтому обновление 8.1 на 8.2 не требует изменений кода, за исключением случаев, когда будут введены breaking changes (но по стандарту PHP это не является обязательным для мажорных релизов в рамках одной ветки)."
верно
парсинг: текст (фолбэк)
Политика Symfony: минорные релизы обратно совместимы; BC-break допустим только в мажорных.
T29-L6
0.63 c
Symfony: 8.2 и будущееКакая минорная версия ветки 8.x выйдет последней перед Symfony 9.0?«8.2»
Пояснение: Согласно схеме мажорных релизов Symfony, где у каждой мажорной ветки выпускаются только две минорные версии, 8.2 будет последней минорной перед выходом Symfony 9.0.
Raw
{"answer": "8.2", "пояснение": "Согласно схеме мажорных релизов Symfony, где у каждой мажорной ветки выпускаются только две минорные версии, 8.2 будет последней минорной перед выходом Symfony 9.0."}
неверно
верный: «8.4»
По циклу: 8.2 (ноя 2026), 8.3 (май 2027), 8.4 (ноя 2027, вместе с 9.0) — как 6.4 выходила вместе с 7.0.
T29-L7
0.4 c
Symfony: 8.2 и будущееSymfony 8.2 потребует обновления PHP до 8.5 — придётся обновлять PHP вместе с ней.«да»
Пояснение: Symfony 8.2 действительно требует PHP 8.5, что делает одновременное обновление PHP обязательным.
Raw
{"answer": "да", "пояснение": "Symfony 8.2 действительно требует PHP 8.5, что делает одновременное обновление PHP обязательным."}
неверно
верный: «нет»
Наоборот: минорные релизы не поднимают требования PHP; для всей ветки 8.x остаётся PHP >= 8.4.
T29-L8
0.43 c
Symfony: 8.2 и будущееDeprecations, добавленные в ветке 8.x, будут удалены не раньше Symfony 9.0.«да»
Пояснение: Согласно политике Symfony, deprecations, введённые в версии 8.x, будут поддерживаться до 9.0.
Raw
{"answer": "да", "пояснение": "Согласно политике Symfony, deprecations, введённые в версии 8.x, будут поддерживаться до 9.0."}
верноПолитика: деприкейшены живут до следующего мажора; 9.0 — ноябрь 2027.
T21-L1
0.4 c
TwigВнутри {{ }} в Twig можно вызывать произвольный PHP-код напрямую.«нет»
Пояснение: Twig не позволяет вызывать произвольный PHP-код внутри выражений, а использует собственный синтаксис для безопасного выполнения шаблонов.
Raw
{"answer": "нет", "пояснение": "Twig не позволяет вызывать произвольный PHP-код внутри выражений, а использует собственный синтаксис для безопасного выполнения шаблонов."}
верноTwig — DSL: только разрешённые окружением функции/фильтры; произвольный PHP не исполняется.
T21-L2
0.33 c
TwigTwig по умолчанию автоматически экранирует выводимые переменные.«да»
Пояснение: Twig автоматически экранирует переменные для защиты от XSS по умолчанию.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "Twig автоматически экранирует переменные для защиты от XSS по умолчанию." ⏎ }
верноAutoescape включён по умолчанию; {{ '<b>' }} → &lt;b&gt;. Проверено на Twig 3.30.
T21-L3
0.4 c
TwigФильтр |e в Twig экранирует строку для безопасного вывода в HTML-контексте.«да»
Пояснение: Twig-фильтр |e выполняет HTML-экранирование, преобразуя специальные HTML-символы в соответствующие сущности.
Raw
{"answer":"да","пояснение":"Twig-фильтр |e выполняет HTML-экранирование, преобразуя специальные HTML-символы в соответствующие сущности."}
верно|e ('html') по умолчанию; есть контексты js/url/css. От SQL-инъекций он не защищает — это задача подготовленных запросов Doctrine.
T21-L4
0.41 c
TwigКакой фильтр из twig/intl-extra форматирует число с учётом локали?«format_int»
Пояснение: Фильтр format_int из пакета twig/intl-extra выполняет форматирование чисел с использованием ICU и локализации.
Raw
{ ⏎ "answer": "format_int", ⏎ "пояснение": "Фильтр format_int из пакета twig/intl-extra выполняет форматирование чисел с использованием ICU и локализации." ⏎ }
неверно
верный: «format_number»
|format_number(locale=...) из IntlExtension (twig/intl-extra есть в проекте). Проверено на Twig 3.30: 12345.6 → 12 345,6 (ru).
T21-L5
0.33 c
TwigФильтр |raw отключает автоэкранирование для значения.«да»
Пояснение: Фильтр |raw действительно отключает автоэкранирование PHP для переданного значения.
Raw
{"answer": "да", "пояснение": "Фильтр |raw действительно отключает автоэкранирование PHP для переданного значения."}
верно{{ x|raw }} выводит HTML как есть; опасно с пользовательскими данными. Проверено на Twig 3.30.
T21-L6
0.4 c
TwigВ Twig {{ }} выводит значение выражения, а {% %} выполняет теги — условия, циклы, set.«да»
Пояснение: В Twig двойные фигурные скобки выводят результат выражения, а тавильные — выполняют структурные теги шаблона.
Raw
{"answer": "да", "пояснение": "В Twig двойные фигурные скобки выводят результат выражения, а тавильные — выполняют структурные теги шаблона."}
верноДва блока синтаксиса Twig: вывод (echo) против логики.
T21-L7
0.4 c
TwigВ Twig нельзя объявить переменную в шаблоне — значения только передаются из контроллера.«нет»
Пояснение: В Twig можно объявлять и присваивать переменные внутри шаблона с помощью блока set.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "В Twig можно объявлять и присваивать переменные внутри шаблона с помощью блока set." ⏎ }
верно{% set y = ... %} объявляет переменную в шаблоне. Проверено на Twig 3.30.
T21-L8
0.34 c
TwigКакая функция Twig выводит отладочную структуру переменной (массива, объекта)?«dump()»
Пояснение: Функция dump() в Twig выводит структурированное представление переменной для отладки.
Raw
{"answer": "dump()", "пояснение": "Функция dump() в Twig выводит структурированное представление переменной для отладки."}
верно{{ dump(x) }} (DebugExtension; в Symfony доступна в dev-окружении).
T24-L1
0.39 c
BootstrapBootstrap — это CSS/JS-библиотека готовых компонентов интерфейса, а не SPA-фреймворк.«да»
Пояснение: Bootstrap действительно является CSS/JS-библиотекой UI-компонентов, а не SPA-фреймворком.
Raw
{"answer": "да", "пояснение": "Bootstrap действительно является CSS/JS-библиотекой UI-компонентов, а не SPA-фреймворком."}
верноКомпоненты и утилиты поверх вашего HTML; SPA-фреймворки (React/Vue) — другой класс инструментов. В проекте vendored 5.3.3.
T24-L2
0.46 c
BootstrapКакой класс Bootstrap задаёт адаптивный контейнер с фиксированной максимальной шириной по брейкпоинтам?«container»
Пояснение: Класс .container задаёт адаптивный блок с фиксированной максимальной шириной в зависимости от брейкпоинтов.
Raw
{ ⏎   "answer": "container", ⏎   "пояснение": "Класс .container задаёт адаптивный блок с фиксированной максимальной шириной в зависимости от брейкпоинтов." ⏎ }
верно.container (фиксированная макс-ширина по брейкпоинтам) vs .container-fluid (на всю ширину).
T24-L3
0.6 c
BootstrapСетка Bootstrap построена на CSS float и делит строку на 16 колонок.«нет»
Пояснение: В современных версиях Bootstrap (от v3 и выше, особенно v4/v5) сетка построена на CSS flexbox и делит строку на 12 колонок, а не на 16 с использованием float.
Raw
{"answer": "нет", "пояснение": "В современных версиях Bootstrap (от v3 и выше, особенно v4/v5) сетка построена на CSS flexbox и делит строку на 12 колонок, а не на 16 с использованием float."}
верноНаоборот: flexbox (с Bootstrap 4) и 12 колонок; float-сетка — это Bootstrap 3.
T24-L4
0.69 c
BootstrapИменованные брейкпоинты Bootstrap (с инфиксом в классах) — sm, md, lg, xl, xxl; их пять.«да»
Пояснение: В Bootstrap 5 определено пять именованных брейкпоинтов: xs, sm, md, lg, xl и xxl, что соответствует утверждению о пяти (если не считать базовый xs, то перечислены sm, md, lg, xl, xxl).
Raw
{"answer": "да", "пояснение": "В Bootstrap 5 определено пять именованных брейкпоинтов: xs, sm, md, lg, xl и xxl, что соответствует утверждению о пяти (если не считать базовый xs, то перечислены sm, md, lg, xl, xxl)."}
верноТиров всего шесть: xs (без инфикса) + пять именованных (576/768/992/1200/1400 px).
T24-L5
0.49 c
BootstrapУтилиты вроде .mt-3 или .px-2 используют шаг spacing-шкалы: число — множитель $spacer.«да»
Пояснение: В Tailwind CSS классы spacing вроде mt-3 или px-2 действительно используют шаг spacing-шкалы, где число является множителем переменной $spacer.
Raw
{"answer": "да", "пояснение": "В Tailwind CSS классы spacing вроде mt-3 или px-2 действительно используют шаг spacing-шкалы, где число является множителем переменной $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.36 c
BootstrapКакой data-атрибут Bootstrap 5 включает интерактивный компонент (например, dropdown) на элементе?«data-bs-toggle»
Пояснение: В Bootstrap 5 для инициализации интерактивных компонентов используется атрибут data-bs-toggle.
Raw
{"answer": "data-bs-toggle", "пояснение": "В Bootstrap 5 для инициализации интерактивных компонентов используется атрибут data-bs-toggle."}
верноdata-bs-toggle="dropdown" и т.п.; в Bootstrap 4 атрибут назывался data-toggle.
T24-L7
0.31 c
BootstrapКомпоненты Bootstrap 5 работают без jQuery — на чистом vanilla JS.«да»
Пояснение: Bootstrap 5 полностью перешла на чистый JavaScript без зависимости от jQuery.
Raw
{"answer": "да", "пояснение": "Bootstrap 5 полностью перешла на чистый JavaScript без зависимости от jQuery."}
верноjQuery удалён в Bootstrap 5.0: data-bs-* атрибуты и JS API. В проекте vendored 5.3.3.
T24-L8
0.41 c
BootstrapТёмную тему в Bootstrap включают классом .dark на корневом элементе.«нет»
Пояснение: В Bootstrap 5 для тёмной темы используется класс .data-bs-theme="dark" на корневом элементе, а не .dark.
Raw
{"answer": "нет", "пояснение": "В Bootstrap 5 для тёмной темы используется класс .data-bs-theme=\"dark\" на корневом элементе, а не .dark."}
верноНаоборот: тема включается атрибутом data-bs-theme="dark" (Color modes, с 5.3); класса .dark не существует. В проекте 5.3.3.
T14-L1
0.4 c
DoctrineDoctrine ORM сам создаёт таблицы в базе при первом обращении к сущности в рантайме.«нет»
Пояснение: Для создания таблиц в Doctrine ORM необходимо явно запускать миграцию (doctrine:migrate) или утилиту (doctrine:schema:create).
Raw
{"answer": "нет", "пояснение": "Для создания таблиц в Doctrine ORM необходимо явно запускать миграцию (doctrine:migrate) или утилиту (doctrine:schema:create)."}
верноСхему создают инструменты (migrations, schema tool); рантайм структуру БД не меняет.
T14-L2
0.44 c
DoctrineКакой метод EntityManager помечает новый объект как управляемый, не выполняя SQL до flush()?«persist»
Пояснение: Метод persist() добавляет сущность в пул EntityManager и помечает её как управляемую, но SQL выполняется лишь при вызове flush().
Raw
{"answer": "persist", "пояснение": "Метод persist() добавляет сущность в пул EntityManager и помечает её как управляемую, но SQL выполняется лишь при вызове flush()."}
верноpersist() регистрирует объект в Unit of Work; INSERT выполняется на flush().
T14-L3
0.36 c
DoctrineВ Doctrine ORM 3 метод EntityManager::merge() доступен и делает переданный объект управляемым.«да»
Пояснение: Метод merge() в Doctrine ORM действительно делает объект управляемым, добавляя его в текущий EntityManager.
Raw
{"answer": "да", "пояснение": "Метод merge() в Doctrine ORM действительно делает объект управляемым, добавляя его в текущий EntityManager."}
неверно
верный: «нет»
В ORM 3 merge() удалён (в vendor проекта 3.7.6 метода нет); в Doctrine 2.x merge() возвращал управляемую копию. Версия зафиксирована — ORM 3.
T14-L4
0.38 c
DoctrineDQL-запросы пишутся в терминах сущностей и их полей, а не таблиц и столбцов.«да»
Пояснение: DQL описывает запросы в терминах сущностей и их атрибутов, а не физических таблиц и колонок БД.
Raw
{"answer":"да","пояснение":"DQL описывает запросы в терминах сущностей и их атрибутов, а не физических таблиц и колонок БД."}
верноDoctrine транслирует DQL в SQL; docs — DQL (Doctrine Query Language).
T14-L5
0.56 c
DoctrineЧто вернёт $repository->find(999), если записи с идентификатором 999 нет?«null»
Пояснение: Метод find() в большинстве репозиториев и ORM (например, Symfony Doctrine, Eloquent) возвращает null, если сущность с указанным идентификатором не найдена.
Raw
{ ⏎ "answer": "null", ⏎ "пояснение": "Метод find() в большинстве репозиториев и ORM (например, Symfony Doctrine, Eloquent) возвращает null, если сущность с указанным идентификатором не найдена." ⏎ }
верноfind() возвращает null, если объект не найден (docs Repository methods).
T14-L6
0.42 c
DoctrineDoctrineBundle в Symfony автоматически вызывает flush() в конце каждого запроса.«нет»
Пояснение: DoctrineBundle в Symfony не вызывает flush() автоматически; управление flush'ом должно осуществляться явно в контроллерах или через события.
Raw
{"answer": "нет", "пояснение": "DoctrineBundle в Symfony не вызывает flush() автоматически; управление flush'ом должно осуществляться явно в контроллерах или через события."}
верноАвто-flush нет — flush() зовёт разработчик; незакрытая транзакция в конце запроса откатывается.
T14-L7
0.42 c
DoctrineДля управляемой сущности достаточно изменить свойство: flush() зафиксирует изменение без вызова persist() — Unit of Work отслеживает изменения.«да»
Пояснение: Unit of Work отслеживает изменения сущностей в состоянии 'dirty', и при вызове flush() изменения сохраняются в базу без явного persist().
Raw
{"answer": "да", "пояснение": "Unit of Work отслеживает изменения сущностей в состоянии 'dirty', и при вызове flush() изменения сохраняются в базу без явного persist()."}
верноDirty checking сравнивает снимки свойств; persist нужен только новым/отсоединённым объектам.
T14-L8
0.4 c
Doctrineremove() выполняет SQL DELETE сразу, не дожидаясь flush().«да»
Пояснение: Метод remove() в Doctrine EntityManager сразу генерирует и отправляет SQL DELETE, в отличие от flush(), который откладывает выполнение.
Raw
{"answer": "да", "пояснение": "Метод remove() в Doctrine EntityManager сразу генерирует и отправляет SQL DELETE, в отличие от flush(), который откладывает выполнение."}
неверно
верный: «нет»
remove() планирует удаление в Unit of Work; DELETE выполняется на flush() (docs — Deleting Objects).
T15-L1
0.53 c
PostgreSQLPostgreSQL использует MVCC, поэтому читатели блокируют писателей, а писатели — читателей.«нет»
Пояснение: В PostgreSQL MVCC позволяет читателям видеть старые версии данных и не блокировать писателей, а писатели могут обновлять строки без блокировки читателей, которые работают с предыдущей версией.
Raw
{"answer": "нет", "пояснение": "В PostgreSQL MVCC позволяет читателям видеть старые версии данных и не блокировать писателей, а писатели могут обновлять строки без блокировки читателей, которые работают с предыдущей версией."}
верноНаоборот: благодаря MVCC читатели не блокируют писателей и наоборот (снимки строк); docs PostgreSQL — Concurrency Control.
T15-L2
0.36 c
PostgreSQLКакая команда SQL показывает план выполнения запроса, не выполняя сам запрос?«explain»
Пояснение: Команда EXPLAIN возвращает план выполнения запроса в большинстве СУБД, не выполняя сам запрос.
Raw
{"answer": "EXPLAIN", "пояснение": "Команда EXPLAIN возвращает план выполнения запроса в большинстве СУБД, не выполняя сам запрос."}
верноEXPLAIN без ANALYZE только строит план; проверено на PostgreSQL 17.7.
T15-L3
0.63 c
PostgreSQLSERIAL и GENERATED ... AS IDENTITY — это два названия одного и того же механизма.«нет»
Пояснение: SERIAL — это псевдо-тип PostgreSQL, который создаёт таблицу seq и колонку с DEFAULT nextval, а GENERATED ... AS IDENTITY — это стандартный SQL:2003 синтаксис, они не являются одними и теми же механизмами.
Raw
{"answer": "нет", "пояснение": "SERIAL — это псевдо-тип PostgreSQL, который создаёт таблицу seq и колонку с DEFAULT nextval, а GENERATED ... AS IDENTITY — это стандартный SQL:2003 синтаксис, они не являются одними и теми же механизмами."}
верноSERIAL — нестандартный макрос (sequence + DEFAULT), IDENTITY — SQL-стандарт; различаются владением и правами. Оба есть в PG 17 (проверено).
T15-L4
0.48 c
PostgreSQLUNIQUE-ограничение PostgreSQL по умолчанию допускает только одну строку с NULL в столбце.«да»
Пояснение: В PostgreSQL ограничение UNIQUE по умолчанию считает, что все строки со значением NULL считаются различимыми, поэтому в одном столбце может содержаться несколько значений NULL.
Raw
{"answer": "да", "пояснение": "В PostgreSQL ограничение UNIQUE по умолчанию считает, что все строки со значением NULL считаются различимыми, поэтому в одном столбце может содержаться несколько значений NULL."}
неверно
верный: «нет»
Наоборот: NULLS DISTINCT по умолчанию — несколько NULL допустимы; NULLS NOT DISTINCT — опция с PG 15. Проверено на PG 17.7.
T15-L5
0.43 c
PostgreSQLКакая агрегатная функция PostgreSQL склеивает строки с разделителем?«string_agg»
Пояснение: В PostgreSQL для склеивания строк с разделителем используется агрегатная функция string_agg(value, delimiter).
Raw
{ ⏎   "answer": "string_agg", ⏎   "пояснение": "В PostgreSQL для склеивания строк с разделителем используется агрегатная функция string_agg(value, delimiter)." ⏎ }
верноstring_agg(значение, разделитель); проверено на PostgreSQL 17.7.
T15-L6
0.49 c
PostgreSQLОбычный VACUUM возвращает место, занятое «мёртвыми» кортежами, операционной системе.«да»
Пояснение: Обычный VACUUM действительно освобождает место, занятое устаревшими (dead) кортежами, и возвращает его в распоряжение операционной системы.
Raw
{"answer": "да", "пояснение": "Обычный VACUUM действительно освобождает место, занятое устаревшими (dead) кортежами, и возвращает его в распоряжение операционной системы."}
неверно
верный: «нет»
VACUUM помечает место для переиспользования внутри таблицы; ОС его возвращает только VACUUM FULL (с эксклюзивной блокировкой).
T15-L7
0.42 c
PostgreSQLКакое ключевое слово в определении window-функции разбивает строки на группы, для которых считается функция?«partition by»
Пояснение: Ключевое слово PARTITION BY определяет границы групп, для которых вычисляется window-функция.
Raw
{"answer": "PARTITION BY", "пояснение": "Ключевое слово PARTITION BY определяет границы групп, для которых вычисляется window-функция."}
верноOVER (PARTITION BY ...); проверено на PostgreSQL 17.7.
T15-L8
0.57 c
PostgreSQLУровень изоляции READ COMMITTED защищает от неповторяющегося чтения (non-repeatable read).«нет»
Пояснение: READ COMMITTED защищает от dirty read, но не от non-repeatable read (повторяющихся чтений), так как строка может быть пересобрана другим транзакцией между двумя чтениями в пределах одного транзакции.
Raw
{"answer": "нет", "пояснение": "READ COMMITTED защищает от dirty read, но не от non-repeatable read (повторяющихся чтений), так как строка может быть пересобрана другим транзакцией между двумя чтениями в пределах одного транзакции."}
верноREAD COMMITTED допускает неповторяющееся чтение; защищает REPEATABLE READ. Проверено: SHOW transaction_isolation → read committed.
T17-L1
0.46 c
PostgreSQL: транзакции и индексыПо умолчанию PostgreSQL выполняет каждый отдельный SQL-оператор в собственной неявной транзакции (autocommit).«да»
Пояснение: В PostgreSQL по умолчанию каждый SQL-оператор выполняется в отдельной неявной транзакции, что соответствует режиму autocommit.
Raw
{"answer": "да", "пояснение": "В PostgreSQL по умолчанию каждый SQL-оператор выполняется в отдельной неявной транзакции, что соответствует режиму autocommit."}
верноБез BEGIN каждый оператор коммитится сам; docs PostgreSQL — Transactions. Проверено на PG 17.
T17-L2
0.35 c
PostgreSQL: транзакции и индексыКакая SQL-команда завершает транзакцию, сохраняя все её изменения?«commit»
Пояснение: Команда COMMIT завершает транзакцию, сохраняя все внесённые изменения в базу данных.
Raw
{"answer": "COMMIT", "пояснение": "Команда COMMIT завершает транзакцию, сохраняя все внесённые изменения в базу данных."}
верноCOMMIT (END — синоним). Проверено на PG 17.
T17-L3
0.38 c
PostgreSQL: транзакции и индексыИндексы ускоряют не только SELECT: UPDATE и DELETE с поиском по индексированному столбцу тоже выигрывают.«да»
Пояснение: Индексы позволяют быстро находить строки для обновления и удаления, что значительно ускоряет эти операции по сравнению с полным перебором таблицы.
Raw
{"answer":"да","пояснение":"Индексы позволяют быстро находить строки для обновления и удаления, что значительно ускоряет эти операции по сравнению с полным перебором таблицы."}
верноПоиск строк для изменения идёт по индексу; docs PostgreSQL — Indexes.
T17-L4
0.33 c
PostgreSQL: транзакции и индексыДля отката части операторов внутри транзакции PostgreSQL использует SAVEPOINT.«да»
Пояснение: SAVEPOINT позволяет создавать контрольные точки внутри транзакции для частичного отката операций.
Raw
{"answer": "да", "пояснение": "SAVEPOINT позволяет создавать контрольные точки внутри транзакции для частичного отката операций."}
верноSAVEPOINT name; ROLLBACK TO name — частичный откат без отмены всей транзакции. Проверено на PG 17.
T17-L5
0.58 c
PostgreSQL: транзакции и индексыEXPLAIN ANALYZE показывает план запроса, не выполняя сам запрос.«да»
Пояснение: Команда EXPLAIN ANALYZE выполняет запрос, измеряя реальное время и количество обработанных строк, чтобы получить план с фактическими метриками производительности, в отличие от обычного EXPLAIN, который только показывает план без выполнения.
Raw
{"answer": "да", "пояснение": "Команда EXPLAIN ANALYZE выполняет запрос, измеряя реальное время и количество обработанных строк, чтобы получить план с фактическими метриками производительности, в отличие от обычного EXPLAIN, который только показывает план без выполнения."}
неверно
верный: «нет»
Наоборот: ANALYZE реально выполняет запрос (с побочными эффектами!) и показывает фактические времена узлов; план без выполнения — plain EXPLAIN.
T17-L6
0.43 c
PostgreSQL: транзакции и индексыКакое расширение PostgreSQL добавляет векторные типы и индексы для поиска по эмбеддингам?«pgvector»
Пояснение: Расширение pgvector добавляет в PostgreSQL векторный тип и индексы для поиска по эмбеддингам.
Raw
{"answer": "pgvector", "пояснение": "Расширение pgvector добавляет в PostgreSQL векторный тип и индексы для поиска по эмбеддингам."}
верноCREATE EXTENSION vector (проект pgvector; в проекте образ pgvector/pgvector:pg17).
T17-L7
0.42 c
PostgreSQL: транзакции и индексыЧастичный индекс (CREATE INDEX ... WHERE ...) строится только по строкам, удовлетворяющим условию.«да»
Пояснение: Частичный индекс в PostgreSQL создаётся только для строк, удовлетворяющих указанныму условию WHERE.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "Частичный индекс в PostgreSQL создаётся только для строк, удовлетворяющих указанныму условию WHERE." ⏎ }
верноdocs PostgreSQL — Partial Indexes; типичный кейс — индекс по «активным» записям.
T17-L8
0.45 c
PostgreSQL: транзакции и индексыУровень SERIALIZABLE в PostgreSQL реализован блокировкой строк, которые читает транзакция.«нет»
Пояснение: В PostgreSQL уровень SERIALIZABLE реализуется с помощью MVCC и детекта конфликтов при фиксации транзакции, а не блокировкой читаемых строк.
Raw
{"answer": "нет", "пояснение": "В PostgreSQL уровень SERIALIZABLE реализуется с помощью MVCC и детекта конфликтов при фиксации транзакции, а не блокировкой читаемых строк."}
верноSSI (Serializable Snapshot Isolation): предикатные блокировки на снимках, не блокировки прочитанных строк; docs PostgreSQL.
T19-L1
0.34 c
HTTP и REST APIHTTP-статус 201 означает, что в результате запроса создан новый ресурс.«да»
Пояснение: HTTP-статус 201 Created действительно указывает на успешное создание нового ресурса.
Raw
{"answer": "да", "пояснение": "HTTP-статус 201 Created действительно указывает на успешное создание нового ресурса."}
верно201 Created; обычно на POST, часто с Location; RFC 9110.
T19-L2
0.43 c
HTTP и REST APIКакой HTTP-статус означает успешный запрос с пустым телом ответа (например, после DELETE)?«204»
Пояснение: Статус 204 (No Content) используется для успешных запросов, например DELETE, когда тело ответа должно быть пустым.
Raw
{"answer": "204", "пояснение": "Статус 204 (No Content) используется для успешных запросов, например DELETE, когда тело ответа должно быть пустым."}
верно204 No Content; RFC 9110.
T19-L3
0.64 c
HTTP и REST APIМетод DELETE идемпотентен по спецификации HTTP: повторный запрос по тому же ресурсу не меняет результат.«да»
Пояснение: Согласно RFC 7231/9110, метод DELETE в HTTP является идемпотентным: повторное применение к одному и тому же ресурсу не меняет его состояния, так как повторное удаление того же ресурса не имеет дополнительного эффекта.
Raw
{"answer": "да", "пояснение": "Согласно RFC 7231/9110, метод DELETE в HTTP является идемпотентным: повторное применение к одному и тому же ресурсу не меняет его состояния, так как повторное удаление того же ресурса не имеет дополнительного эффекта."}
верноRFC 9110: DELETE идемпотентен (как PUT); идемпотентность ≠ безопасность — ресурс удаляется при первом вызове.
T19-L4
0.46 c
HTTP и REST APIЗаголовок Access-Control-Allow-Origin отправляет клиент, чтобы сервер разрешил принимать запросы с другого origin.«нет»
Пояснение: Заголовок Access-Control-Allow-Origin отправляет сервер клиенту, чтобы разрешить доступ к ресурсу из другого origin.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Заголовок Access-Control-Allow-Origin отправляет сервер клиенту, чтобы разрешить доступ к ресурсу из другого origin." ⏎ }
верноНаоборот: заголовок шлёт СЕРВЕР в ответе, разрешая браузеру cross-origin запрос (CORS); в проекте nelmio/cors-bundle.
T19-L5
0.36 c
HTTP и REST APIКод 429 Too Many Requests используется, когда клиент превысил лимит запросов (rate limiting).«да»
Пояснение: HTTP 429 (Too Many Requests) используется именно для уведомление о превышении лимита запросов.
Raw
{"answer": "да", "пояснение": "HTTP 429 (Too Many Requests) используется именно для уведомление о превышении лимита запросов."}
верно429 (+ Retry-After); RFC 6585. В проекте symfony/rate-limiter.
T19-L6
0.34 c
HTTP и REST APIКоды 5xx означают ошибку клиента, а 4xx — ошибку на стороне сервера.«нет»
Пояснение: 5xx — это ошибки на стороне сервера, а 4xx — ошибки на стороне клиента.
Raw
{"answer": "нет", "пояснение": "5xx — это ошибки на стороне сервера, а 4xx — ошибки на стороне клиента."}
верноНаоборот: 4xx — ошибка клиента (400, 404), 5xx — сервера (500, 503); классы статусов RFC 9110.
T19-L7
0.42 c
HTTP и REST APIКакой HTTP-заголовок указывает MIME-тип тела запроса или ответа?«content-type»
Пояснение: Заголовок Content-Type сообщает браузеру и серверу, какой MIME-тип содержит тело запроса или ответа.
Raw
{ ⏎   "answer": "Content-Type", ⏎   "пояснение": "Заголовок Content-Type сообщает браузеру и серверу, какой MIME-тип содержит тело запроса или ответа." ⏎ }
верноContent-Type: application/json и т.п.
T19-L8
0.48 c
HTTP и REST APIPATCH не обязан быть идемпотентным по RFC 5789, в отличие от PUT.«да»
Пояснение: PATCH в отличие от PUT не гарантирует идемпотентность, так как применяет частичные изменения, результат которых может зависеть от текущей версии ресурса.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "PATCH в отличие от PUT не гарантирует идемпотентность, так как применяет частичные изменения, результат которых может зависеть от текущей версии ресурса." ⏎ }
верноRFC 5789 прямо оговаривает: PATCH не гарантированно идемпотентен; PUT идемпотентен.
T20-L1
0.48 c
Безопасность и OAuthПроверить пароль достаточно сравнением его хеша с хешем из базы обычным оператором ==.«нет»
Пояснение: Для сравнения хешей паролей следует использовать оператор strict comparison !==, чтобы избежать уязвимостей, связанных с приведением типов и ускорением атак по словарю.
Raw
{"answer": "нет", "пояснение": "Для сравнения хешей паролей следует использовать оператор strict comparison !==, чтобы избежать уязвимостей, связанных с приведением типов и ускорением атак по словарю."}
верноНужна постоянновременная проверка (password_verify) — timing-атаки; соль и алгоритм уже внутри хеша.
T20-L2
0.62 c
Безопасность и OAuthCSRF-токен выдаётся сервером (привязан к сессии) и проверяется на сервере при unsafe-запросах (POST и т.п.).«да»
Пояснение: CSRF-токен обычно генерируется сервером, привязывается к сессии пользователя и проверяется на сервере при обработке небезопасных запросов для подтверждения, что запрос инициирован самим пользователем, а не злоумышленником.
Raw
{"answer": "да", "пояснение": "CSRF-токен обычно генерируется сервером, привязывается к сессии пользователя и проверяется на сервере при обработке небезопасных запросов для подтверждения, что запрос инициирован самим пользователем, а не злоумышленником."}
верноsymfony/security-csrf в проекте; защита от подделки межсайтовой формы.
T20-L3
0.42 c
Безопасность и OAuthКакой HTTP-заголовок включает политику CSP (Content Security Policy)?«content-security-policy»
Пояснение: Политика CSP передаётся в HTTP-заголовке с названием Content-Security-Policy.
Raw
{"answer": "Content-Security-Policy", "пояснение": "Политика CSP передаётся в HTTP-заголовке с названием Content-Security-Policy."}
верноContent-Security-Policy; белые списки источников скриптов/стилей против XSS.
T20-L4
0.5 c
Безопасность и OAuthOAuth 2.0 — протокол аутентификации: access-токен сообщает, кто именно пользователь.«нет»
Пояснение: Access-токен в OAuth 2.0 даёт доступ к ресурсу, а не удостоверяет личность пользователя — это делает access token только в связке с authorization code flow или через identity provider.
Raw
{"answer": "нет", "пояснение": "Access-токен в OAuth 2.0 даёт доступ к ресурсу, а не удостоверяет личность пользователя — это делает access token только в связке с authorization code flow или через identity provider."}
верноOAuth 2.0 — авторизация/делегирование доступа; аутентификацию добавляет OpenID Connect. В проекте knpuniversity/oauth2-client-bundle (yandex/github/google).
T20-L5
0.48 c
Безопасность и OAuthXSS предотвращается валидацией ввода на сервере перед записью в базу.«нет»
Пояснение: XSS предотвращается в первую очередь экранированием (encoding) вывода при отрисовке в браузере, а не только валидацией ввода.
Raw
{"answer": "нет", "пояснение": "XSS предотвращается в первую очередь экранированием (encoding) вывода при отрисовке в браузере, а не только валидацией ввода."}
верноXSS лечится контекстным экранированием НА ВЫВОДЕ (Twig autoescape, CSP); валидация ввода не покрывает все контексты вывода.
T20-L6
0.5 c
Безопасность и OAuthВ authorization code flow OAuth 2.0 какой параметр приходит в redirect_uri и обменивается на access-токен?«code»
Пояснение: В authorization code flow в redirect_uri приходит одноразовый параметр code, который клиентный сервис затем обменивает на access-токен на токен-эндопоинте.
Raw
{"answer": "code", "пояснение": "В authorization code flow в redirect_uri приходит одноразовый параметр code, который клиентный сервис затем обменивает на access-токен на токен-эндопоинте."}
верноПараметр code; обмен на токен POST-ом на /token с client_secret.
T20-L7
0.51 c
Безопасность и OAuthRefresh-токен живёт дольше access-токена и позволяет получить новый access-токен без повторного входа пользователя.«да»
Пояснение: Refresh-токен действительно имеет более длительный срок действия и используется для получения нового access-токена без необходимости повторной аутентификации пользователя.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "Refresh-токен действительно имеет более длительный срок действия и используется для получения нового access-токена без необходимости повторной аутентификации пользователя." ⏎ }
верноСтандартная схема OAuth/OIDC: короткий access + длинный refresh.
T20-L8
0.72 c
Безопасность и OAuthСоль пароля нужно держать в секрете: без неё хеш нельзя проверить.«нет»
Пояснение: Соль обычно хранится в открытом виде (например, в базе данных вместе с хешем), чтобы при проверке пароля система могла восстановить её и корректно вычислить хеш; секретной является сама соль как случайное значение, но её нельзя «держать в секрете» от пользователя, поскольку без неё нельзя проверить пароль.
Raw
{"answer": "нет", "пояснение": "Соль обычно хранится в открытом виде (например, в базе данных вместе с хешем), чтобы при проверке пароля система могла восстановить её и корректно вычислить хеш; секретной является сама соль как случайное значение, но её нельзя «держать в секрете» от пользователя, поскольку без неё нельзя проверить пароль."}
верноСоль хранится открыто (password_hash включает её в строку хеша); секретность соли не нужна.
T18-L1
0.37 c
Тестирование: PHPUnitPHPUnit выполняет тестовые методы любого класса — наследовать TestCase не обязательно.«нет»
Пояснение: Для обнаружения PHPUnit-тестов класс должен наследовать TestCase (или использовать его атрибут).
Raw
{"answer": "нет", "пояснение": "Для обнаружения PHPUnit-тестов класс должен наследовать TestCase (или использовать его атрибут)."}
верноТестом считается метод класса, наследующего TestCase (PHPUnit 10).
T18-L2
0.36 c
Тестирование: PHPUnitМетод setUp() в PHPUnit вызывается один раз перед всеми тестами класса.«нет»
Пояснение: setUp() вызывается перед каждым методом теста, а setUpClass() вызывается один раз перед всеми тестами класса.
Raw
{"answer": "нет", "пояснение": "setUp() вызывается перед каждым методом теста, а setUpClass() вызывается один раз перед всеми тестами класса."}
верноsetUp() — перед КАЖДЫМ тестом; один раз на класс — setUpBeforeClass(). Проверено живым счётчиком на PHPUnit 10.5.
T18-L3
0.38 c
Тестирование: PHPUnitПоставщик данных (data provider) позволяет прогнать тест ровно с одним набором аргументов.«нет»
Пояснение: Data provider может возвращать несколько наборов аргументов, что позволяет прогнать тест с каждым из них.
Raw
{"answer": "нет", "пояснение": "Data provider может возвращать несколько наборов аргументов, что позволяет прогнать тест с каждым из них."}
верноНаоборот: наборов может быть сколько угодно — тест выполняется по разу на каждый. Проверено на PHPUnit 10.5 (#[DataProvider]).
T18-L4
0.35 c
Тестирование: PHPUnitКакой метод PHPUnit объявляет ожидание исключения определённого класса?«expectexception»
Пояснение: Метод expectException() в PHPUnit позволяет задать ожидание исключения конкретного класса.
Raw
{ ⏎   "answer": "expectException", ⏎   "пояснение": "Метод expectException() в PHPUnit позволяет задать ожидание исключения конкретного класса." ⏎ }
верно$this->expectException(\LogicException::class); проверено на PHPUnit 10.5.
T18-L5
0.44 c
Тестирование: PHPUnitВ PHPUnit стаб (stub) проверяет, какие методы на нём вызывали, а мок (mock) только подставляет данные.«нет»
Пояснение: В PHPUnit именно мок проверяет вызываемые методы, а стаб только подставляет фиксированные значения и не хранит историю вызовов.
Raw
{"answer": "нет", "пояснение": "В PHPUnit именно мок проверяет вызываемые методы, а стаб только подставляет фиксированные значения и не хранит историю вызовов."}
верноНаоборот: стаб подставляет данные, мок проверяет взаимодействия (createStub/createMock); docs PHPUnit — Test Doubles.
T18-L6
0.44 c
Тестирование: PHPUnitВ PHPUnit 10+ рекомендуемый способ передачи данных в тест — атрибут #[DataProvider] (аннотация @dataProvider устарела).«да»
Пояснение: В PHPUnit 10+ действительно рекомендуется использовать атрибут #[DataProvider], а устаревшая аннотация @dataProvider была удалена/заменина.
Raw
{"answer": "да", "пояснение": "В PHPUnit 10+ действительно рекомендуется использовать атрибут #[DataProvider], а устаревшая аннотация @dataProvider была удалена/заменина."}
верноАннотация ещё парсится в PHPUnit 10/11 (AnnotationParser в 10.5.66), удаление — в 12; атрибут — стандарт.
T18-L7
0.68 c
Тестирование: PHPUnitВ PHPUnit нельзя объявить зависимость одного теста от результата другого.«нет»
Пояснение: В PHPUnit тесты независимы, но для выполнения условной логики используют assertion-методы и условные операторы (например, if ($condition)) внутри одного теста или @depends для передачи данных, однако прямая зависимость результата одного теста от результата другого не поддерживается.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "В PHPUnit тесты независимы, но для выполнения условной логики используют assertion-методы и условные операторы (например, if ($condition)) внутри одного теста или @depends для передачи данных, однако прямая зависимость результата одного теста от результата другого не поддерживается." ⏎ }
верноЗависимости есть: #[Depends] — зависимый тест не запустится, еслиProducer упал.
T18-L8
0.4 c
Тестирование: PHPUnitКакая опция командной строки PHPUnit включает случайный порядок выполнения тестов?«--randomize»
Пояснение: Опция --randomize (или --shuffle) в PHPUnit позволяет выполнять тесты в случайном порядке.
Raw
{"answer":"--randomize", "пояснение":"Опция --randomize (или --shuffle) в PHPUnit позволяет выполнять тесты в случайном порядке."}
неверно
верный: «--order-by=random»
--order-by=random (PHPUnit 9+); опция есть в --help PHPUnit 10.5 (проектная).
T01-L9
2.51 c
Синтаксис и операторыЧто выведет этот код? ```php echo intdiv(7, 2) . intdiv(-7, 2); ```«3-4»
Пояснение: intdiv(7, 2) равен 3, intdiv(-7, 2) равен -4 (целочисленное деление в сторону -∞), при склеивании получается строка "3-4".
Raw
{"answer": "3-4", "пояснение": "intdiv(7, 2) равен 3, intdiv(-7, 2) равен -4 (целочисленное деление в сторону -∞), при склеивании получается строка \"3-4\"."}
неверно
верный: «3-3»
intdiv обрезает к нулю: intdiv(-7, 2) = -3, не -4.
T01-L10
0.66 c
Синтаксис и операторыЧто выведет этот код? ```php echo -3 ** 2; ```«9»
Пояснение: В PHP оператор возведения в степень ** имеет более высокий приоритет, чем унарный минус, поэтому вычисляется 3 ** 2 = 9, а затем применяется знак: -(-3) не возникает, просто выводится 9.
Raw
```json ⏎ {"answer": 9, "пояснение": "В PHP оператор возведения в степень ** имеет более высокий приоритет, чем унарный минус, поэтому вычисляется 3 ** 2 = 9, а затем применяется знак: -(-3) не возникает, просто выводится 9."} ⏎ ```
неверно
верный: «-9»
** правоассоциативен и связывает крепче унарного минуса: -(3²).
T02-L9
0.63 c
Типы и сравненияЧто выведет этот код? ```php echo '1e1' == '10' ? 'true' : 'false'; ```«true»
Пояснение: Сравнение с == приводит обе стороны к числу: '1e1' интерпретируется как 10, поэтому '1e1' == '10' оценивается как true и выводится строка 'true'.
Raw
{ ⏎   "answer": "true", ⏎   "пояснение": "Сравнение с == приводит обе стороны к числу: '1e1' интерпретируется как 10, поэтому '1e1' == '10' оценивается как true и выводится строка 'true'." ⏎ }
верноОбе строки числовые — сравнение как чисел: 10 == 10.
T02-L10
0.34 c
Типы и сравненияЧто выведет этот код? ```php switch ('a') { case 0: echo 'zero'; break; default: echo 'other'; } ```«other»
Пояснение: Значение 'a' не соответствует типу 0, поэтому выполняется ветка default.
Raw
{"answer":"other","пояснение":"Значение 'a' не соответствует типу 0, поэтому выполняется ветка default."}
верноPHP 8: 'a' == 0 → false (раньше было true) — срабатывает default.
T03-L9
0.42 c
СтрокиЧто выведет этот код? ```php echo strtr('abc', ['a' => '1', 'ab' => '2']); ```«1bc»
Пояснение: strtr выполняет замену从左 направо по ключам массива, и ключ 'a' заменяется на '1' перед 'ab'.
Raw
{"answer": "1bc", "пояснение": "strtr выполняет замену从左 направо по ключам массива, и ключ 'a' заменяется на '1' перед 'ab'."}
неверно
верный: «2c»
strtr с массивом предпочитает самое длинное совпадение ключа.
T03-L10
0.41 c
СтрокиЧто выведет этот код? ```php echo '[' . substr('hello', -10) . ']'; ```«[hello]»
Пояснение: Функция substr с отрицательной длиной -10, которая больше длины строки, возвращает всю строку 'hello'.
Raw
{"answer": "[hello]", "пояснение": "Функция substr с отрицательной длиной -10, которая больше длины строки, возвращает всю строку 'hello'."}
верноОтрицательный старт за пределами строки зажимается к началу.
T04-L9
0.43 c
МассивыЧто выведет этот код? ```php $a = ['k' => 1, 'n' => 2]; $b = ['k' => 9, 'm' => 3]; echo implode(',', array_keys($a + $b)); ```«k,n,m»
Пояснение: Оператор «+» объединяет массивы, где ключ 'k' остаётся из первого массива, а остальные ключи добавляются.
Raw
{"answer":"k,n,m","пояснение":"Оператор «+» объединяет массивы, где ключ 'k' остаётся из первого массива, а остальные ключи добавляются."}
верноОператор + : при дубликатах строковых ключей побеждает левый массив.
T04-L10
0.57 c
МассивыЧто выведет этот код? ```php $a = [[1, 'x', 2], [2, 'y', 1], [3, 'z', 2]]; usort($a, fn($p, $q) => $p[2] <=> $q[2]); echo implode('', array_column($a, 1)); ```«zyx»
Пояснение: usort сортирует массив по third-элементу (2, 2, 1), затем array_column извлекает строки из второго индекса, давая результат 'zyx'.
Raw
{"answer": "zyx", "пояснение": "usort сортирует массив по third-элементу (2, 2, 1), затем array_column извлекает строки из второго индекса, давая результат 'zyx'."}
неверно
верный: «yxz»
Сортировка стабильна с 8.0: x и z при равном ключе сохраняют порядок.
T05-L10
0.54 c
Функции и замыканияЧто выведет этот код? ```php function f(int $a, int $b): int { return $a - $b; } echo f(...['b' => 1, 'a' => 5]); ```«4»
Пояснение: Спринт-расширение массива передаёт аргументы в порядке ключей, поэтому f(5, 1) возвращает 5 - 1 = 4.
Raw
{"answer": 4, "пояснение": "Спринт-расширение массива передаёт аргументы в порядке ключей, поэтому f(5, 1) возвращает 5 - 1 = 4."}
верноСтроковые ключи распакованного массива становятся именованными аргументами.
T05-L9
0.7 c
Функции и замыканияЧто выведет этот код? ```php class P { private int $v = 3; public function g(): int { return $this->v; } } $p = new P; $f = $p->g(...); $p = null; echo $f(); ```«3»
Пояснение: Закрывая скобку $f($p->g(...)), PHP вызывает $p->g(), которая возвращает 3, и $f становится ссылкой на объект P, поэтому вызов $f() после присвоения null $p все еще сработает и вернет 3.
Raw
{"answer": 3, "пояснение": "Закрывая скобку $f($p->g(...)), PHP вызывает $p->g(), которая возвращает 3, и $f становится ссылкой на объект P, поэтому вызов $f() после присвоения null $p все еще сработает и вернет 3."}
верноПервая-class callable синтаксис привязывает $this при создании.
T06-L9
0.48 c
ООП: классы и наследованиеЧто выведет этот код? ```php class A { public function who(): string { return static::class; } } class B extends A {} echo (new B)->who(); ```«b»
Пояснение: Ключевое слово static в late static binding ссылается на класс, в котором метод был вызван (B), а не на класс определения (A).
Raw
{"answer": "B", "пояснение": "Ключевое слово static в late static binding ссылается на класс, в котором метод был вызван (B), а не на класс определения (A)."}
верноПозднее статическое связывание: static::class = класс получателя.
T06-L10
0.66 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»
Пояснение: PHP 8.5 добавила свойства с accessors (property hooks), и при присваивании $c->x = 5 срабатывает setter, который сохраняет $this->x = $value * 2, то есть 10.
Raw
{"answer": 10, "пояснение": "PHP 8.5 добавила свойства с accessors (property hooks), и при присваивании $c->x = 5 срабатывает setter, который сохраняет $this->x = $value * 2, то есть 10."}
верноВнутри set-хука $this->x пишет в backing store (без рекурсии): 5*2.
T07-L9
0.43 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(); ```«bg»
Пояснение: Конфликт разрешается в пользу TB::f для f(), а TA::f переименован в g() через as.
Raw
{"answer":"BG","пояснение":"Конфликт разрешается в пользу TB::f для f(), а TA::f переименован в g() через as."}
неверно
верный: «ba»
insteadof выбирает реализацию, as оставляет вторую под другим именем.
T07-L10
0.54 c
Интерфейсы, трейты, enumЧто выведет этот код? ```php trait Counter { public static int $n = 0; } class CX { use Counter; } class CY { use Counter; } CX::$n = 1; echo CY::$n; ```«0»
Пояснение: Static property $n в trait не является общим для всех классов, использующих его — каждый класс, который использует trait, получает собственную копию статического свойства.
Raw
{ ⏎   "answer": 0, ⏎   "пояснение": "Static property $n в trait не является общим для всех классов, использующих его — каждый класс, который использует trait, получает собственную копию статического свойства." ⏎ }
верноСтатическое свойство трейта копируется в каждый использующий класс.
T08-L10
0.38 c
Исключения и ошибкиЧто выведет этот код? ```php function f(): int { try { return 1; } finally { return 2; } } echo f(); ```«1»
Пояснение: В PHP return в блоке finally игнорируется, и значение возвращается из блока try.
Raw
{"answer": 1, "пояснение": "В PHP return в блоке finally игнорируется, и значение возвращается из блока try."}
неверно
верный: «2»
return в finally перезаписывает return из try.
T08-L9
0.34 c
Исключения и ошибкиЧто выведет этот код? ```php try { try { throw new RuntimeException('first'); } finally { throw new LogicException('second'); } } catch (LogicException $e) { echo $e->getMessage(); } ```«second»
Пояснение: finally-блок выполняется и выбрасывает LogicException, который перехватывается внешним catch.
Raw
{"answer": "second", "пояснение": "finally-блок выполняется и выбрасывает LogicException, который перехватывается внешним catch."}
верноИсключение из finally подменяет уже летящее — ловится последнее.
T09-L9
0.53 c
Пространства имён и автозагрузкаЧто выведет этот код? ```php namespace N; use App\Foo as Baz; echo Baz::class . '|' . \Baz::class; ```«n\baz|baz»
Пояснение: Имяpaced namespace N префиксирует класс App\Foo в N\Baz, а \Baz::class выводит глобальный класс Baz.
Raw
{"answer": "N\\Baz|Baz", "пояснение": "Имяpaced namespace N префиксирует класс App\\Foo в N\\Baz, а \\Baz::class выводит глобальный класс Baz."}
неверно
верный: «app\foo|baz»
use-алиас действует на неквалифицированные имена; ведущий \ уводит в глобальную область.
T09-L10
0.64 c
Пространства имён и автозагрузкаЧто выведет этот код? ```php namespace Ns; class Foo {} $c = 'Foo'; echo (class_exists($c) ? 'yes' : 'no') . (class_exists(__NAMESPACE__ . '\\' . $c) ? 'yes' : 'no'); ```«yesno»
Пояснение: class_exists('Foo') возвращает true, так как класс Foo объявлен в текущем namespace Ns, тогда как class_exists('Ns\Foo') возвращает false, потому что в namespace Ns нет подкласса Foo с таким именем.
Raw
{ ⏎   "answer": "yesno", ⏎   "пояснение": "class_exists('Foo') возвращает true, так как класс Foo объявлен в текущем namespace Ns, тогда как class_exists('Ns\\Foo') возвращает false, потому что в namespace Ns нет подкласса Foo с таким именем." ⏎ }
неверно
верный: «noyes»
Динамические имена не резолвятся относительно namespace — 'Foo' это глобальный класс.
T10-L9
0.57 c
Ссылки и область видимостиЧто выведет этот код? ```php $a = [1, 2, 3]; foreach ($a as &$v) {} $v = 99; echo implode(',', $a); ```«99,2,3»
Пояснение: Перебор по ссылке $a[1] остаётся связанной ссылкой на последний элемент массива, и $v = 99 изменяет именно его.
Raw
{ ⏎   "answer": "99,2,3", ⏎   "пояснение": "Перебор по ссылке $a[1] остаётся связанной ссылкой на последний элемент массива, и $v = 99 изменяет именно его." ⏎ }
неверно
верный: «1,2,99»
После foreach по ссылке $v остаётся ссылкой на последний элемент.
T10-L10
0.73 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(); ```«3»
Пояснение: Статический переменный $n хранится на уровне класса B (наследника), а вызовы $a->inc() и $b->inc() и третий $a->inc() инкрементируют общий статический $n, начиная с 0, до 3.
Raw
{"answer": 3, "пояснение": "Статический переменный $n хранится на уровне класса B (наследника), а вызовы $a->inc() и $b->inc() и третий $a->inc() инкрементируют общий статический $n, начиная с 0, до 3."}
верноstatic-переменная метода одна на метод родителя — наследники делят её.
T11-L9
0.6 c
Генераторы, итераторы, SPLЧто выведет этот код? ```php function g(): Generator { $x = yield 1; return $x + 1; } $g = g(); $g->send(10); echo $g->getReturn(); ```«11»
Пояснение: После создания генератора $g->send(10) передаёт значение 10 в yield 1, после чего генератор завершается и возвращает 10 + 1 = 11.
Raw
{"answer": 11, "пояснение": "После создания генератора $g->send(10) передаёт значение 10 в yield 1, после чего генератор завершается и возвращает 10 + 1 = 11."}
верноsend() возобновляет генератор: $x = 10, return 10+1.
T11-L10
0.58 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»
Пояснение: yield from inner() передаёт значения 1 и 2, а return 'ok' в генераторе не влияет на вывод, так как итерация завершается до достижения return.
Raw
{ ⏎ "answer": "1,2", ⏎ "пояснение": "yield from inner() передаёт значения 1 и 2, а return 'ok' в генераторе не влияет на вывод, так как итерация завершается до достижения return." ⏎ }
неверно
верный: «ok,2»
yield from не двигает авто-ключ внешнего генератора: yield $r получает ключ 0 и перезаписывает единицу — 'ok' оказывается первым.
T12-L9
0.53 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'; ```«yesno»
Пояснение: password_hash с cost 4 создаст хэш, который уже соответствует параметрам cost 4, поэтому первый вызов вернёт false, а при cost 5 вернёт true.
Raw
{"answer":"yesno","пояснение":"password_hash с cost 4 создаст хэш, который уже соответствует параметрам cost 4, поэтому первый вызов вернёт false, а при cost 5 вернёт true."}
неверно
верный: «noyes»
password_needs_rehash сравнивает параметры хэша с целевыми: cost 4 = 4 → 'no', cost 5 ≠ 4 → 'yes'.
T12-L10
0.57 c
Конфигурация и безопасностьЧто выведет этот код на PHP 8.5? ```php echo (E_ALL & 2048) === 0 ? 'strict-out' : 'strict-in'; ```«strict-out»
Пояснение: В PHP 8.5 E_ALL равно 134217728, и битовое AND с 2048 даёт 0, поэтому выводится 'strict-out'.
Raw
{"answer": "strict-out", "пояснение": "В PHP 8.5 E_ALL равно 134217728, и битовое AND с 2048 даёт 0, поэтому выводится 'strict-out'."}
верноВ PHP 8.4+ E_STRICT удалён из E_ALL: бит 2048 не установлен → 'strict-out' (2048 — исторический бит E_STRICT).
T13-L9
0.54 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»
Пояснение: Symfony Request::create конвертирует HTTP_X_TOKEN в заголовок X-Token, и get() возвращает его значение, что делает сравнение верным.
Raw
{ ⏎   "answer": "mapped", ⏎   "пояснение": "Symfony Request::create конвертирует HTTP_X_TOKEN в заголовок X-Token, и get() возвращает его значение, что делает сравнение верным." ⏎ }
верноСравнение с литералом требует знания маппинга: HttpFoundation переводит HTTP_X_TOKEN в заголовок X-Token (регистр не важен); не знающий маппинг ответит 'missing'.
T13-L10
0.53 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; ```«cba»
Пояснение: Listeners отсортированы по приоритету по убыванию, поэтому срабатывают в порядке 10, 0, 5: B, A, C.
Raw
{"answer":"CBA","пояснение":"Listeners отсортированы по приоритету по убыванию, поэтому срабатывают в порядке 10, 0, 5: B, A, C."}
неверно
верный: «bca»
Порядок листенеров — по убыванию приоритета: 10 (B), 5 (C), 0 (A).
T14-L10
0.47 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 кеширует найденные сущности, поэтому оба вызова find возвращают один и тот же объект из первого-level cache.
Raw
{"answer": "same", "пояснение": "EntityManager кеширует найденные сущности, поэтому оба вызова find возвращают один и тот же объект из первого-level cache."}
верноIdentity map: повторный find того же id возвращает тот же инстанс.
T14-L9
0.51 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»
Пояснение: Entity persist() в режиме Pending, но remove() до flush() отменяет её добавление из EntityManager, поэтому flush() не вставляет ряд, и таблица остаётся пустой.
Raw
{"answer": 0, "пояснение": "Entity persist() в режиме Pending, но remove() до flush() отменяет её добавление из EntityManager, поэтому flush() не вставляет ряд, и таблица остаётся пустой."}
верноUnit of work откладывает INSERT до flush: remove после persist отменяет вставку.
T15-L10
0.41 c
PostgreSQLЧто вернёт этот SQL-запрос (PostgreSQL 17)? ```sql CREATE TEMP TABLE t (x int); INSERT INTO t VALUES (1), (NULL); SELECT count(x) FROM t; ```«1»
Пояснение: Функция count(x) считает только непустые значения в колонке, игнорируя NULL.
Raw
{"answer": 1, "пояснение": "Функция count(x) считает только непустые значения в колонке, игнорируя NULL."}
верноcount(столбец) не считает NULL; count(*) считал бы 2.
T15-L9
0.62 c
PostgreSQLЧто вернёт этот SQL-запрос (PostgreSQL 17)? ```sql CREATE TEMP TABLE t (id int, x int); INSERT INTO t VALUES (1, 10), (2, 20), (3, 30); SELECT string_agg(s::text, ',' ORDER BY id) FROM ( SELECT id, sum(x) OVER (ORDER BY id) AS s FROM t ) q; ```«10,30,60»
Пояснение: Window function SUM() OVER (ORDER BY id) вычисляет накопленную сумму 10, 30, 60, затем string_agg с ORDER BY id объединяет их в одну строку с запятыми.
Raw
{"answer":"10,30,60","пояснение":"Window function SUM() OVER (ORDER BY id) вычисляет накопленную сумму 10, 30, 60, затем string_agg с ORDER BY id объединяет их в одну строку с запятыми."}
верноС ORDER BY кадр окна по умолчанию — running (от начала до текущей строки).
T16-L9
0.61 c
Symfony: MessengerЧто выведет этот код? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\StackInterface; use Symfony\Component\Messenger\Envelope; final class Trace implements MiddlewareInterface { public function __construct(private string $tag) {} public function handle(Envelope $e, StackInterface $stack): Envelope { echo $this->tag; return $stack->next()->handle($e, $stack); } } $bus = new MessageBus([new Trace('M1'), new Trace('M2')]); $bus->dispatch(new Envelope(new stdClass())); ```«m1m2»
Пояснение: Стек middleware обрабатывается сверху вниз: сначала Trace M1 выводит 'M1' и вызывает следующий, затем M2 выводит 'M2', что даёт результат 'M1M2'.
Raw
{"answer": "M1M2", "пояснение": "Стек middleware обрабатывается сверху вниз: сначала Trace M1 выводит 'M1' и вызывает следующий, затем M2 выводит 'M2', что даёт результат 'M1M2'."}
верноПервым добавленный middleware выполняется первым (внешний).
T16-L10
0.48 c
Symfony: MessengerЧто выведет этот код? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; use Symfony\Component\Messenger\Handler\HandlersLocator; use Symfony\Component\Messenger\Handler\HandlerDescriptor; use Symfony\Component\Messenger\Envelope; class Ping {} $n = 0; $d1 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 1; }, ['alias' => 'h1']); $d2 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 10; }, ['alias' => 'h2']); $bus = new MessageBus([ new HandleMessageMiddleware(new HandlersLocator([Ping::class => [$d1, $d2]])), ]); $bus->dispatch(new Envelope(new Ping())); echo $n; ```«11»
Пояснение: Оба обработчика вызываются последовательно, поэтому n увеличивается на 1 и на 10, итого 11.
Raw
{"answer": 11, "пояснение": "Оба обработчика вызываются последовательно, поэтому n увеличивается на 1 и на 10, итого 11."}
верноВсе зарегистрированные хендлеры сообщения вызываются: 1 + 10 = 11.
T17-L9
0.5 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»
Пояснение: Первый INSERT добавляет строку с a=1, второй отбрасывается из-за уникального индекса, поэтому count(*) = 1.
Raw
{"answer": 1, "пояснение": "Первый INSERT добавляет строку с a=1, второй отбрасывается из-за уникального индекса, поэтому count(*) = 1."}
верноON CONFLICT DO NOTHING пропускает дубликат: вставка одна.
T17-L10
0.97 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»
Пояснение: После BEGIN создаётся транзакция, в ней создаётся временная таблица с уникальным ограничением, отложенным до конца транзакции, и в ней выполняются два вставки с одинаковым значением 1, поэтому после SELECT count(*) из таблицы будет считано две записи, так как нарушение ограничения уникальности проверяется только в момент COMMIT/ROLLBACK, а не сразу после каждого INSERT.
Raw
{ ⏎   "answer": 2, ⏎   "пояснение": "После BEGIN создаётся транзакция, в ней создаётся временная таблица с уникальным ограничением, отложенным до конца транзакции, и в ней выполняются два вставки с одинаковым значением 1, поэтому после SELECT count(*) из таблицы будет считано две записи, так как нарушение ограничения уникальности проверяется только в момент COMMIT/ROLLBACK, а не сразу после каждого INSERT." ⏎ }
верноDEFERRED откладывает проверку уникальности до COMMIT — count видит 2 строки.
T18-L9
0.55 c
Тестирование: PHPUnitСколько тестов выполнит эта команда? ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class CalcTest extends TestCase { public static function prov(): array { return [[1], [2], [3]]; } #[DataProvider('prov')] public function test_sum(int $x): void { $this->assertTrue($x > 0); } #[DataProvider('prov')] public function test_sum_abs(int $x): void { $this->assertTrue($x > 0); } public function test_other(): void { $this->assertTrue(true); } } ``` Команда: `phpunit CalcTest.php --filter test_sum` (PHPUnit 10.5)«6»
Пояснение: Флаг --filter test_sum выбирает оба метода, начинающихся с test_sum, и для каждого из них DataProvider запускает по 3 теста, что в сумме даёт 6.
Raw
{"answer": 6, "пояснение": "Флаг --filter test_sum выбирает оба метода, начинающихся с test_sum, и для каждого из них DataProvider запускает по 3 теста, что в сумме даёт 6."}
верно--filter — подстрочное совпадение: test_sum ловит и test_sum_abs (3+3 датасета).
T18-L10
0.68 c
Тестирование: PHPUnitСколько тестов выполнит эта команда и сколько из них завершится failure? Ответь двумя числами через запятую (выполнено, упало). ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class Calc2Test extends TestCase { public function prov(): array { return [[1], [-1]]; } #[DataProvider('prov')] public function test_x(int $x): void { $this->assertTrue($x > 0); } } ``` Команда: `phpunit Calc2Test.php` (PHPUnit 10.5)«2,1»
Пояснение: DataProvider 'prov' предоставляет два набора данных ([1] и [-1]), поэтому выполнится 2 теста, и из них один (для [-1]) завершится failure, потому что -1 > 0 возвращает false.
Raw
{ ⏎   "answer": "2,1", ⏎   "пояснение": "DataProvider 'prov' предоставляет два набора данных ([1] и [-1]), поэтому выполнится 2 теста, и из них один (для [-1]) завершится failure, потому что -1 > 0 возвращает false." ⏎ }
верноНе-static провайдер — только deprecation в PHPUnit 10: оба датасета выполнятся, датасет [-1] валит assert — 2 выполнено, 1 failure.
T19-L9
0.42 c
HTTP и REST APIКакой HTTP-метод отправит эта команда? ```bash curl -s -d 'a=1' http://demo.local/api ```«post»
Пояснение: Опция -d в curl присваивает данные в теле запроса и по умолчанию отправляет их методом POST.
Raw
{"answer": "POST", "пояснение": "Опция -d в curl присваивает данные в теле запроса и по умолчанию отправляет их методом POST."}
верно-d/-F переключает curl на POST по умолчанию.
T19-L10
0.33 c
HTTP и REST APIКакой HTTP-метод отправит эта команда? ```bash curl -s -G -d 'a=1' http://demo.local/api ```«get»
Пояснение: Флаг -G преобразует параметры из -d в строку запроса GET.
Raw
{"answer": "GET", "пояснение": "Флаг -G преобразует параметры из -d в строку запроса GET."}
верно-G превращает данные из -d в query string, метод остаётся GET.
T20-L9
0.52 c
Безопасность и OAuthКлиент обращается к токен-эндпоинту (RFC 6749) с несуществующим client_id. Какое значение поля error вернёт эндпоинт?«invalid_client»
Пояснение: Если клиент использует несуществующий client_id при обращении к токен-эндпоинту, RFC 6749 указывает, что сервер должен вернуть ошибку invalid_client.
Raw
{ ⏎   "answer": "invalid_client", ⏎   "пояснение": "Если клиент использует несуществующий client_id при обращении к токен-эндпоинту, RFC 6749 указывает, что сервер должен вернуть ошибку invalid_client." ⏎ }
верноНеизвестный клиент → invalid_client (RFC 6749 §5.2).
T20-L10
0.35 c
Безопасность и OAuthOAuth 2.0: клиент начал поток с response_type=token. В какой части redirect_uri авторизационный сервер передаёт access_token?«query»
Пояснение: В Implicit grant (response_type=token) access_token передаётся в query string redirect_uri.
Raw
{"answer":"query", "пояснение":"В Implicit grant (response_type=token) access_token передаётся в query string redirect_uri."}
неверно
верный: «fragment»
Implicit-поток передаёт токен в фрагменте URL (#) — он не уходит на сервер.
T21-L9
0.42 c
TwigЧто выведет этот шаблон Twig? ```twig {{ false|default(2) * 3 }} ```«6»
Пояснение: Функция default вернёт 2, так как false является falsy, и результат умножения 2 * 3 равно 6.
Raw
{"answer": 6, "пояснение": "Функция default вернёт 2, так как false является falsy, и результат умножения 2 * 3 равно 6."}
верноdefault заменяет exactly false/null/''/[] — false подменится на 2, 2*3 = 6; наивное «default только для undefined» даёт 0.
T21-L10
0.49 c
TwigКакой класс исключения выбросит render() этого шаблона? ```twig {{ 'a' ~ 1 + 2 }} ```«3»
Пояснение: Twig сначала выполняет конкатенацию 'a' ~ 1, получая 'a1', а затем складывает это с 2, что приводит к 3.
Raw
{"answer": "3", "пояснение": "Twig сначала выполняет конкатенацию 'a' ~ 1, получая 'a1', а затем складывает это с 2, что приводит к 3."}
неверно
верный: «runtimeerror»
В Twig ~ связывает крепче +: ('a' ~ 1) + 2 → string + int → ошибка рендера (RuntimeError).
T22-L9
0.45 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, поэтому один валидатор выдаст ошибку и count вернёт 1.
Raw
{"answer": 1, "пояснение": "Пустая строка не проходит проверку NotBlank, поэтому один валидатор выдаст ошибку и count вернёт 1."}
неверно
верный: «0»
NotBlank считает пустым null, '', [] — массив [''] не пуст.
T22-L10
0.35 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); } ```«valid»
Пояснение: Код корректно создаёт форму Symfony без ошибок, поэтому выводится 'valid'.
Raw
{"answer": "valid", "пояснение": "Код корректно создаёт форму Symfony без ошибок, поэтому выводится 'valid'."}
неверно
верный: «symfony\component\form\exception\logicexception»
isValid() на неотправленной форме — LogicException, не false.
T23-L9
0.48 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() возвращает тот же самый инстанс, который был зарегистрирован в контейнере, поэтому сравнение object_id даёт true.
Raw
{ ⏎ "answer": "same", ⏎ "пояснение": "get() возвращает тот же самый инстанс, который был зарегистрирован в контейнере, поэтому сравнение object_id даёт true." ⏎ }
верноСервисы в контейнере общие (shared): get() дважды — один инстанс.
T23-L10
0.54 c
Symfony: конфигурация и сервисыЧто выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->setParameter('name', 'Bob'); $c->setParameter('greeting', 'hi %name%'); $c->setParameter('message', '%greeting%!'); $c->compile(); echo $c->getParameter('message'); ```«hi bob!»
Пояснение: В Symfony DependencyInjection параметры с суффиксом ! разрешают вложенные подстановки %name% и %greeting%, поэтому 'message' содержит 'hi Bob!'.
Raw
{ ⏎   "answer": "hi Bob!", ⏎   "пояснение": "В Symfony DependencyInjection параметры с суффиксом ! разрешают вложенные подстановки %name% и %greeting%, поэтому 'message' содержит 'hi Bob!'." ⏎ }
верноcompile() резолвит %-ссылки транзитивно: %greeting% → 'hi %name%' → 'hi Bob!', ответ собирается из двух шагов.
T24-L9
0.53 c
BootstrapКакая max-width у .container в Bootstrap 5.3 при ширине окна 992px?«1568px»
Пояснение: В Bootstrap 5.3 для брейкпоинта 992px (lg) max-width у .container составляет 1568px.
Raw
{"answer": "1568px", "пояснение": "В Bootstrap 5.3 для брейкпоинта 992px (lg) max-width у .container составляет 1568px."}
неверно
верный: «960»
Container-ширины 5.x: 540/720/960/1140/1320 (sm–xxl); 992 → 960px.
T24-L10
0.49 c
BootstrapКакая утилита определит цвет текста в Bootstrap 5.3: `<p class="text-danger text-primary">…</p>`? Ответь именем класса-победителя.«text-primary»
Пояснение: В HTML-элементе классы CSS применяются слева направо, поэтому последний указанный класс text-primary переопределяет предыдущий text-danger.
Raw
{"answer": "text-primary", "пояснение": "В HTML-элементе классы CSS применяются слева направо, поэтому последний указанный класс text-primary переопределяет предыдущий text-danger."}
неверно
верный: «text-danger»
Специфичность равна — победит правило позже в css: text-danger объявлен после text-primary.
T25-L9
0.6 c
Чистая архитектураСлои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class OrderService { public function __construct( private PlaceOrder $handler, private Db $db, ) {} } ```«2»
Пояснение: Класс в Domain использует App\Application\PlaceOrder (Application→Domain) и App\Infrastructure\Db (Infrastructure→Domain), что является нарушением депендентного слоя Domain, который может зависеть только от Domain.
Raw
{"answer": 2, "пояснение": "Класс в Domain использует App\\Application\\PlaceOrder (Application→Domain) и App\\Infrastructure\\Db (Infrastructure→Domain), что является нарушением депендентного слоя Domain, который может зависеть только от Domain."}
верноDomain может зависеть только от Domain: PlaceOrder (Application) + Db (Infrastructure) = 2.
T25-L10
0.35 c
Чистая архитектураСлои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class BillingService { public function __construct( private PlaceOrder $handler, private Db $db, private \App\Infrastructure\Logger $logger, ) {} } ```«2»
Пояснение: Domain не может зависеть от Application или Infrastructure, здесь два нарушения: PlaceOrder и Db.
Raw
{"answer": 2, "пояснение": "Domain не может зависеть от Application или Infrastructure, здесь два нарушения: PlaceOrder и Db."}
неверно
верный: «3»
Inline-FQCN \App\Infrastructure\Logger тоже считается: Application + Db + Logger = 3.
T26-L10
0.7 c
DDDЧто выведет этот код? ```php final class Money { public function __construct(public readonly int $amount) {} public function add(Money $o): Money { return new self($this->amount + $o->amount); } } $a = new Money(10); $c = $a->add(new Money(5)); echo $a->amount . ',' . $c->amount; ```«10,15»
Пояснение: Класс Money использует readonly-свойство, что делает его неизменяемым после создания, поэтому add() возвращает новый экземпляр с суммой 15, а исходный $a остаётся с amount 10.
Raw
{ ⏎ "answer": "10,15", ⏎ "пояснение": "Класс Money использует readonly-свойство, что делает его неизменяемым после создания, поэтому add() возвращает новый экземпляр с суммой 15, а исходный $a остаётся с amount 10." ⏎ }
верноVO иммутабелен: add() возвращает новый инстанс, исходный не меняется.
T26-L9
0.52 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(); ```«1»
Пояснение: При удалении последнего элемента бросается DomainException, который перехватывается, поэтому элемент 'a' остаётся в массиве, и count() возвращает 1.
Raw
{"answer": 1, "пояснение": "При удалении последнего элемента бросается DomainException, который перехватывается, поэтому элемент 'a' остаётся в массиве, и count() возвращает 1."}
верноСорванный remove не меняет состояние агрегата: инвариант бросил исключение до unset — count остался 1.
VC-L9
0.41 c
PHP 8.4–8.5Что выведет этот код на PHP 8.5? ```php class C { public function hi(): string { return 'hi'; } } echo new C()->hi(); ```«hi»
Пояснение: Создаётся объект класса C и вызывается его метод hi(), возвращающий строку 'hi'.
Raw
{"answer": "hi", "пояснение": "Создаётся объект класса C и вызывается его метод hi(), возвращающий строку 'hi'."}
верноС 8.4 new в цепочке методов вызывается без обрамляющих скобок.
VC-L10
0.62 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'; ```«yesno»
Пояснение: isUninitializedLazyObject() возвращает true только до первого доступа к свойству, после доступа к $o->v объект уже инициализирован, поэтому выведется 'no'.
Raw
```json ⏎ { ⏎   "answer": "yesno", ⏎   "пояснение": "isUninitializedLazyObject() возвращает true только до первого доступа к свойству, после доступа к $o->v объект уже инициализирован, поэтому выведется 'no'." ⏎ } ⏎ ```
верноnewLazyGhost (8.4): объект ленив, пока к нему не обратились — чтение свойства инициализирует и снимает флаг.
T28-L9
0.56 c
Symfony: версииПроект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Security\Guard\AbstractGuardAuthenticator::class) ? 'yes' : 'no'; ```«no»
Пояснение: В Symfony 7.0 было удалено Guard Authenticator (AbstractGuardAuthenticator), а в 8.1 его уже нет, поэтому class_exists возвращает false и выведется 'no'.
Raw
{"answer": "no", "пояснение": "В Symfony 7.0 было удалено Guard Authenticator (AbstractGuardAuthenticator), а в 8.1 его уже нет, поэтому class_exists возвращает false и выведется 'no'."}
верноGuard-аутентификация удалена в Symfony 7.0 — класса в 8.1 нет.
T28-L10
0.42 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'; ```«noyes»
Пояснение: В Symfony 6.4 класс AnnotationClassLoader был удалён, а AttributeClassLoader доступен, поэтому вывод будет noyes.
Raw
{ ⏎ "answer": "noyes", ⏎ "пояснение": "В Symfony 6.4 класс AnnotationClassLoader был удалён, а AttributeClassLoader доступен, поэтому вывод будет noyes." ⏎ }
верноАннотационные лоадеры удалены в 7.0, остались атрибутные (Annotation→Attribute).