Карта знаний PHP — huihui-ai:pi-100k, run-65 · think: off

Оценка: PHP 93.8% · PHP+версии 86.6% · Symfony 87.5% · Symfony+версии 89.6% · БД и ORM 100.0% · Архитектура 87.5% · Фронтенд 81.2% · HTTP 100.0% · Безопасность 100.0% · Тесты 100.0% · Глубина 71.4% · Всего 89.6%
Разобрано JSON: 99.0% (293 из 296)
По зонам: База 92.8% · PHP 8.4–8.5 62.5% · Будущее 75.0% · Глубина 71.4%
Точность: 215 / 240 (+ глубина 40 / 56)
Разобрано ответов: 295 / 240 (не по JSON-формату: 3 · без вердикта: -55)
Ответов «да»: 52.3% (баланс вопросника 50/50, базлайн константного ответа — 50%)
Время: 2.6 мин (0.41 c на клетку — медиана)
Цена: $0.018
Токены: 42534 вх / 16154 вых (кэш: 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
8/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
8/10
Строки
T03-L1 · Строки
strrev() корректно переворачивает строку в UTF-8.
Модель: «нет»
Верный ответ: нет
T03-L2 · Строки
str_contains('Hello world', 'world') возвращает true.
Модель: «да»
Верный ответ: да
T03-L3 · Строки
str_pad() умеет дополнять строку только справа.
Модель: «нет»
Верный ответ: нет
T03-L4 · Строки
По умолчанию trim() срезает только пробелы, не трогая табы и переводы строк.
Модель: «нет»
Верный ответ: нет
T03-L5 · Строки
Сколько БАЙТ вернёт strlen('привет') для строки в UTF-8?
Модель: «12»
Верный ответ: 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']); ```
Модель: «2bc»
Верный ответ: 2c
T03-L10 · Строки
Что выведет этот код? ```php echo '[' . substr('hello', -10) . ']'; ```
Модель: «[hello]»
Верный ответ: [hello]
9/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)?
Модель: «{"answer": [20, 30], "пояснение": "array_slice извлекает 2 элемента, начиная с индекса 1, что возвращает подмассив [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)); ```
Модель: «xzy»
Верный ответ: yxz
8/10
Функции и замыкания
T05-L1 · Функции и замыкания
Именованные аргументы нельзя комбинировать с распаковкой массива ...$args в одном вызове.
Модель: «нет»
Верный ответ: нет
T05-L2 · Функции и замыкания
Анонимная функция без use видит переменные внешней области видимости.
Модель: «нет»
Верный ответ: нет
T05-L3 · Функции и замыкания
Что вернёт func_num_args() внутри function f($a) { return func_num_args(); } при вызове f(1, 2, 3)?
Модель: «3»
Верный ответ: 3
T05-L4 · Функции и замыкания
Тело стрелочной функции fn может состоять из нескольких выражений в фигурных скобках.
Модель: «нет»
Верный ответ: нет
T05-L5 · Функции и замыкания
Стрелочная функция fn захватывает внешние переменные по ссылке (лениво, при использовании).
Модель: «нет»
Верный ответ: нет
T05-L6 · Функции и замыкания
Замыкание, объявленное как static function () {}, не захватывает $this.
Модель: «да»
Верный ответ: да
T05-L7 · Функции и замыкания
Что выведет: $x = 5; $f = function () use ($x) { return $x; }; $x = 7; echo $f();
Модель: «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
10/10
ООП: классы и наследование
T06-L1 · ООП: классы и наследование
PHP поддерживает promotion свойств в конструкторе: public function __construct(private int $x) {}.
Модель: «да»
Верный ответ: да
T06-L2 · ООП: классы и наследование
Какое ключевое слово запрещает переопределять метод в подклассах?
Модель: «final»
Верный ответ: final
T06-L3 · ООП: классы и наследование
Метод, объявленный как final, нельзя переопределить в подклассе.
Модель: «да»
Верный ответ: да
T06-L4 · ООП: классы и наследование
Свойства родителя с видимостью private доступны в подклассе.
Модель: «нет»
Верный ответ: нет
T06-L5 · ООП: классы и наследование
Что вернёт get_class(new class {})? Ответь частью имени до нулевого байта (без пути к файлу).
Модель: «class@anonymous»
Верный ответ: 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(); ```
Модель: «ba»
Верный ответ: ba
T07-L10 · Интерфейсы, трейты, enum
Что выведет этот код? ```php trait Counter { public static int $n = 0; } class CX { use Counter; } class CY { use Counter; } CX::$n = 1; echo CY::$n; ```
Модель: «0»
Верный ответ: 0
10/10
Исключения и ошибки
T08-L1 · Исключения и ошибки
Интерфейс Throwable — общий предок и для Exception, и для Error.
Модель: «да»
Верный ответ: да
T08-L2 · Исключения и ошибки
Блок catch (Exception $e) перехватит и TypeError, потому что TypeError в итоге наследуется от Exception.
Модель: «нет»
Верный ответ: нет
T08-L3 · Исключения и ошибки
Оператор @ подавляет и исключения тоже.
Модель: «нет»
Верный ответ: нет
T08-L4 · Исключения и ошибки
Какой класс ошибки бросит intdiv(5, 0)?
Модель: «divisionbyzeroerror»
Верный ответ: divisionbyzeroerror
T08-L5 · Исключения и ошибки
Блок finally выполняется только если исключение было поймано блоком catch.
Модель: «нет»
Верный ответ: нет
T08-L6 · Исключения и ошибки
Исключение, выброшенное внутри блока finally, никак не влияет на результат try-блока.
Модель: «нет»
Верный ответ: нет
T08-L7 · Исключения и ошибки
Что вернёт выражение: (bool) new Exception('x')?
Модель: «да»
Верный ответ: true
T08-L8 · Исключения и ошибки
Функции, зарегистрированные через register_shutdown_function(), выполняются при вызове exit.
Модель: «нет»
Верный ответ: да
T08-L9 · Исключения и ошибки
Что выведет этот код? ```php try { try { throw new RuntimeException('first'); } finally { throw new LogicException('second'); } } catch (LogicException $e) { echo $e->getMessage(); } ```
Модель: «second»
Верный ответ: second
T08-L10 · Исключения и ошибки
Что выведет этот код? ```php function f(): int { try { return 1; } finally { return 2; } } echo f(); ```
Модель: «2»
Верный ответ: 2
9/10
Пространства имён и автозагрузка
T09-L1 · Пространства имён и автозагрузка
Директива use App\Service\Mailer; сама по себе подключает файл с классом.
Модель: «нет»
Верный ответ: нет
T09-L2 · Пространства имён и автозагрузка
Что пишут после use, чтобы импортировать функцию (а не класс): слово function или const?
Модель: «function»
Верный ответ: function
T09-L3 · Пространства имён и автозагрузка
В какой файл (путь от src/) PSR-4 «App\ → src/» положит класс App\Controller\Api\UserController?
Модель: «controller/api/usercontroller.php»
Верный ответ: src/controller/api/usercontroller.php
T09-L4 · Пространства имён и автозагрузка
Подключение vendor/autoload.php регистрирует обработчики через spl_autoload_register().
Модель: «да»
Верный ответ: да
T09-L5 · Пространства имён и автозагрузка
Магическая константа __NAMESPACE__ содержит имя текущего пространства имён.
Модель: «да»
Верный ответ: да
T09-L6 · Пространства имён и автозагрузка
Относительное имя класса (без ведущего \) в new резолвится от глобального корня.
Модель: «нет»
Верный ответ: нет
T09-L7 · Пространства имён и автозагрузка
При маппинге PSR-4 «App\ → src/» класс App\Model\User лежит в файле src/Model/User.php.
Модель: «да»
Верный ответ: да
T09-L8 · Пространства имён и автозагрузка
Директиву use можно писать внутри тела функции — импорт будет действовать для этой функции.
Модель: «нет»
Верный ответ: нет
T09-L9 · Пространства имён и автозагрузка
Что выведет этот код? ```php namespace N; use App\Foo as Baz; echo Baz::class . '|' . \Baz::class; ```
Модель: «n\app\foo|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'); ```
Модель: «{»
Верный ответ: noyes
9/10
Ссылки и область видимости
T10-L1 · Ссылки и область видимости
Массивы при присваивании копируются, а не передаются по ссылке.
Модель: «да»
Верный ответ: да
T10-L2 · Ссылки и область видимости
Что выведет: $a = [1, 2]; $b = $a; $b[] = 3; echo count($a);
Модель: «2»
Верный ответ: 2
T10-L3 · Ссылки и область видимости
Внутри функции пользовательские переменные глобальной области недоступны без global, $GLOBALS или передачи параметром.
Модель: «да»
Верный ответ: да
T10-L4 · Ссылки и область видимости
unset($GLOBALS['x']) внутри функции удаляет глобальную переменную только для этой функции.
Модель: «нет»
Верный ответ: нет
T10-L5 · Ссылки и область видимости
Что выведет: function inc(&$x) { $x++; } $n = 5; inc($n); echo $n;
Модель: «6»
Верный ответ: 6
T10-L6 · Ссылки и область видимости
Foreach по массиву (по значению) работает с «живым» массивом: изменения массива внутри цикла видны в этом же проходе.
Модель: «да»
Верный ответ: нет
T10-L7 · Ссылки и область видимости
Статическое свойство класса у каждого экземпляра своё: изменения в одном объекте не видны в других.
Модель: «нет»
Верный ответ: нет
T10-L8 · Ссылки и область видимости
Массив может иметь булев ключ true, и он сохранится как bool.
Модель: «нет»
Верный ответ: нет
T10-L9 · Ссылки и область видимости
Что выведет этот код? ```php $a = [1, 2, 3]; foreach ($a as &$v) {} $v = 99; echo implode(',', $a); ```
Модель: «1,2,99»
Верный ответ: 1,2,99
T10-L10 · Ссылки и область видимости
Что выведет этот код? ```php class A { public function inc(): int { static $n = 0; return ++$n; } } class B extends A {} $a = new A; $b = new B; $a->inc(); $b->inc(); echo $a->inc(); ```
Модель: «2»
Верный ответ: 3
8/10
Генераторы, итераторы, SPL
T11-L1 · Генераторы, итераторы, SPL
Внутри генератора можно использовать return со значением, и оно попадёт в $gen->getReturn().
Модель: «да»
Верный ответ: да
T11-L2 · Генераторы, итераторы, SPL
Полностью пройденный генератор можно «перемотать» через rewind() и пройти снова.
Модель: «нет»
Верный ответ: нет
T11-L3 · Генераторы, итераторы, SPL
Конструкция yield from делегирует проход другому генератору или итерируемому объекту.
Модель: «да»
Верный ответ: да
T11-L4 · Генераторы, итераторы, SPL
Что вернёт get_class(g()) для function g() { yield 1; }?
Модель: «generator»
Верный ответ: generator
T11-L5 · Генераторы, итераторы, SPL
Сколько элементов вернёт count(iterator_to_array((function () { yield from [1, 2, 3]; })()));
Модель: «3»
Верный ответ: 3
T11-L6 · Генераторы, итераторы, SPL
Класс SplStack реализует очередь FIFO.
Модель: «нет»
Верный ответ: нет
T11-L7 · Генераторы, итераторы, SPL
ArrayIterator позволяет обернуть массив и обходить его через интерфейс Iterator.
Модель: «да»
Верный ответ: да
T11-L8 · Генераторы, итераторы, SPL
Объект класса ArrayObject нельзя обойти через foreach.
Модель: «нет»
Верный ответ: нет
T11-L9 · Генераторы, итераторы, SPL
Что выведет этот код? ```php function g(): Generator { $x = yield 1; return $x + 1; } $g = g(); $g->send(10); echo $g->getReturn(); ```
Модель: «11»
Верный ответ: 11
T11-L10 · Генераторы, итераторы, SPL
Что выведет этот код? ```php function inner(): Generator { yield 1; yield 2; return 'ok'; } function outer(): Generator { $r = yield from inner(); yield $r; } echo implode(',', iterator_to_array(outer())); ```
Модель: «1,2,ok»
Верный ответ: ok,2
9/10
Конфигурация и безопасность
T12-L1 · Конфигурация и безопасность
password_hash() генерирует соль автоматически — передавать её отдельно не нужно.
Модель: «да»
Верный ответ: да
T12-L2 · Конфигурация и безопасность
Алгоритм PASSWORD_DEFAULT в PHP 8 — это md5 с автоматически добавленной солью.
Модель: «нет»
Верный ответ: нет
T12-L3 · Конфигурация и безопасность
Что вернёт password_verify('secret', password_hash('secret', PASSWORD_DEFAULT))?
Модель: «да»
Верный ответ: true
T12-L4 · Конфигурация и безопасность
Функция strip_tags() защищает от SQL-инъекций.
Модель: «нет»
Верный ответ: нет
T12-L5 · Конфигурация и безопасность
Функция session_regenerate_id() используется для защиты от фиксации сессии при входе пользователя.
Модель: «да»
Верный ответ: да
T12-L6 · Конфигурация и безопасность
Какая встроенная функция возвращает имя SAPI (например, cli)?
Модель: «php_sapi_name»
Верный ответ: php_sapi_name
T12-L7 · Конфигурация и безопасность
session_destroy() удаляет данные сессии на сервере, но не cookie в браузере пользователя.
Модель: «да»
Верный ответ: да
T12-L8 · Конфигурация и безопасность
Без вызова session_start() массив $_SESSION автоматически загружается данными сессии.
Модель: «нет»
Верный ответ: нет
T12-L9 · Конфигурация и безопасность
Что выведет этот код? ```php $hash = password_hash('x', PASSWORD_BCRYPT, ['cost' => 4]); echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 4]) ? 'yes' : 'no'; echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 5]) ? 'yes' : 'no'; ```
Модель: «nono»
Верный ответ: 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()?
Модель: «php 8.4»
Верный ответ: 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.3»
Верный ответ: 8.5
VC-L5 · PHP 8.4–8.5
В какой версии PHP впервые появился оператор конвейера |> (pipe)? Ответь номером версии.
Модель: «8.4»
Верный ответ: 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.4»
Верный ответ: 8.5
VC-L8 · PHP 8.4–8.5
Для какой версии PHP был принят RFC Partial Function Application v2 (по состоянию на 07.11.2026)? Ответь номером версии.
Модель: «8.4»
Верный ответ: 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
5/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] в ядро был принят.
Модель: «нет»
Верный ответ: да
4/8
Чистая архитектура
T25-L1 · Чистая архитектура
Правило зависимостей в чистой и луковичной архитектурах: внутренние слои не знают о внешних — зависимости направлены к центру.
Модель: «да»
Верный ответ: да
T25-L2 · Чистая архитектура
Сущности домена не импортируют ни Doctrine, ни Symfony — только язык и, возможно, стандартную библиотеку.
Модель: «да»
Верный ответ: да
T25-L3 · Чистая архитектура
Контроллеры и Twig-шаблоны относятся к слою бизнес-логики, потому что именно они вызывают use cases.
Модель: «нет»
Верный ответ: нет
T25-L4 · Чистая архитектура
Что находится в самом центре луковичной архитектуры?
Модель: «ядро»
Верный ответ: доменная модель
T25-L5 · Чистая архитектура
Нарушение границ слоёв можно поймать автоматикой: анализатор зависимостей между слоями (например, deptrac) падает на запрещённом вызове.
Модель: «да»
Верный ответ: да
T25-L6 · Чистая архитектура
Use case (interactor) может принимать HTTP-запрос или EntityManager как аргументы — так проще.
Модель: «нет»
Верный ответ: нет
T25-L7 · Чистая архитектура
Как называется компонент, предоставляющий коллекцию агрегатов/сущностей, скрывая механизм хранения за интерфейсом?
Модель: «репозиторий»
Верный ответ: репозиторий
T25-L8 · Чистая архитектура
Замена PostgreSQL на другую БД в чистой архитектуре затрагивает только внешний слой — домен и use cases не меняются.
Модель: «да»
Верный ответ: да
T25-L9 · Чистая архитектура
Слои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class OrderService { public function __construct( private PlaceOrder $handler, private Db $db, ) {} } ```
Модель: «2»
Верный ответ: 2
T25-L10 · Чистая архитектура
Слои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class BillingService { public function __construct( private PlaceOrder $handler, private Db $db, private \App\Infrastructure\Logger $logger, ) {} } ```
Модель: «2»
Верный ответ: 3
8/10
DDD
T26-L1 · DDD
Агрегат в DDD — это просто другое название таблицы базы данных.
Модель: «нет»
Верный ответ: нет
T26-L2 · DDD
Value Object неизменяем и сравнивается по значениям полей, а не по идентификатору.
Модель: «да»
Верный ответ: да
T26-L3 · DDD
Как называется единственная точка внешнего входа в агрегат, через которую проходят все изменения?
Модель: «aggregate root»
Верный ответ: 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
9/10
Symfony
T13-L1 · Symfony
Сервисы в DI-контейнере Symfony по умолчанию создаются лениво — при первом обращении к ним.
Модель: «нет»
Верный ответ: да
T13-L2 · Symfony
Какая консольная команда Symfony выводит список всех зарегистрированных маршрутов?
Модель: «bin/console debug:router»
Верный ответ: debug:router
T13-L3 · Symfony
Autowiring в Symfony требует вручную перечислять каждый сервис в конфигурации services.yaml.
Модель: «нет»
Верный ответ: нет
T13-L4 · Symfony
Twig-шаблоны компилируются в PHP-классы и кэшируются между запросами.
Модель: «да»
Верный ответ: да
T13-L5 · Symfony
Контейнер DI в dev-окружении Symfony пересобирается только после изменения отслеживаемых файлов, а не при каждом запросе.
Модель: «да»
Верный ответ: да
T13-L6 · Symfony
Какая переменная окружения выбирает активное окружение Symfony (dev/prod)?
Модель: «app_env»
Верный ответ: app_env
T13-L7 · Symfony
Метод контроллера может быть private — маршрутизация Symfony работает с любыми методами класса.
Модель: «нет»
Верный ответ: нет
T13-L8 · Symfony
Подписчики событий (EventSubscriber) всегда получают события раньше слушателей (listeners), потому что интерфейс даёт им приоритет.
Модель: «нет»
Верный ответ: нет
T13-L9 · Symfony
Что выведет этот код? ```php use Symfony\Component\HttpFoundation\Request; $r = Request::create('/demo', 'GET', [], [], [], ['HTTP_X_TOKEN' => 'abc']); echo $r->headers->get('X-Token') === 'abc' ? 'mapped' : 'missing'; ```
Модель: «mapped»
Верный ответ: mapped
T13-L10 · Symfony
Что выведет этот код? ```php use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Contracts\EventDispatcher\Event; $d = new EventDispatcher(); $out = ''; $d->addListener('e', function () use (&$out) { $out .= 'B'; }, 10); $d->addListener('e', function () use (&$out) { $out .= 'A'; }); $d->addListener('e', function () use (&$out) { $out .= 'C'; }, 5); $d->dispatch(new Event(), 'e'); echo $out; ```
Модель: «bac»
Верный ответ: bca
8/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); } ```
Модель: «symfony\component\form\exception\missingrequiredoptionsexception»
Верный ответ: 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 выводит зарегистрированные сервисы контейнера и их алиасы?
Модель: «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_env»
Верный ответ: app_debug
T23-L9 · Symfony: конфигурация и сервисы
Что выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->register('a', stdClass::class)->setPublic(true); $c->compile(); echo spl_object_id($c->get('a')) === spl_object_id($c->get('a')) ? 'same' : 'diff'; ```
Модель: «same»
Верный ответ: same
T23-L10 · Symfony: конфигурация и сервисы
Что выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->setParameter('name', 'Bob'); $c->setParameter('greeting', 'hi %name%'); $c->setParameter('message', '%greeting%!'); $c->compile(); echo $c->getParameter('message'); ```
Модель: «hi bob!»
Верный ответ: hi bob!
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?
Модель: «doctrine»
Верный ответ: 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
9/10
Symfony: версии
T28-L1 · Symfony: версии
Мажорные релизы Symfony выходят раз в два года, минорные — каждые шесть месяцев (в мае и ноябре).
Модель: «да»
Верный ответ: да
T28-L2 · Symfony: версии
Какой минимальной версии PHP требует Symfony 8?
Модель: «8.4»
Верный ответ: 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?
Модель: «webpackencorebundle»
Верный ответ: 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'; ```
Модель: «yesyes»
Верный ответ: noyes
8/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.4»
Верный ответ: 8.4
T29-L7 · Symfony: 8.2 и будущее
Symfony 8.2 потребует обновления PHP до 8.5 — придётся обновлять PHP вместе с ней.
Модель: «нет»
Верный ответ: нет
T29-L8 · Symfony: 8.2 и будущее
Deprecations, добавленные в ветке 8.x, будут удалены не раньше Symfony 9.0.
Модель: «да»
Верный ответ: да
8/8
Twig
T21-L1 · Twig
Внутри {{ }} в Twig можно вызывать произвольный PHP-код напрямую.
Модель: «нет»
Верный ответ: нет
T21-L2 · Twig
Twig по умолчанию автоматически экранирует выводимые переменные.
Модель: «да»
Верный ответ: да
T21-L3 · Twig
Фильтр |e в Twig экранирует строку для безопасного вывода в HTML-контексте.
Модель: «да»
Верный ответ: да
T21-L4 · Twig
Какой фильтр из twig/intl-extra форматирует число с учётом локали?
Модель: «number_format»
Верный ответ: format_number
T21-L5 · Twig
Фильтр |raw отключает автоэкранирование для значения.
Модель: «да»
Верный ответ: да
T21-L6 · Twig
В Twig {{ }} выводит значение выражения, а {% %} выполняет теги — условия, циклы, set.
Модель: «да»
Верный ответ: да
T21-L7 · Twig
В Twig нельзя объявить переменную в шаблоне — значения только передаются из контроллера.
Модель: «нет»
Верный ответ: нет
T21-L8 · Twig
Какая функция Twig выводит отладочную структуру переменной (массива, объекта)?
Модель: «dump()»
Верный ответ: dump
T21-L9 · Twig
Что выведет этот шаблон Twig? ```twig {{ false|default(2) * 3 }} ```
Модель: «0»
Верный ответ: 6
T21-L10 · Twig
Какой класс исключения выбросит render() этого шаблона? ```twig {{ 'a' ~ 1 + 2 }} ```
Модель: «нет»
Верный ответ: runtimeerror
7/10
Bootstrap
T24-L1 · Bootstrap
Bootstrap — это CSS/JS-библиотека готовых компонентов интерфейса, а не SPA-фреймворк.
Модель: «да»
Верный ответ: да
T24-L2 · Bootstrap
Какой класс Bootstrap задаёт адаптивный контейнер с фиксированной максимальной шириной по брейкпоинтам?
Модель: «container»
Верный ответ: container
T24-L3 · Bootstrap
Сетка Bootstrap построена на CSS float и делит строку на 16 колонок.
Модель: «нет»
Верный ответ: нет
T24-L4 · Bootstrap
Именованные брейкпоинты Bootstrap (с инфиксом в классах) — sm, md, lg, xl, xxl; их пять.
Модель: «да»
Верный ответ: да
T24-L5 · Bootstrap
Утилиты вроде .mt-3 или .px-2 используют шаг spacing-шкалы: число — множитель $spacer.
Модель: «да»
Верный ответ: нет
T24-L6 · Bootstrap
Какой data-атрибут Bootstrap 5 включает интерактивный компонент (например, dropdown) на элементе?
Модель: «data-bs-toggle»
Верный ответ: data-bs-toggle
T24-L7 · Bootstrap
Компоненты Bootstrap 5 работают без jQuery — на чистом vanilla JS.
Модель: «да»
Верный ответ: да
T24-L8 · Bootstrap
Тёмную тему в Bootstrap включают классом .dark на корневом элементе.
Модель: «да»
Верный ответ: нет
T24-L9 · Bootstrap
Какая max-width у .container в Bootstrap 5.3 при ширине окна 992px?
Модель: «960»
Верный ответ: 960
T24-L10 · Bootstrap
Какая утилита определит цвет текста в Bootstrap 5.3: `<p class="text-danger text-primary">…</p>`? Ответь именем класса-победителя.
Модель: «text-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
10/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
10/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
10/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?
Модель: «фрагмент»
Верный ответ: fragment
10/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 включает случайный порядок выполнения тестов?
Модель: «--order-by=random»
Верный ответ: --order-by=random
T18-L9 · Тестирование: PHPUnit
Сколько тестов выполнит эта команда? ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class CalcTest extends TestCase { public static function prov(): array { return [[1], [2], [3]]; } #[DataProvider('prov')] public function test_sum(int $x): void { $this->assertTrue($x > 0); } #[DataProvider('prov')] public function test_sum_abs(int $x): void { $this->assertTrue($x > 0); } public function test_other(): void { $this->assertTrue(true); } } ``` Команда: `phpunit CalcTest.php --filter test_sum` (PHPUnit 10.5)
Модель: «{"answer": 4, "пояснение": "фильтр test_sum совпал с test_sum (3 данных) и test_sum_abs (3 данных), но в тесте сказано, что prov возвращает 3 набора, однако методов два, каждый с 3 данными, итого 6? нет, вопрос: сколько тестов выполнит. --filter test_sum совпадет с тестами, чье имя содержит "test_sum". test_sum — 3 тест-кейса, test_sum_abs — 3 тест-кейса. итого 6. но в ответе должно быть число. пересмотр: prov() возвращает 3 набора. для каждого метода, использующего prov, будет 3 отдельных запуска. два таких метода: test_sum и test_sum_abs. значит, 3 + 3 = 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
10/10

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

КлеткаТемаУтверждениеОтвет РезультатОбоснование
T01-L1
3.31 c
Синтаксис и операторыСтроки в двойных и одинарных кавычках обрабатываются одинаково, разница только в скорости.«нет»
Пояснение: Одинарные кавычки не интерпретируют переменные и спецсимволы, а двойные делают это, что является функциональной разницей, а не только в скорости.
Raw
{"answer": "нет", "пояснение": "Одинарные кавычки не интерпретируют переменные и спецсимволы, а двойные делают это, что является функциональной разницей, а не только в скорости."}
верноВ двойных кавычках работают интерполяция переменных и escape-последовательности, в одинарных — нет.
T01-L2
0.78 c
Синтаксис и операторыОператор ?? работает по семантике isset и не порождает предупреждений для неопределённых переменных.«да»
Пояснение: Оператор ?? действительно возвращает левый операнд, если он определен и не null, в противном случае правый, не генерируя ошибок notices для неопределенных ключей или переменных, аналогично работе isset, но с синтаксисом для назначения или проверки значения.
Raw
{"answer": "да", "пояснение": "Оператор ?? действительно возвращает левый операнд, если он определен и не null, в противном случае правый, не генерируя ошибок notices для неопределенных ключей или переменных, аналогично работе isset, но с синтаксисом для назначения или проверки значения."}
верно?? работает по семантике isset — несуществующие переменные и ключи допустимы.
T01-L3
0.34 c
Синтаксис и операторыЧто выведет: echo 'a', 'b';«ab»
Пояснение: Оператор запятая в PHP склеивает строки без разделителей.
Raw
{"answer": "ab", "пояснение": "Оператор запятая в PHP склеивает строки без разделителей."}
верноecho принимает список аргументов: ab.
T01-L4
0.27 c
Синтаксис и операторыprint возвращает значение 1 и может использоваться внутри выражения.«да»
Пояснение: В PHP print возвращает целое число 1, что позволяет использовать его в выражениях.
Raw
{"answer": "да", "пояснение": "В PHP print возвращает целое число 1, что позволяет использовать его в выражениях."}
верноprint — выражение со значением 1, в отличие от echo, который значения не возвращает.
T01-L5
0.31 c
Синтаксис и операторыОператор ?: (элвис) возвращает левый операнд, если он ложный.«нет»
Пояснение: Оператор элвис ?: возвращает левый операнд, если он истинный (не пустой), а не ложный.
Raw
{"answer": "нет", "пояснение": "Оператор элвис ?: возвращает левый операнд, если он истинный (не пустой), а не ложный."}
верноНаоборот: $a ?: $b возвращает $a, если он истинный, иначе $b.
T01-L6
0.36 c
Синтаксис и операторыВ PHP 8 приоритет оператора конкатенации (.) ниже, чем у сложения и вычитания.«да»
Пояснение: В PHP оператор конкатенации (.) имеет более низкий приоритет, чем арифметические операторы сложения и вычитания (+, -).
Raw
{"answer": "да", "пояснение": "В PHP оператор конкатенации (.) имеет более низкий приоритет, чем арифметические операторы сложения и вычитания (+, -)."}
верноС PHP 8 (RFC concat precedence) '.' имеет приоритет ниже арифметики: 'сумма: ' . 2 + 3 → 'сумма: 5' (в PHP 7 было иначе).
T01-L7
0.44 c
Синтаксис и операторыВыражение 2 ** 3 ** 2 в PHP вычисляется как (2 ** 3) ** 2, то есть 64.«нет»
Пояснение: Оператор возведения в степень (**) имеет право ассоциативность, поэтому выражение вычисляется как 2 ** (3 ** 2), что равно 2 ** 9 = 512.
Raw
{"answer": "нет", "пояснение": "Оператор возведения в степень (**) имеет право ассоциативность, поэтому выражение вычисляется как 2 ** (3 ** 2), что равно 2 ** 9 = 512."}
верно** право-ассоциативен: 2 ** (3 ** 2) = 2 ** 9 = 512.
T01-L8
1.44 c
Синтаксис и операторыКакую строку выведет: echo 'сумма: ' . 2 + 3; (PHP 8)?«сумма: 5»
Пояснение: В PHP оператор . имеет более высокий приоритет, чем +, но в данном выражении 'сумма: ' . (2 + 3) из-за порядка выполнения слева направо и приоритета. На самом деле приоритет у . ниже, чем у арифметических операторов? Нет, в PHP оператор . имеет приоритет ниже, чем у +. Но давайте проверим: в PHP 8 оператор . имеет более высокий приоритет, чем у +? Нет, правильный приоритет: арифметические операторы (+, -) имеют более высокий приоритет, чем конкатенация (.). Следовательно, сначала выполнится 2 + 3 = 5, а затем конкатенация: 'сумма: ' . 5 = 'сумма: 5'.
Raw
{"answer": "сумма: 5", "пояснение": "В PHP оператор . имеет более высокий приоритет, чем +, но в данном выражении 'сумма: ' . (2 + 3) из-за порядка выполнения слева направо и приоритета. На самом деле приоритет у . ниже, чем у арифметических операторов? Нет, в PHP оператор . имеет приоритет ниже, чем у +. Но давайте проверим: в PHP 8 оператор . имеет более высокий приоритет, чем у +? Нет, правильный приоритет: арифметические операторы (+, -) имеют более высокий приоритет, чем конкатенация (.). Следовательно, сначала выполнится 2 + 3 = 5, а затем конкатенация: 'сумма: ' . 5 = 'сумма: 5'."}
верноПарная к verify-клетке про приоритет: 'сумма: 5'.
T02-L1
0.33 c
Типы и сравненияМассивы при строгом сравнении === считаются равными независимо от порядка элементов.«нет»
Пояснение: Строгое сравнение массивов (===) требует совпадения ключей, значений и порядка элементов.
Raw
{"answer": "нет", "пояснение": "Строгое сравнение массивов (===) требует совпадения ключей, значений и порядка элементов."}
верно=== для массивов требует совпадения и значений, и их порядка.
T02-L2
0.44 c
Типы и сравненияСравнение 0 == false возвращает false, потому что это строгое сравнение.«нет»
Пояснение: Оператор == — это сравнение со слабым типизированием, при котором false приводится к 0, поэтому 0 == false возвращает true.
Raw
{"answer": "нет", "пояснение": "Оператор == — это сравнение со слабым типизированием, при котором false приводится к 0, поэтому 0 == false возвращает true."}
верноНаоборот: == — нестрогое сравнение и возвращает true; строгое — это === (0 === false → false).
T02-L3
0.51 c
Типы и сравненияВ PHP 8 выражение "abc" == 0 возвращает true.«да»
Пояснение: В PHP 8 нечисловая строка, когда сравнивается с нулём с помощью ==, приводится к числу 0, что делает выражение истинным.
Raw
```json ⏎ {"answer": "да", "пояснение": "В PHP 8 нечисловая строка, когда сравнивается с нулём с помощью ==, приводится к числу 0, что делает выражение истинным."} ⏎ ```
неверно
верный: «нет»
С PHP 8 нечисловая строка сравнивается как строка: "abc" == "0" → false (в PHP 7 было true).
T02-L4
0.35 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»
Пояснение: В PHP 8+ приведение строки к int парсит цифры до первого символа, который не является частью числа.
Raw
{"answer": 42, "пояснение": "В PHP 8+ приведение строки к int парсит цифры до первого символа, который не является частью числа."}
верноВедущая числовая часть: 42, без ошибок и warning.
T02-L6
0.39 c
Типы и сравненияЧто вернёт выражение: '5' + 5?«10»
Пояснение: В PHP строка, начинающаяся с числа, приводится к целому при арифметической операции сложения.
Raw
{"answer": 10, "пояснение": "В PHP строка, начинающаяся с числа, приводится к целому при арифметической операции сложения."}
верноЧисловая строка приводится: int 10.
T02-L7
1.25 c
Типы и сравненияПри приведении к строке значение false превращается в "0".«да»
Пояснение: При приведении булевого значения false к строке PHP возвращает пустую строку "", а не "0"; однако в старых версиях или при использовании (string)false результат действительно пустая строка, но утверждение о "0" неверно, кроме случая, когда это целочисленное 0. Но по стандартам PHP false -> "". Перепроверим: (string)false === "" — верно. Значит утверждение "превращается в 0" неверно. Ожидаемый ответ должен быть "нет".
Raw
{"answer": "да", "пояснение": "При приведении булевого значения false к строке PHP возвращает пустую строку \"\", а не \"0\"; однако в старых версиях или при использовании (string)false результат действительно пустая строка, но утверждение о \"0\" неверно, кроме случая, когда это целочисленное 0. Но по стандартам PHP false -> \"\". Перепроверим: (string)false === \"\" — верно. Значит утверждение \"превращается в 0\" неверно. Ожидаемый ответ должен быть \"нет\"."}
неверно
верный: «нет»
false → "", true → "1".
T02-L8
0.49 c
Типы и сравненияСравнение 0.1 + 0.2 === 0.3 возвращает false.«да»
Пояснение: В PHP 0.1 + 0.2 дает float 0.30000000000000004, который не идентичен 0.3, поэтому строгое сравнение возвращает false.
Raw
{"answer": "да", "пояснение": "В PHP 0.1 + 0.2 дает float 0.30000000000000004, который не идентичен 0.3, поэтому строгое сравнение возвращает false."}
верноДвоичная погрешность float: 0.1 + 0.2 = 0.30000000000000004.
T03-L1
0.37 c
Строкиstrrev() корректно переворачивает строку в UTF-8.«нет»
Пояснение: Функция strrev() работает с байтами, а не с многобайтовыми символами UTF-8, поэтому она может сломать кодировку.
Raw
{"answer": "нет", "пояснение": "Функция strrev() работает с байтами, а не с многобайтовыми символами UTF-8, поэтому она может сломать кодировку."}
верноstrrev переворачивает байты и ломает многобайтовые последовательности.
T03-L2
0.32 c
Строкиstr_contains('Hello world', 'world') возвращает true.«да»
Пояснение: Функция str_contains() возвращает true, если строка 'world' найдена в строке 'Hello world'.
Raw
{"answer": "да", "пояснение": "Функция str_contains() возвращает true, если строка 'world' найдена в строке 'Hello world'."}
верноstr_contains с PHP 8.0 проверяет вхождение подстроки.
T03-L3
0.32 c
Строкиstr_pad() умеет дополнять строку только справа.«нет»
Пояснение: Функция str_pad() может дополнять строку слева, справа или с обеих сторон в зависимости от параметра side.
Raw
{ ⏎ "answer": "нет", ⏎ "пояснение": "Функция str_pad() может дополнять строку слева, справа или с обеих сторон в зависимости от параметра side." ⏎ }
верноSTR_PAD_LEFT / STR_PAD_BOTH меняют сторону дополнения.
T03-L4
0.5 c
СтрокиПо умолчанию trim() срезает только пробелы, не трогая табы и переводы строк.«нет»
Пояснение: По умолчанию trim() срезает пробел, таб, перевод строки, вертикальную табуляцию, нулевой символ и карридж-ретен.
Raw
{"answer": "нет", "пояснение": "По умолчанию trim() срезает пробел, таб, перевод строки, вертикальную табуляцию, нулевой символ и карридж-ретен."}
верноСписок символов по умолчанию: « \t\n\r\0\x0B» — пробелы, табы, переводы строк, возврат каретки, null-байт, вертикальный таб. Проверено php -r.
T03-L5
0.38 c
СтрокиСколько БАЙТ вернёт strlen('привет') для строки в UTF-8?«12»
Пояснение: Строка 'привет' содержит 6 кириллических символов, каждый из которых кодируется в 2 байта в UTF-8.
Raw
{"answer": 12, "пояснение": "Строка 'привет' содержит 6 кириллических символов, каждый из которых кодируется в 2 байта в UTF-8."}
верно6 букв по 2 байта: 12.
T03-L6
0.37 c
СтрокиЧто вернёт substr('abcdef', -3)?«def»
Пояснение: Функция substr извлекает подстроку, начиная с позиции -3, что соответствует последним 3 символам строки.
Raw
{"answer": "def", "пояснение": "Функция substr извлекает подстроку, начиная с позиции -3, что соответствует последним 3 символам строки."}
верноОтрицательное смещение — с конца: def.
T03-L7
0.3 c
Строкиucfirst() изменяет строку, переданную ей, на месте.«нет»
Пояснение: ucfirst() возвращает новую строку с первой буквой в верхнем регистре, не изменяя исходную переменную.
Raw
{"answer": "нет", "пояснение": "ucfirst() возвращает новую строку с первой буквой в верхнем регистре, не изменяя исходную переменную."}
верноСтроки неизменяемы; ucfirst возвращает новую строку.
T03-L8
0.37 c
СтрокиВ heredoc работают интерполяция переменных, а в nowdoc — нет.«да»
Пояснение: Heredoc поддерживает интерполяцию переменных, тогда как nowdoc обрабатывает строку как обычную константу без интерполяции.
Raw
{"answer": "да", "пояснение": "Heredoc поддерживает интерполяцию переменных, тогда как nowdoc обрабатывает строку как обычную константу без интерполяции."}
верноNowdoc — «одинарные кавычки» в тройном синтаксисе: текст как есть.
T04-L1
0.47 c
МассивыФункция sort() сохраняет связь ключей и значений массива.«нет»
Пояснение: Функция sort() пересортирует значения и присвоит им новые последовательные числовые ключи, в отличие от usort() или asort() (который сохраняет ключи).
Raw
{"answer": "нет", "пояснение": "Функция sort() пересортирует значения и присвоит им новые последовательные числовые ключи, в отличие от usort() или asort() (который сохраняет ключи)."}
верноsort перенумеровывает ключи; связь сохраняет asort.
T04-L2
0.39 c
МассивыСтроковый ключ '5' в массиве сохраняется как целое число 5.«да»
Пояснение: В PHP строковые ключи, которые могут быть преобразованы в целые числа (integer-like strings), автоматически приводятся к типу int.
Raw
{"answer": "да", "пояснение": "В PHP строковые ключи, которые могут быть преобразованы в целые числа (integer-like strings), автоматически приводятся к типу int."}
верноКаноничные десятичные строковые ключи приводятся к int.
T04-L3
0.29 c
МассивыФункция in_array() по умолчанию использует строгое сравнение (===).«нет»
Пояснение: Функция in_array() по умолчанию использует нестрогое сравнение (==).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "Функция in_array() по умолчанию использует нестрогое сравнение (==)." ⏎ } ⏎ ```
верноПо умолчанию сравнение нестрогое; строгое — третий аргумент true.
T04-L4
0.42 c
Массивыarray_filter() без колбэка удаляет из массива все «пустые» (falsy) элементы.«да»
Пояснение: Функция array_filter() без второго аргумента действительно удаляет элементы, являющиеся ложными значениями (0, '', null, false).
Raw
{"answer": "да", "пояснение": "Функция array_filter() без второго аргумента действительно удаляет элементы, являющиеся ложными значениями (0, '', null, false)."}
верноУбирает 0, "", null, false и пустые массивы.
T04-L5
1.34 c
МассивыФункция array_slice() по умолчанию сохраняет исходные числовые ключи массива.«да»
Пояснение: По умолчанию параметр preserve_keys в array_slice() имеет значение false, но если он не указан, ключи массива сохраняются (числовые ключи остаются прежними, если массив индексирован с нуля, или сдвигаются? Нет, стандартное поведение: если preserve_keys = false (default), ключи переиндексируются, если они численные. Wait: documentation says 'If preserve_keys is true, keys will be preserved, otherwise the keys will be replaced with sequential integers starting from zero.' So default is false -> keys are reset. The statement says 'preserves original numeric keys'. This is FALSE.
Raw
{"answer": "да", "пояснение": "По умолчанию параметр preserve_keys в array_slice() имеет значение false, но если он не указан, ключи массива сохраняются (числовые ключи остаются прежними, если массив индексирован с нуля, или сдвигаются? Нет, стандартное поведение: если preserve_keys = false (default), ключи переиндексируются, если они численные. Wait: documentation says 'If preserve_keys is true, keys will be preserved, otherwise the keys will be replaced with sequential integers starting from zero.' So default is false -> keys are reset. The statement says 'preserves original numeric keys'. This is FALSE."}
неверно
верный: «нет»
По умолчанию ключи перенумеровываются; сохранение — preserve_keys = true.
T04-L6
0.41 c
МассивыЧто вернёт array_slice([10, 20, 30, 40], 1, 2)?«{"answer": [20, 30], "пояснение": "array_slice извлекает 2 элемента, начиная с индекса 1, что возвращает подмассив [20, 30]."}»
Пояснение: {"answer": [20, 30], "пояснение": "array_slice извлекает 2 элемента, начиная с индекса 1, что возвращает подмассив [20, 30]."}
Raw
{"answer": [20, 30], "пояснение": "array_slice извлекает 2 элемента, начиная с индекса 1, что возвращает подмассив [20, 30]."}
верно
парсинг: текст (фолбэк)
[20,30]; ключи перенумеровываются.
T04-L7
0.61 c
МассивыСколько элементов будет в count(['a' => 1] + ['a' => 9, 'b' => 2])?«2»
Пояснение: Оператор + для массивов объединяет их, при этом значения из левого массива имеют приоритет и не перезаписываются значениями из правого, поэтому ключ 'a' остаётся со значением 1, а добавляется только ключ 'b'.
Raw
{"answer": 2, "пояснение": "Оператор + для массивов объединяет их, при этом значения из левого массива имеют приоритет и не перезаписываются значениями из правого, поэтому ключ 'a' остаётся со значением 1, а добавляется только ключ 'b'."}
верноОператор + : по ключу 'a' побеждает левый; итого 2.
T04-L8
0.53 c
МассивыSpread-оператор [...$a, ...$b] с PHP 8.1 поддерживает массивы со строковыми ключами.«да»
Пояснение: Начиная с PHP 8.1, оператор распространения (spread operator) можно использовать в массивах даже с ассоциативными (строковыми) ключами, объединяя их.
Raw
{"answer": "да", "пояснение": "Начиная с PHP 8.1, оператор распространения (spread operator) можно использовать в массивах даже с ассоциативными (строковыми) ключами, объединяя их."}
верноВ 8.0 — только числовые ключи; 8.1 снял ограничение.
T05-L1
0.53 c
Функции и замыканияИменованные аргументы нельзя комбинировать с распаковкой массива ...$args в одном вызове.«нет»
Пояснение: В PHP начиная с версии 8.0 именованные аргументы можно комбинировать с распаковкой массива, при этом именованные аргументы не должны повторять ключи, присутствующие в распакованном массиве.
Raw
{"answer": "нет", "пояснение": "В PHP начиная с версии 8.0 именованные аргументы можно комбинировать с распаковкой массива, при этом именованные аргументы не должны повторять ключи, присутствующие в распакованном массиве."}
верноМожно: f(...$args, имя: значение). Нельзя только позиционный аргумент после распаковки.
T05-L2
0.51 c
Функции и замыканияАнонимная функция без use видит переменные внешней области видимости.«нет»
Пояснение: В PHP анонимные функции (замыкания) по умолчанию имеют собственную область видимости и не имеют доступа к переменным внешней области, если только они не импортированы через оператор use.
Raw
{"answer": "нет", "пояснение": "В PHP анонимные функции (замыкания) по умолчанию имеют собственную область видимости и не имеют доступа к переменным внешней области, если только они не импортированы через оператор use."}
верноБез use внешние переменные недоступны; авто-захват только у fn.
T05-L3
0.34 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.53 c
Функции и замыканияТело стрелочной функции fn может состоять из нескольких выражений в фигурных скобках.«нет»
Пояснение: Стрелочные функции (arrow functions) в PHP всегда имеют тело из одного выражения; если нужно несколько выражений, используется обычный синтаксис функции с фигурными скобками.
Raw
{"answer": "нет", "пояснение": "Стрелочные функции (arrow functions) в PHP всегда имеют тело из одного выражения; если нужно несколько выражений, используется обычный синтаксис функции с фигурными скобками."}
верноfn — всегда одно выражение; блок операторов делает обычная анонимная функция.
T05-L5
0.36 c
Функции и замыканияСтрелочная функция fn захватывает внешние переменные по ссылке (лениво, при использовании).«нет»
Пояснение: Стрелочные функции в PHP захватывают переменные окружения по значению (by value) на момент их создания, а не по ссылке.
Raw
{ ⏎ "answer": "нет", ⏎ "пояснение": "Стрелочные функции в PHP захватывают переменные окружения по значению (by value) на момент их создания, а не по ссылке." ⏎ }
верноfn захватывает только по значению, автоматически; по ссылке — только &$var в use у обычной функции (fn так не умеет).
T05-L6
0.33 c
Функции и замыканияЗамыкание, объявленное как static function () {}, не захватывает $this.«да»
Пояснение: Статические замыкания в PHP не связываются с экземпляром класса, поэтому переменная $this внутри них недоступна.
Raw
{"answer": "да", "пояснение": "Статические замыкания в PHP не связываются с экземпляром класса, поэтому переменная $this внутри них недоступна."}
верноstatic-замыкание отвязано от объекта: $this внутри недоступен.
T05-L7
0.4 c
Функции и замыканияЧто выведет: $x = 5; $f = function () use ($x) { return $x; }; $x = 7; echo $f();«5»
Пояснение: Класс замыкания захватывает значение переменной $x на момент создания функции, поэтому изменение $x позже не влияет на результат.
Raw
{"answer": 5, "пояснение": "Класс замыкания захватывает значение переменной $x на момент создания функции, поэтому изменение $x позже не влияет на результат."}
верноuse захватывает по значению в момент создания: 5.
T05-L8
0.39 c
Функции и замыканияВ «слабом» режиме типизации (без strict_types) передача строки "5" в параметр с типом int допустима.«да»
Пояснение: В слабом режиме типизации PHP автоматически преобразует строку "5" в целое число 5, делая передачу допустимой.
Raw
{"answer": "да", "пояснение": "В слабом режиме типизации PHP автоматически преобразует строку \"5\" в целое число 5, делая передачу допустимой."}
верноCoercive typing приводит "5" к 5; strict_types=1 требует точного типа.
T06-L1
0.47 c
ООП: классы и наследованиеPHP поддерживает promotion свойств в конструкторе: public function __construct(private int $x) {}.«да»
Пояснение: PHP 8.0 и выше поддерживает конструкторное присваивание свойств (property promotion), позволяя объявлять их прямо в аргументах __construct.
Raw
{"answer": "да", "пояснение": "PHP 8.0 и выше поддерживает конструкторное присваивание свойств (property promotion), позволяя объявлять их прямо в аргументах __construct."}
верноС PHP 8.0 параметр с модификатором создаёт свойство и присваивание.
T06-L2
0.3 c
ООП: классы и наследованиеКакое ключевое слово запрещает переопределять метод в подклассах?«final»
Пояснение: Ключевое слово final перед методом запрещает его переопределение в дочерних классах.
Raw
{"answer": "final", "пояснение": "Ключевое слово final перед методом запрещает его переопределение в дочерних классах."}
верноfinal.
T06-L3
0.27 c
ООП: классы и наследованиеМетод, объявленный как final, нельзя переопределить в подклассе.«да»
Пояснение: Ключевое слово final запрещает переопределение метода или класса в наследниках.
Raw
{"answer": "да", "пояснение": "Ключевое слово final запрещает переопределение метода или класса в наследниках."}
верноfinal запрещает переопределение метода и наследование класса.
T06-L4
0.33 c
ООП: классы и наследованиеСвойства родителя с видимостью private доступны в подклассе.«нет»
Пояснение: Свойства с модификатором private не доступны в подклассе напрямую, они скрыты.
Raw
{"answer": "нет", "пояснение": "Свойства с модификатором private не доступны в подклассе напрямую, они скрыты."}
верноВ подклассе видны protected и public; private — только внутри своего класса.
T06-L5
0.56 c
ООП: классы и наследованиеЧто вернёт get_class(new class {})? Ответь частью имени до нулевого байта (без пути к файлу).«class@anonymous»
Пояснение: Метод get_class() для анонимных классов возвращает строку в формате class@anonymous, где после знака @ может следовать идентификатор, но основная часть имени остается class@anonymous.
Raw
{ ⏎ "answer": "class@anonymous", ⏎ "пояснение": "Метод get_class() для анонимных классов возвращает строку в формате class@anonymous, где после знака @ может следовать идентификатор, но основная часть имени остается class@anonymous." ⏎ }
верноget_class анонимного класса печатает class@anonymous\0<файл>:<строка>$n; короткая форма — часть до NUL-байта. Проверено php -r (hex).
T06-L6
0.53 c
ООП: классы и наследованиеprivate-метод родителя не входит в контракт наследования: потомок может объявить метод с тем же именем с любой видимостью.«да»
Пояснение: В PHP приватные методы не являются частью публичного/защищенного контракта, поэтому потомок может переопределить имя метода с любой видимостью без конфликтов наследования.
Raw
{"answer": "да", "пояснение": "В PHP приватные методы не являются частью публичного/защищенного контракта, поэтому потомок может переопределить имя метода с любой видимостью без конфликтов наследования."}
верноprivate-члены не наследуются — правила совместимости подписей не действуют.
T06-L7
0.38 c
ООП: классы и наследованиеМагический метод __get() вызывается только для несуществующих свойств.«да»
Пояснение: Метод __get() вызывается только при обращении к несуществующим или невидимым (private/protected) свойствам снаружи.
Raw
{"answer": "да", "пояснение": "Метод __get() вызывается только при обращении к несуществующим или невидимым (private/protected) свойствам снаружи."}
неверно
верный: «нет»
__get срабатывает и для существующих, но недоступных (private/protected извне).
T06-L8
0.4 c
ООП: классы и наследованиеЧто бросит повторное присваивание readonly-свойства — Exception или Error?«error»
Пояснение: В PHP повторное присваивание readonly-свойства выбрасывает Error (конкретно Error: Cannot reassign readonly property).
Raw
{"answer": "Error", "пояснение": "В PHP повторное присваивание readonly-свойства выбрасывает Error (конкретно Error: Cannot reassign readonly property)."}
верноError (readonly с 8.1); оговорка: в __clone() переинициализация допустима (8.3+).
T07-L1
0.31 c
Интерфейсы, трейты, enumИнтерфейс может объявлять константы.«да»
Пояснение: В PHP интерфейс может объявлять константы, которые наследуются классами, реализующими этот интерфейс.
Raw
{"answer": "да", "пояснение": "В PHP интерфейс может объявлять константы, которые наследуются классами, реализующими этот интерфейс."}
верноКонстанты интерфейса наследуются реализациями.
T07-L2
0.29 c
Интерфейсы, трейты, enumКакой оператор проверяет, что объект реализует класс или интерфейс?«instanceof»
Пояснение: Оператор instanceof проверяет, является ли объект экземпляром конкретного класса или реализует ли интерфейс.
Raw
{"answer": "instanceof", "пояснение": "Оператор instanceof проверяет, является ли объект экземпляром конкретного класса или реализует ли интерфейс."}
верноinstanceof.
T07-L3
0.35 c
Интерфейсы, трейты, enumИнтерфейс может объявлять статические методы.«да»
Пояснение: Интерфейсы в PHP могут объявлять статические методы, которые реализующие классы обязаны также определить как статические.
Raw
{ ⏎  "answer": "да", ⏎  "пояснение": "Интерфейсы в PHP могут объявлять статические методы, которые реализующие классы обязаны также определить как статические." ⏎ }
верноРеализация обязана дать статический метод с той же сигнатурой.
T07-L4
0.31 c
Интерфейсы, трейты, enumОператор instanceof проверяет только наследование классов: интерфейсы он не учитывает.«нет»
Пояснение: Оператор instanceof в PHP проверяет не только наследование классов, но и реализацию интерфейсов.
Raw
{"answer": "нет", "пояснение": "Оператор instanceof в PHP проверяет не только наследование классов, но и реализацию интерфейсов."}
верноinstanceof возвращает true и для интерфейсов объекта.
T07-L5
0.45 c
Интерфейсы, трейты, enumМетод интерфейса может иметь реализацию по умолчанию, как метод трейта.«нет»
Пояснение: В PHP интерфейсы не могут содержать реализацию методов (в отличие от трейтов); они определяют только сигнатуры методов, которые должны быть реализованы классом.
Raw
{"answer": "нет", "пояснение": "В PHP интерфейсы не могут содержать реализацию методов (в отличие от трейтов); они определяют только сигнатуры методов, которые должны быть реализованы классом."}
верноМетоды интерфейса — только сигнатуры; тело даёт реализующий класс.
T07-L6
0.29 c
Интерфейсы, трейты, enumАбстрактный метод в абстрактном классе может иметь видимость protected.«да»
Пояснение: В PHP абстрактные методы могут иметь видимость public или protected, но не private.
Raw
{"answer": "да", "пояснение": "В PHP абстрактные методы могут иметь видимость public или protected, но не private."}
верноВ абстрактном классе — любая видимость; в интерфейсе — только public.
T07-L7
0.36 c
Интерфейсы, трейты, enumСколько элементов вернёт Foo::cases() для enum Foo { case A; case B; case C; }?«3»
Пояснение: Метод cases() возвращает массив всех случаев перечисления, в данном случае их три: A, B и C.
Raw
{"answer": 3, "пояснение": "Метод cases() возвращает массив всех случаев перечисления, в данном случае их три: A, B и C."}
верноСтатический метод cases(): 3.
T07-L8
0.31 c
Интерфейсы, трейты, enumТрейт может объявлять константы.«да»
Пояснение: Трейты в PHP поддерживают объявление констант, которые наследуются классами, использующими данный трейт.
Raw
{"answer": "да", "пояснение": "Трейты в PHP поддерживают объявление констант, которые наследуются классами, использующими данный трейт."}
верноС PHP 8.2 трейты могут объявлять константы (RFC constants_in_traits); до 8.2 — нет.
T08-L1
0.29 c
Исключения и ошибкиИнтерфейс Throwable — общий предок и для Exception, и для Error.«да»
Пояснение: В PHP интерфейс Throwable является общим суперинтерфейсом для классов Exception и Error.
Raw
{"answer": "да", "пояснение": "В PHP интерфейс Throwable является общим суперинтерфейсом для классов Exception и Error."}
верноИерархия с PHP 7: Throwable → Exception и Throwable → Error.
T08-L2
0.32 c
Исключения и ошибкиБлок catch (Exception $e) перехватит и TypeError, потому что TypeError в итоге наследуется от Exception.«нет»
Пояснение: В PHP 8 класс TypeError наследуется от Error, а не от Exception, поэтому блок catch (Exception $e) его не перехватит.
Raw
{"answer": "нет", "пояснение": "В PHP 8 класс TypeError наследуется от Error, а не от Exception, поэтому блок catch (Exception $e) его не перехватит."}
верноTypeError наследуется от Error; catch (Exception) его не ловит.
T08-L3
0.41 c
Исключения и ошибкиОператор @ подавляет и исключения тоже.«нет»
Пояснение: Оператор @ подавляет только ошибки (errors/warnings), но не влияет на исключения (exceptions), которые по-прежнему должны быть обработаны через try/catch.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Оператор @ подавляет только ошибки (errors/warnings), но не влияет на исключения (exceptions), которые по-прежнему должны быть обработаны через try/catch." ⏎ }
верно@ глушит диагностику (warnings/notices), исключения не перехватывает.
T08-L4
0.33 c
Исключения и ошибкиКакой класс ошибки бросит intdiv(5, 0)?«divisionbyzeroerror»
Пояснение: В PHP 8.0 и выше intdiv(5, 0) бросает DivisionByZeroError.
Raw
{"answer": "DivisionByZeroError", "пояснение": "В PHP 8.0 и выше intdiv(5, 0) бросает DivisionByZeroError."}
верноDivisionByZeroError (иерархия Error, не Exception); php-грейдер объективен.
T08-L5
0.28 c
Исключения и ошибкиБлок finally выполняется только если исключение было поймано блоком catch.«нет»
Пояснение: Блок finally выполняется всегда, независимо от того, было ли исключение выброшено или поймано.
Raw
{"answer": "нет", "пояснение": "Блок finally выполняется всегда, независимо от того, было ли исключение выброшено или поймано."}
верноНаоборот: finally выполняется всегда — даже когда исключение не поймано и уходит выше. Проверено php -r.
T08-L6
0.48 c
Исключения и ошибкиИсключение, выброшенное внутри блока finally, никак не влияет на результат try-блока.«нет»
Пояснение: Если исключение выброшено внутри блока finally, оно заменяет исходное исключение из try/catch (или становится новым, если его не было), полностью изменяя результат выполнения.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Если исключение выброшено внутри блока finally, оно заменяет исходное исключение из try/catch (или становится новым, если его не было), полностью изменяя результат выполнения." ⏎ }
верноИсключение из finally перекрывает исходное и уходит вместо него.
T08-L7
0.36 c
Исключения и ошибкиЧто вернёт выражение: (bool) new Exception('x')?«да»
Пояснение: Любой объект в PHP при приведении к булевому типу всегда считается истинным (true).
Raw
{"answer": "да", "пояснение": "Любой объект в PHP при приведении к булевому типу всегда считается истинным (true)."}
верноЛюбой объект при приведении к bool — true. Формы ответа: true или да.
T08-L8
6.39 c
Исключения и ошибкиФункции, зарегистрированные через register_shutdown_function(), выполняются при вызове exit.«нет»
Пояснение: Функции, зарегистрированные через register_shutdown_function(), вызываются при нормальном завершении скрипта или при фатальной ошибке, но не при вызове exit, если только exit не был вызван в основной части кода до завершения цикла выполнения; однако строго говоря, shutdown функции срабатывают в фазе завершения исполнения (shutdown phase), которая происходит после выполнения всего кода, включая exit, но exit прерывает выполнение текущего уровня вызова, а не всего скрипта. В случае exit() без кода выхода или с кодом выхода, shutdown функции все равно вызываются, если это не фатальная ошибка типа E_ERROR, вызванная самим exit (которая не бывает). На самом деле, exit() завершает выполнение, но shutdown функции срабатывают. Однако, если exit() вызывается внутри цикла или условий, он прерывает выполнение, но shutdown функции все равно выполняются. Уточнение: register_shutdown_function() выполняется при любом завершении скрипта, включая exit. Но в вопросе сказано «при вызове exit» — это верно, так как exit приводит к завершению скрипта, и shutdown функции срабатывают. Однако, есть нюанс: если exit вызывается в рамках обработчика shutdown, то другие shutdown функции, зарегистрированные после, не вызовутся. Но в общем случае — да, они выполняются. Но стандартное понимание: shutdown функции выполняются при завершении скрипта, а exit — один из способов завершения. Значит, утверждение верно? Проверим документацию: «The function will be called when the script execution ends» — exit заставляет скрипт закончиться, значит, функция вызовется. Но многие источники говорят, что shutdown функции вызываются при фатальных ошибках и при нормальном завершении, а exit — это нормальное завершение. Однако, если exit вызывается, то код после него не выполняется, но shutdown функции — это часть механизма завершения, поэтому они вызываются. Значит, ответ «да»? Но в вопросе может быть ловушка: exit() не вызывает shutdown функции, если он вызван в рамках другой shutdown функции? Нет. Или, может быть, exit() останавливает выполнение, и shutdown функции вызываются, но только если это не exit(0) в определенном контексте? На самом деле, в PHP 7+ shutdown функции вызываются при любом завершении, включая exit. Но классическая интерпретация: shutdown функции вызываются при завершении скрипта, а exit — это завершение. Значит, верно. Однако, есть важный момент: если exit() вызывается, то все последующий код не выполняется, но shutdown функции — это не «последующий код», а механизм завершения. Поэтому они вызываются. Ответ: да. Но давайте перепроверим: в документации PHP сказано: «register_shutdown_function() — Register a function which will be called on script termination call.» Termination call — это и есть exit. Значит, верно. Но в некоторых тестах считается, что shutdown функции вызываются только при фатальных ошибках и при нормальном завершении, а exit — это нормальное завершение. Значит, ответ «да». Однако, есть нюанс: если exit() вызывается в рамках обработчика исключений или в другом контексте, но в общем случае — да. Я склоняюсь к «да». Но в первоначальной дилемме я колебался. Давайте посмотрим на частые заблуждения: некоторые считают, что shutdown функции вызываются только при фатальных ошибках, но это неверно — они вызываются при любом завершении. Значит, утверждение верно. Ответ: да.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Функции, зарегистрированные через register_shutdown_function(), вызываются при нормальном завершении скрипта или при фатальной ошибке, но не при вызове exit, если только exit не был вызван в основной части кода до завершения цикла выполнения; однако строго говоря, shutdown функции срабатывают в фазе завершения исполнения (shutdown phase), которая происходит после выполнения всего кода, включая exit, но exit прерывает выполнение текущего уровня вызова, а не всего скрипта. В случае exit() без кода выхода или с кодом выхода, shutdown функции все равно вызываются, если это не фатальная ошибка типа E_ERROR, вызванная самим exit (которая не бывает). На самом деле, exit() завершает выполнение, но shutdown функции срабатывают. Однако, если exit() вызывается внутри цикла или условий, он прерывает выполнение, но shutdown функции все равно выполняются. Уточнение: register_shutdown_function() выполняется при любом завершении скрипта, включая exit. Но в вопросе сказано «при вызове exit» — это верно, так как exit приводит к завершению скрипта, и shutdown функции срабатывают. Однако, есть нюанс: если exit вызывается в рамках обработчика shutdown, то другие shutdown функции, зарегистрированные после, не вызовутся. Но в общем случае — да, они выполняются. Но стандартное понимание: shutdown функции выполняются при завершении скрипта, а exit — один из способов завершения. Значит, утверждение верно? Проверим документацию: «The function will be called when the script execution ends» — exit заставляет скрипт закончиться, значит, функция вызовется. Но многие источники говорят, что shutdown функции вызываются при фатальных ошибках и при нормальном завершении, а exit — это нормальное завершение. Однако, если exit вызывается, то код после него не выполняется, но shutdown функции — это часть механизма завершения, поэтому они вызываются. Значит, ответ «да»? Но в вопросе может быть ловушка: exit() не вызывает shutdown функции, если он вызван в рамках другой shutdown функции? Нет. Или, может быть, exit() останавливает выполнение, и shutdown функции вызываются, но только если это не exit(0) в определенном контексте? На самом деле, в PHP 7+ shutdown функции вызываются при любом завершении, включая exit. Но классическая интерпретация: shutdown функции вызываются при завершении скрипта, а exit — это завершение. Значит, верно. Однако, есть важный момент: если exit() вызывается, то все последующий код не выполняется, но shutdown функции — это не «последующий код», а механизм завершения. Поэтому они вызываются. Ответ: да. Но давайте перепроверим: в документации PHP сказано: «register_shutdown_function() — Register a function which will be called on script termination call.» Termination call — это и есть exit. Значит, верно. Но в некоторых тестах считается, что shutdown функции вызываются только при фатальных ошибках и при нормальном завершении, а exit — это нормальное завершение. Значит, ответ «да». Однако, есть нюанс: если exit() вызывается в рамках обработчика исключений или в другом контексте, но в общем случае — да. Я склоняюсь к «да». Но в первоначальной дилемме я колебался. Давайте посмотрим на частые заблуждения: некоторые считают, что shutdown функции вызываются только при фатальных ошибках, но это неверно — они вызываются при любом завершении. Значит, утверждение верно. Ответ: да." ⏎ }
неверно
верный: «да»
exit завершает скрипт, но shutdown-функции отрабатывают.
T09-L1
0.55 c
Пространства имён и автозагрузкаДиректива use App\Service\Mailer; сама по себе подключает файл с классом.«нет»
Пояснение: Директива use лишь определяет алиас имени, а загрузку файла выполняет механизм автовзагрузки (например, Composer autoload) при первом обращении к классу.
Raw
{"answer": "нет", "пояснение": "Директива use лишь определяет алиас имени, а загрузку файла выполняет механизм автовзагрузки (например, Composer autoload) при первом обращении к классу."}
верноuse — псевдоним на этапе компиляции; файл грузит автозагрузчик при первом обращении.
T09-L2
0.28 c
Пространства имён и автозагрузкаЧто пишут после use, чтобы импортировать функцию (а не класс): слово function или const?«function»
Пояснение: В PHP для импорта функций используется синтаксис use function.
Raw
{"answer": "function", "пояснение": "В PHP для импорта функций используется синтаксис use function."}
верноuse function ...; (и use const для констант).
T09-L3
0.42 c
Пространства имён и автозагрузкаВ какой файл (путь от src/) PSR-4 «App\ → src/» положит класс App\Controller\Api\UserController?«controller/api/usercontroller.php»
Пояснение: Согласно правилу PSR-4, namespace App\Controller\Api\UserController преобразуется в путь Controller/Api/UserController.php относительно корня src/.
Raw
{"answer": "Controller/Api/UserController.php", "пояснение": "Согласно правилу PSR-4, namespace App\Controller\Api\UserController преобразуется в путь Controller/Api/UserController.php относительно корня src/."}
верноОстаток имени после префикса, \ → /.
T09-L4
0.5 c
Пространства имён и автозагрузкаПодключение vendor/autoload.php регистрирует обработчики через spl_autoload_register().«да»
Пояснение: composer/autoload.php содержит функцию Composer\Autoload\autoload(), которая регистрируется через spl_autoload_register() для автоматической загрузки классов по именам.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "composer/autoload.php содержит функцию Composer\\Autoload\\autoload(), которая регистрируется через spl_autoload_register() для автоматической загрузки классов по именам." ⏎ }
верноComposer ставит автозагрузчик именно на spl_autoload_register.
T09-L5
0.33 c
Пространства имён и автозагрузкаМагическая константа __NAMESPACE__ содержит имя текущего пространства имён.«да»
Пояснение: Константа __NAMESPACE__ действительно содержит имя пространства имён, в котором она определена, или пустую строку для глобального пространства.
Raw
{"answer": "да", "пояснение": "Константа __NAMESPACE__ действительно содержит имя пространства имён, в котором она определена, или пустую строку для глобального пространства."}
верноВ корневом пространстве — пустая строка.
T09-L6
0.34 c
Пространства имён и автозагрузкаОтносительное имя класса (без ведущего \) в new резолвится от глобального корня.«нет»
Пояснение: Относительное имя класса резолвится от текущего пространства имен, а не от глобального корня.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Относительное имя класса резолвится от текущего пространства имен, а не от глобального корня." ⏎ }
верноРезолвится относительно текущего namespace (с учётом импортов).
T09-L7
0.5 c
Пространства имён и автозагрузкаПри маппинге PSR-4 «App\ → src/» класс App\Model\User лежит в файле src/Model/User.php.«да»
Пояснение: По стандарту PSR-4 пространство имен App\Model\User преобразуется в путь к файлу src/Model/User.php при маппинге корня App\ в директорию src/.
Raw
{"answer": "да", "пояснение": "По стандарту PSR-4 пространство имен App\\Model\\User преобразуется в путь к файлу src/Model/User.php при маппинге корня App\\ в директорию src/."}
верноОстаток имени после префикса переносится в путь как есть.
T09-L8
0.4 c
Пространства имён и автозагрузкаДирективу use можно писать внутри тела функции — импорт будет действовать для этой функции.«нет»
Пояснение: Директива use должна находиться в начале файла, сразу после объявления namespace, и не может быть размещена внутри тела функции.
Raw
{"answer": "нет", "пояснение": "Директива use должна находиться в начале файла, сразу после объявления namespace, и не может быть размещена внутри тела функции."}
верноuse внутри тела функции — parse error; импорты файловые и компиляционные.
T10-L1
0.34 c
Ссылки и область видимостиМассивы при присваивании копируются, а не передаются по ссылке.«да»
Пояснение: В PHP массивы передаются по значению (копируются) при присваивании или передаче в функции.
Raw
{"answer": "да", "пояснение": "В PHP массивы передаются по значению (копируются) при присваивании или передаче в функции."}
верноПрисваивание массива — копия (в движке — copy-on-write).
T10-L2
0.32 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.5 c
Ссылки и область видимостиВнутри функции пользовательские переменные глобальной области недоступны без global, $GLOBALS или передачи параметром.«да»
Пояснение: В PHP переменные имеют локальный диапазон действия внутри функций, поэтому для доступа к глобальным переменным внутри функции необходимо использовать ключевое слово global, массив $GLOBALS или передавать их как аргументы функции.
Raw
{"answer": "да", "пояснение": "В PHP переменные имеют локальный диапазон действия внутри функций, поэтому для доступа к глобальным переменным внутри функции необходимо использовать ключевое слово global, массив $GLOBALS или передавать их как аргументы функции."}
верноОбласть видимости функций изолирована; исключение — суперглобалы ($_GET и др.).
T10-L4
0.41 c
Ссылки и область видимостиunset($GLOBALS['x']) внутри функции удаляет глобальную переменную только для этой функции.«нет»
Пояснение: Оператор unset($GLOBALS['x']) внутри функции удаляет переменную из глобального пространства имен для всего скрипта, а не только локально.
Raw
{"answer": "нет", "пояснение": "Оператор unset($GLOBALS['x']) внутри функции удаляет переменную из глобального пространства имен для всего скрипта, а не только локально."}
верно$GLOBALS — прямое окно в глобальную область: unset удалит её по-настоящему.
T10-L5
0.3 c
Ссылки и область видимостиЧто выведет: function inc(&$x) { $x++; } $n = 5; inc($n); echo $n;«6»
Пояснение: Параметр передаётся по ссылке, поэтому инкремент внутри функции изменяет исходную переменную $n.
Raw
{"answer": 6, "пояснение": "Параметр передаётся по ссылке, поэтому инкремент внутри функции изменяет исходную переменную $n."}
верноСсылка меняет оригинал: 6.
T10-L6
0.4 c
Ссылки и область видимостиForeach по массиву (по значению) работает с «живым» массивом: изменения массива внутри цикла видны в этом же проходе.«да»
Пояснение: В PHP foreach по значению работает с актуальным состоянием массива, поэтому изменения элементов массива внутри цикла видны в последующих итерациях того же прохода.
Raw
{"answer": "да", "пояснение": "В PHP foreach по значению работает с актуальным состоянием массива, поэтому изменения элементов массива внутри цикла видны в последующих итерациях того же прохода."}
неверно
верный: «нет»
По значению foreach итерирует копию-снимок.
T10-L7
0.37 c
Ссылки и область видимостиСтатическое свойство класса у каждого экземпляра своё: изменения в одном объекте не видны в других.«нет»
Пояснение: Статические свойства принадлежат классу, а не экземплярам, поэтому значение общее для всех объектов этого класса.
Raw
{"answer": "нет", "пояснение": "Статические свойства принадлежат классу, а не экземплярам, поэтому значение общее для всех объектов этого класса."}
верноНаоборот: статическое свойство общее для всех экземпляров класса. Проверено php -r.
T10-L8
0.33 c
Ссылки и область видимостиМассив может иметь булев ключ true, и он сохранится как bool.«нет»
Пояснение: В PHP булевые ключи массивов автоматически приводятся к целым числам (true становится 1, false становится 0).
Raw
{"answer": "нет", "пояснение": "В PHP булевые ключи массивов автоматически приводятся к целым числам (true становится 1, false становится 0)."}
верноБулев ключ приводится к int: true → 1, false → 0.
T11-L1
0.33 c
Генераторы, итераторы, SPLВнутри генератора можно использовать return со значением, и оно попадёт в $gen->getReturn().«да»
Пояснение: В генераторах PHP можно использовать return со значением, которое можно получить через $gen->getReturn().
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "В генераторах PHP можно использовать return со значением, которое можно получить через $gen->getReturn()." ⏎ } ⏎ ```
верноreturn-значение генератора доступно через getReturn() после прохода.
T11-L2
0.87 c
Генераторы, итераторы, SPLПолностью пройденный генератор можно «перемотать» через rewind() и пройти снова.«нет»
Пояснение: Метод rewind() вызывается автоматически при повторном foreach, но для ручного перемотки нужно использовать reset() или вызвать генератор заново, если он не поддерживает statefulness, так как стандартный rewind() для генераторов не является общим механизмом для всех сценариев без повторного создания или reset().
Raw
{"answer": "нет", "пояснение": "Метод rewind() вызывается автоматически при повторном foreach, но для ручного перемотки нужно использовать reset() или вызвать генератор заново, если он не поддерживает statefulness, так как стандартный rewind() для генераторов не является общим механизмом для всех сценариев без повторного создания или reset()."}
верноГенератор одноразовый: rewind после начала итерации бросает Exception.
T11-L3
0.43 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»
Пояснение: Функция g() возвращает объект Generator, а get_class возвращает имя класса объекта.
Raw
{"answer": "Generator", "пояснение": "Функция g() возвращает объект Generator, а get_class возвращает имя класса объекта."}
верноФункция с yield возвращает Generator.
T11-L5
0.34 c
Генераторы, итераторы, SPLСколько элементов вернёт count(iterator_to_array((function () { yield from [1, 2, 3]; })()));«3»
Пояснение: Генератор возвращает три значения (1, 2, 3), которые преобразуются в массив из трех элементов.
Raw
{"answer": 3, "пояснение": "Генератор возвращает три значения (1, 2, 3), которые преобразуются в массив из трех элементов."}
верноyield from делегирует все 3 элемента.
T11-L6
0.43 c
Генераторы, итераторы, SPLКласс SplStack реализует очередь FIFO.«нет»
Пояснение: СплСтак реализует структуру данных «стек» (LIFO), а не очередь (FIFO).
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "СплСтак реализует структуру данных «стек» (LIFO), а не очередь (FIFO)." ⏎ } ⏎ ```
верноSplStack — стек LIFO; очередь FIFO — SplQueue.
T11-L7
0.46 c
Генераторы, итераторы, SPLArrayIterator позволяет обернуть массив и обходить его через интерфейс Iterator.«да»
Пояснение: ArrayIterator реализует интерфейсы Iterator, IteratorAggregate, ArrayAccess, Countable и позволяет обходить массив, предоставляя методы current, key, next, rewind и valid.
Raw
{"answer": "да", "пояснение": "ArrayIterator реализует интерфейсы Iterator, IteratorAggregate, ArrayAccess, Countable и позволяет обходить массив, предоставляя методы current, key, next, rewind и valid."}
верноОбъектная обёртка над массивом.
T11-L8
0.29 c
Генераторы, итераторы, SPLОбъект класса ArrayObject нельзя обойти через foreach.«нет»
Пояснение: ArrayObject реализует интерфейс Traversable, поэтому его объекты можно перебирать с помощью foreach.
Raw
{"answer": "нет", "пояснение": "ArrayObject реализует интерфейс Traversable, поэтому его объекты можно перебирать с помощью foreach."}
верноArrayObject реализует IteratorAggregate — foreach по нему работает.
T12-L1
0.41 c
Конфигурация и безопасностьpassword_hash() генерирует соль автоматически — передавать её отдельно не нужно.«да»
Пояснение: Функция password_hash() генерирует и вставляет случайную соль непосредственно в возвращаемую строку хэша.
Raw
{"answer": "да", "пояснение": "Функция password_hash() генерирует и вставляет случайную соль непосредственно в возвращаемую строку хэша."}
верноСоль встраивается в строку результата; параметр salt устарел.
T12-L2
0.25 c
Конфигурация и безопасностьАлгоритм PASSWORD_DEFAULT в PHP 8 — это md5 с автоматически добавленной солью.«нет»
Пояснение: В PHP 8 алгоритм PASSWORD_DEFAULT использует bcrypt, а не md5.
Raw
{"answer": "нет", "пояснение": "В PHP 8 алгоритм PASSWORD_DEFAULT использует bcrypt, а не md5."}
верноPASSWORD_DEFAULT — bcrypt; md5 для паролей непригоден (перебирается массово).
T12-L3
0.25 c
Конфигурация и безопасностьЧто вернёт password_verify('secret', password_hash('secret', PASSWORD_DEFAULT))?«да»
Пояснение: password_verify возвращает true, если пароль соответствует хэшу.
Raw
{"answer": "да", "пояснение": "password_verify возвращает true, если пароль соответствует хэшу."}
верноСоль и хеш в одной строке: true (форма ответа: true или да).
T12-L4
0.46 c
Конфигурация и безопасностьФункция strip_tags() защищает от SQL-инъекций.«нет»
Пояснение: strip_tags() удаляет HTML-теги для защиты от XSS, но не защищает от SQL-инъекций, для которых используются подготовленные выражения (prepared statements) или эранирование.
Raw
{"answer": "нет", "пояснение": "strip_tags() удаляет HTML-теги для защиты от XSS, но не защищает от SQL-инъекций, для которых используются подготовленные выражения (prepared statements) или эранирование."}
верноstrip_tags режет HTML-теги (помощник против XSS), к параметризации SQL отношения не имеет.
T12-L5
0.35 c
Конфигурация и безопасностьФункция session_regenerate_id() используется для защиты от фиксации сессии при входе пользователя.«да»
Пояснение: session_regenerate_id() создает новый идентификатор сессии, что предотвращает атаки фиксации сессии, особенно при изменении уровня доступа пользователя.
Raw
{"answer": "да", "пояснение": "session_regenerate_id() создает новый идентификатор сессии, что предотвращает атаки фиксации сессии, особенно при изменении уровня доступа пользователя."}
верноНовый ID сессии после логина — стандартная защита от session fixation.
T12-L6
0.38 c
Конфигурация и безопасностьКакая встроенная функция возвращает имя SAPI (например, cli)?«php_sapi_name»
Пояснение: Функция php_sapi_name() возвращает имя текущего SAPI (например, 'cli', 'apache2handler').
Raw
{"answer": "php_sapi_name", "пояснение": "Функция php_sapi_name() возвращает имя текущего SAPI (например, 'cli', 'apache2handler')."}
верноphp_sapi_name().
T12-L7
0.46 c
Конфигурация и безопасностьsession_destroy() удаляет данные сессии на сервере, но не cookie в браузере пользователя.«да»
Пояснение: session_destroy() удаляет данные сессии на сервере, но не изменяет куки PHPSESSID в браузере, для чего нужно использовать setcookie с истекшим временем.
Raw
{"answer": "да", "пояснение": "session_destroy() удаляет данные сессии на сервере, но не изменяет куки PHPSESSID в браузере, для чего нужно использовать setcookie с истекшим временем."}
верноУдаление cookie — отдельный шаг через setcookie с истёкшим сроком.
T12-L8
0.31 c
Конфигурация и безопасностьБез вызова session_start() массив $_SESSION автоматически загружается данными сессии.«нет»
Пояснение: Массив $_SESSION доступен только после вызова функции session_start(), которая инициализирует сессию.
Raw
{"answer": "нет", "пояснение": "Массив $_SESSION доступен только после вызова функции session_start(), которая инициализирует сессию."}
верноБез session_start() данные сессии в массив не загружаются ($_SESSION можно заполнить вручную, но привязки к сессии нет).
VC-L1
0.25 c
PHP 8.4–8.5В какой версии PHP появилась функция array_find()?«php 8.4»
Пояснение: Функция array_find() была добавлена в PHP 8.4.
Raw
{"answer": "PHP 8.4", "пояснение": "Функция array_find() была добавлена в PHP 8.4."}
верноPHP 8.4 (RFC array_find).
VC-L2
0.25 c
PHP 8.4–8.5Property hooks (get/set прямо в объявлении свойства) вошли в PHP 8.4.«да»
Пояснение: Функциональность property hooks действительно была добавлена в PHP 8.4.
Raw
{"answer": "да", "пояснение": "Функциональность property hooks действительно была добавлена в PHP 8.4."}
верноProperty hooks — PHP 8.4 (ноябрь 2024).
VC-L3
0.25 c
PHP 8.4–8.5Асимметричная видимость (public private(set) string $name) появилась в PHP 8.4.«да»
Пояснение: Асимметричная видимость свойств действительно была введена в PHP 8.4.
Raw
{"answer": "да", "пояснение": "Асимметричная видимость свойств действительно была введена в PHP 8.4."}
верноAsymmetric visibility v2 — PHP 8.4.
VC-L4
0.32 c
PHP 8.4–8.5В какой версии PHP впервые появился атрибут #[\NoDiscard]? Ответь номером версии.«8.3»
Пояснение: Атрибут #[\NoDiscard] был впервые представлен в PHP 8.3.
Raw
{ ⏎  "answer": "8.3", ⏎  "пояснение": "Атрибут #[\\NoDiscard] был впервые представлен в PHP 8.3." ⏎ }
неверно
верный: «8.5»
#[\NoDiscard] — PHP 8.5 (marking return values as important).
VC-L5
0.29 c
PHP 8.4–8.5В какой версии PHP впервые появился оператор конвейера |> (pipe)? Ответь номером версии.«8.4»
Пояснение: Оператор конвейера (pipe operator) был добавлен в PHP 8.4.
Raw
{"answer": "8.4", "пояснение": "Оператор конвейера (pipe operator) был добавлен в PHP 8.4."}
неверно
верный: «8.5»
Pipe operator — PHP 8.5 (2025).
VC-L6
0.58 c
PHP 8.4–8.5В какой версии PHP появился clone-with — синтаксис clone($obj, ['x' => 1])? Ответь номером версии.«нет»
Пояснение: Синтаксис clone($obj, [...]) не является стандартным встроенным функционалом PHP; в PHP используется оператор clone $obj для поверхностного копирования, а для инициализации свойств обычно вызываются методы или используется конструктор.
Raw
{"answer": "нет", "пояснение": "Синтаксис clone($obj, [...]) не является стандартным встроенным функционалом PHP; в PHP используется оператор clone $obj для поверхностного копирования, а для инициализации свойств обычно вызываются методы или используется конструктор."}
неверно
верный: «8.5»
Clone with v2 — PHP 8.5.
VC-L7
0.3 c
PHP 8.4–8.5В какой версии PHP появились функции array_first() и array_last()?«8.4»
Пояснение: Функции array_first() и array_last() были добавлены в PHP 8.4.
Raw
{"answer": "8.4", "пояснение": "Функции array_first() и array_last() были добавлены в PHP 8.4."}
неверно
верный: «8.5»
PHP 8.5.
VC-L8
0.28 c
PHP 8.4–8.5Для какой версии PHP был принят RFC Partial Function Application v2 (по состоянию на 07.11.2026)? Ответь номером версии.«8.4»
Пояснение: RFC Partial Function Application v2 был принят для PHP 8.4.
Raw
{"answer": "8.4", "пояснение": "RFC Partial Function Application v2 был принят для PHP 8.4."}
неверно
верный: «8.6»
PFA v2 принят 05.12.2025 (33-0-0), реализован в PHP 8.6.
VF-L1
0.28 c
PHP: 8.6+ и будущееДля какой версии PHP реализован RFC clamp_v2 (функция clamp()) по состоянию на 07.11.2026? Ответь номером версии.«8.4»
Пояснение: Функция clamp() введена в PHP 8.4 согласно RFC.
Raw
{"answer": "8.4", "пояснение": "Функция clamp() введена в PHP 8.4 согласно RFC."}
неверно
верный: «8.6»
По данным владельца (wiki.php.net/rfc): clamp_v2 — 8.6; clamp() в 8.5.11 отсутствует (косвенное подтверждение). Дата-якорь делает клетку монотонной.
VF-L2
0.28 c
PHP: 8.6+ и будущееRFC Context Managers v2 уже принят в PHP (на 07.11.2026).«да»
Пояснение: RFC Context Managers v2 был принят и реализован в PHP 8.5.
Raw
{"answer": "да", "пояснение": "RFC Context Managers v2 был принят и реализован в PHP 8.5."}
неверно
верный: «нет»
На 06.11.2026 — в обсуждении (создан 2026-10-23); не принят.
VF-L3
0.52 c
PHP: 8.6+ и будущееRFC Bound-Erased Generic Types (generics) был отклонён в 2026 году.«да»
Пояснение: RFC о генериках был отклонён (rejected) в процессе голосования 2026 года, так как сообщество не достигло консенсуса по реализации.
Raw
{"answer": "да", "пояснение": "RFC о генериках был отклонён (rejected) в процессе голосования 2026 года, так как сообщество не достигло консенсуса по реализации."}
верноГолосование завершилось 2026-06-28: отклонён (wiki.php.net/rfc).
VF-L4
0.67 c
PHP: 8.6+ и будущееНа 07.11.2026 RFC о включении многопоточности (ZTS) по умолчанию уже принят в PHP.«нет»
Пояснение: На текущий момент (и в реалистичном будущем до 2026) RFC о включении ZTS по умолчанию в PHP не принят; по умолчанию всё ещё используется NTS, а ZTS — опциональный вариант сборки.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "На текущий момент (и в реалистичном будущем до 2026) RFC о включении ZTS по умолчанию в PHP не принят; по умолчанию всё ещё используется NTS, а ZTS — опциональный вариант сборки." ⏎ }
верноТакого принятого RFC нет на дату якоря; якорь делает клетку монотонной — при принятии RFC позже клетка не перевернётся.
VF-L5
0.5 c
PHP: 8.6+ и будущееВ PHP 8.5 дженериков (параметризованных типов) по-прежнему нет.«да»
Пояснение: В PHP 8.5 (на текущем моменте разработки) по-прежнему нет встроенной поддержки дженериков, как в Java или C#.
Raw
{"answer": "да", "пояснение": "В PHP 8.5 (на текущем моменте разработки) по-прежнему нет встроенной поддержки дженериков, как в Java или C#."}
верноGenerics в PHP отсутствуют; отрицательный контроль (не путать с C#/Java).
VF-L6
0.63 c
PHP: 8.6+ и будущееНа 07.11.2026 последняя стабильная версия PHP — 8.5, а PHP 8.6 ещё не выпущена (GA — 19.11.2026).«— (нет ответа)»
Пояснение: В соответствии с графиком PHP 8.5 вышла в стабильной версии в ноябре 2025, а PHP 8.6 запланирована к выпуску в ноябре 2026, следовательно, 07.11.2026 стабильной является именно 8.5.
Raw
{"answer": "верно", "пояснение": "В соответствии с графиком PHP 8.5 вышла в стабильной версии в ноябре 2025, а PHP 8.6 запланирована к выпуску в ноябре 2026, следовательно, 07.11.2026 стабильной является именно 8.5."}
не разобрано
верный: «да»
парсинг: нет
8.5 — релиз осени 2025; 8.6 GA 19.11.2026 (wiki.php.net/todo/php86). Дата снимка — 06.11.2026.
VF-L7
0.43 c
PHP: 8.6+ и будущееВетка PHP 6 так и не вышла: после PHP 5.6 вышел сразу PHP 7.0.«да»
Пояснение: После PHP 5.6 релизом следующего поколения действительно стал PHP 7.0, промежуточной ветки PHP 6 не существовало.
Raw
{"answer": "да", "пояснение": "После PHP 5.6 релизом следующего поколения действительно стал PHP 7.0, промежуточной ветки PHP 6 не существовало."}
верноИсторический факт: ветка 6 не была релизнута.
VF-L8
0.66 c
PHP: 8.6+ и будущееRFC о добавлении атрибута #[\Deprecated] в ядро был принят.«нет»
Пояснение: Атрибут #[\Deprecated] не входит в стандартные ядра PHP (на момент PHP 8.4); хотя есть предложения и реализации в экосистеме, он не принят как часть RFC ядра.
Raw
{"answer": "нет", "пояснение": "Атрибут #[\\Deprecated] не входит в стандартные ядра PHP (на момент PHP 8.4); хотя есть предложения и реализации в экосистеме, он не принят как часть RFC ядра."}
неверно
верный: «да»
#[\Deprecated] — принят, реализован в PHP 8.4.
T25-L1
0.42 c
Чистая архитектураПравило зависимостей в чистой и луковичной архитектурах: внутренние слои не знают о внешних — зависимости направлены к центру.«да»
Пояснение: В чистой и луковичной архитектурах зависимость всегда направлена от внешних слоев (инфраструктура, API) к внутренним (домен, бизнес-логика).
Raw
{"answer": "да", "пояснение": "В чистой и луковичной архитектурах зависимость всегда направлена от внешних слоев (инфраструктура, API) к внутренним (домен, бизнес-логика)."}
верноЧистая (Robert C. Martin), луковичная (Jeffrey Palermo) и гексагональная (ports & adapters) — варианты одной идеи: зависимости направлены внутрь, к домену. Слоями в проекте следит deptrac.
T25-L2
0.45 c
Чистая архитектураСущности домена не импортируют ни Doctrine, ни Symfony — только язык и, возможно, стандартную библиотеку.«да»
Пояснение: В чистом DDD доменные сущности должны быть независимыми от фреймворков и ORM, чтобы оставаться переносимыми и легко тестируемыми.
Raw
{"answer": "да", "пояснение": "В чистом DDD доменные сущности должны быть независимыми от фреймворков и ORM, чтобы оставаться переносимыми и легко тестируемыми."}
верноИзоляция домена от инфраструктуры; deptrac в проекте как раз следит за слоями.
T25-L3
0.37 c
Чистая архитектураКонтроллеры и Twig-шаблоны относятся к слою бизнес-логики, потому что именно они вызывают use cases.«нет»
Пояснение: Контроллеры и шаблоны относятся к слю представления (UI), а не бизнес-логики.
Raw
{"answer": "нет", "пояснение": "Контроллеры и шаблоны относятся к слю представления (UI), а не бизнес-логики."}
верноНаоборот: это интерфейсные адаптеры (внешний слой); они зависят от use cases, а не наоборот.
T25-L4
0.31 c
Чистая архитектураЧто находится в самом центре луковичной архитектуры?«ядро»
Пояснение: В модели луковичной архитектуры (Onion Architecture) центральным слоем является доменное ядро.
Raw
{"answer": "Ядро", "пояснение": "В модели луковичной архитектуры (Onion Architecture) центральным слоем является доменное ядро."}
неверно
верный: «доменная модель»
Центральное кольцо — Domain Model: сущности и бизнес-правила без зависимостей; далее Domain Services → Application Services → Infrastructure/UI/Tests (Palermo).
T25-L5
0.44 c
Чистая архитектураНарушение границ слоёв можно поймать автоматикой: анализатор зависимостей между слоями (например, deptrac) падает на запрещённом вызове.«да»
Пояснение: Instruments like deptrac are specifically designed to enforce architectural layer boundaries and fail builds when dependencies violate the defined rules.
Raw
{ ⏎ "answer": "да", ⏎ "пояснение": "Instruments like deptrac are specifically designed to enforce architectural layer boundaries and fail builds when dependencies violate the defined rules." ⏎ }
верноdepfile.yaml в проекте TasK: CI проверяет правила слоёв на каждом пайплайне.
T25-L6
0.69 c
Чистая архитектураUse case (interactor) может принимать HTTP-запрос или EntityManager как аргументы — так проще.«нет»
Пояснение: Use case (интерактор) в чистом DDD или Clean Architecture не должен зависеть от конкретных реализаций (HTTP-запросов или EntityManager), а взаимодействовать через интерфейсы (Gateways, Ports), что обеспечивает изоляцию бизнес-логики.
Raw
{"answer": "нет", "пояснение": "Use case (интерактор) в чистом DDD или Clean Architecture не должен зависеть от конкретных реализаций (HTTP-запросов или EntityManager), а взаимодействовать через интерфейсы (Gateways, Ports), что обеспечивает изоляцию бизнес-логики."}
верноUse case принимает DTO и порты; привязка к HTTP/ORM протекает инфраструктуру во внутренние слои.
T25-L7
0.46 c
Чистая архитектураКак называется компонент, предоставляющий коллекцию агрегатов/сущностей, скрывая механизм хранения за интерфейсом?«репозиторий»
Пояснение: Репозиторий — это паттерн, который предоставляет доступ к коллекциям объектов, скрывая механизм хранения данных за общим интерфейсом.
Raw
{"answer": "Репозиторий", "пояснение": "Репозиторий — это паттерн, который предоставляет доступ к коллекциям объектов, скрывая механизм хранения данных за общим интерфейсом."}
верноRepository pattern (DDD/Evans); в проекте — Doctrine-репозитории за портами.
T25-L8
0.65 c
Чистая архитектураЗамена PostgreSQL на другую БД в чистой архитектуре затрагивает только внешний слой — домен и use cases не меняются.«да»
Пояснение: В чистой архитектуре домен и use cases зависят от абстракций (интерфейсов), поэтому смена СУБД требует изменений только в инфраструктурном слое (репозитории и адаптеры), оставляя внутреннюю логику неизменной.
Raw
{"answer": "да", "пояснение": "В чистой архитектуре домен и use cases зависят от абстракций (интерфейсов), поэтому смена СУБД требует изменений только в инфраструктурном слое (репозитории и адаптеры), оставляя внутреннюю логику неизменной."}
верноСледствие правила зависимостей: инфраструктура взаимозаменяема.
T26-L1
0.41 c
DDDАгрегат в DDD — это просто другое название таблицы базы данных.«нет»
Пояснение: Агрегат в DDD — это кластер связанных доменных объектов с единым инвариантом целостности, а не просто таблица БД.
Raw
{"answer": "нет", "пояснение": "Агрегат в DDD — это кластер связанных доменных объектов с единым инвариантом целостности, а не просто таблица БД."}
верноАгрегат — кластер объектов с границей согласованности (транзакционной вокруг корня); таблица — деталь хранения.
T26-L2
0.38 c
DDDValue Object неизменяем и сравнивается по значениям полей, а не по идентификатору.«да»
Пояснение: Value Object действительно определяется своими атрибутами, является неизменяемым и сравнивается по содержимому, а не по ссылке в памяти.
Raw
{"answer": "да", "пояснение": "Value Object действительно определяется своими атрибутами, является неизменяемым и сравнивается по содержимому, а не по ссылке в памяти."}
верноКлассика Evans: Money, Email; равенство структурное.
T26-L3
0.42 c
DDDКак называется единственная точка внешнего входа в агрегат, через которую проходят все изменения?«aggregate root»
Пояснение: Aggregate Root — это основная сущность агрегата, через которую происходит взаимодействие с внешним миром и управление состоянием внутренних сущностей.
Raw
{"answer": "Aggregate Root", "пояснение": "Aggregate Root — это основная сущность агрегата, через которую происходит взаимодействие с внешним миром и управление состоянием внутренних сущностей."}
верноAggregate Root: внешние объекты ссылаются только на корень; он защищает инварианты агрегата.
T26-L4
0.36 c
DDDВ DDD репозиторий объявляется на агрегат (его корень), а не на каждую сущность.«да»
Пояснение: В DDD репозитории управляют агрегатами, а не отдельными сущностями внутри них, чтобы сохранять целостность данных.
Raw
{"answer": "да", "пояснение": "В DDD репозитории управляют агрегатами, а не отдельными сущностями внутри них, чтобы сохранять целостность данных."}
верноРепозиторий корня хранит границу согласованности агрегата; вложенные сущности доступны только через корень.
T26-L5
0.46 c
DDDUbiquitous language — единый язык модели, общий для разработчиков и предметных экспертов.«да»
Пояснение: Ubiquitous Language — это термин из методологии Domain-Driven Design, обозначающий общий язык, используемый разработчиками и предметными экспертами для описания бизнес-домена.
Raw
{"answer": "да", "пояснение": "Ubiquitous Language — это термин из методологии Domain-Driven Design, обозначающий общий язык, используемый разработчиками и предметными экспертами для описания бизнес-домена."}
верноEvans: язык из требований переходит в имена классов и методов.
T26-L6
0.5 c
DDDКак называется граница, внутри которой модель и её язык едины, а снаружи те же понятия — другие модели?«парадигма»
Пояснение: Парадигма определяет систему правил и моделей, в рамках которой объекты и их взаимодействия имеют определенный смысл, отличный от моделей других парадигм.
Raw
{"answer": "парадигма", "пояснение": "Парадигма определяет систему правил и моделей, в рамках которой объекты и их взаимодействия имеют определенный смысл, отличный от моделей других парадигм."}
неверно
верный: «bounded context»
Bounded Context; «Заказ» в биллинге и в доставке — разные модели.
T26-L7
0.59 c
DDDАнемичная модель (объекты только с геттерами/сеттерами, логика в сервисах) — рекомендуемый стиль DDD.«нет»
Пояснение: В DDD рекомендуется использовать Rich Domain Models (богатые доменные модели), где бизнес-логика инкапсулирована внутри сущностей, а не вынесена в анемичные объекты и сервисы.
Raw
{"answer": "нет", "пояснение": "В DDD рекомендуется использовать Rich Domain Models (богатые доменные модели), где бизнес-логика инкапсулирована внутри сущностей, а не вынесена в анемичные объекты и сервисы."}
верноНаоборот: Evans называет анемичность антипаттерном — поведение должно жить в доменных объектах.
T26-L8
0.48 c
DDDBounded context означает, что у каждого контекста своя модель: одно и то же понятие в разных контекстах — разные классы.«да»
Пояснение: Bounded Context — это ключевой принцип DDD, утверждающий, что каждая доменная модель ограничена определённым контекстом и понятия в разных контекстах могут иметь разные реализации и смыслы.
Raw
{"answer": "да", "пояснение": "Bounded Context — это ключевой принцип DDD, утверждающий, что каждая доменная модель ограничена определённым контекстом и понятия в разных контекстах могут иметь разные реализации и смыслы."}
верноМодели контекстов независимы; между ними — явная интеграция (ACL, published language).
T13-L1
0.5 c
SymfonyСервисы в DI-контейнере Symfony по умолчанию создаются лениво — при первом обращении к ним.«нет»
Пояснение: По умолчанию сервисы в Symfony создаются лениво (lazy), но только если они не объявлены как `eager` или не зависят от других сервисов, требующих раннего создания.
Raw
{"answer": "нет", "пояснение": "По умолчанию сервисы в Symfony создаются лениво (lazy), но только если они не объявлены как `eager` или не зависят от других сервисов, требующих раннего создания."}
неверно
верный: «да»
Контейнер инстанцирует сервис при первом извлечении; eager-создания по умолчанию нет.
T13-L2
0.34 c
SymfonyКакая консольная команда Symfony выводит список всех зарегистрированных маршрутов?«bin/console debug:router»
Пояснение: Эта команда выводит таблицу всех зарегистрированных маршрутов приложения.
Raw
{"answer": "bin/console debug:router", "пояснение": "Эта команда выводит таблицу всех зарегистрированных маршрутов приложения."}
верноbin/console debug:router (FrameworkBundle); в Symfony 3 команда называлась router:debug.
T13-L3
0.38 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.47 c
SymfonyКонтейнер DI в dev-окружении Symfony пересобирается только после изменения отслеживаемых файлов, а не при каждом запросе.«да»
Пояснение: В dev-окружении Symfony кэширует контейнер DI, пересобирая его только при изменении конфигурации, служб или других отслеживаемых файлов, а не при каждом запросе.
Raw
{"answer": "да", "пояснение": "В dev-окружении Symfony кэширует контейнер DI, пересобирая его только при изменении конфигурации, служб или других отслеживаемых файлов, а не при каждом запросе."}
верноKernel проверяет freshness ресурсов (конфиги, классы); иначе переиспользуется кэш контейнера.
T13-L6
0.36 c
SymfonyКакая переменная окружения выбирает активное окружение Symfony (dev/prod)?«app_env»
Пояснение: В Symfony 4+ активное окружение определяется переменной окружения APP_ENV.
Raw
{"answer": "APP_ENV", "пояснение": "В Symfony 4+ активное окружение определяется переменной окружения APP_ENV."}
верноAPP_ENV в .env; APP_DEBUG — отдельный флаг отладки.
T13-L7
0.38 c
SymfonyМетод контроллера может быть private — маршрутизация Symfony работает с любыми методами класса.«нет»
Пояснение: В Symfony маршрут должен быть привязан к публичному методу контроллера, так как диспетчер вызывает его извне.
Raw
{"answer": "нет", "пояснение": "В Symfony маршрут должен быть привязан к публичному методу контроллера, так как диспетчер вызывает его извне."}
верноДействие контроллера должно быть public; приватный метод по маршруту не вызывается.
T13-L8
0.36 c
SymfonyПодписчики событий (EventSubscriber) всегда получают события раньше слушателей (listeners), потому что интерфейс даёт им приоритет.«нет»
Пояснение: Приоритет событий определяется параметром priority при регистрации, а не типом класса (слушатель или подписчик).
Raw
{"answer": "нет", "пояснение": "Приоритет событий определяется параметром priority при регистрации, а не типом класса (слушатель или подписчик)."}
верноПорядок определяет priority, а не тип подписки; приоритеты задаются в getSubscribedEvents() так же, как у слушателей.
T22-L1
0.46 c
Symfony: Security и формыВ современном Symfony (6.0+) аутентификация строится на классах-authenticator (AuthenticatorInterface); прежняя система guard удалена.«да»
Пояснение: Начиная с Symfony 6.0, старая система Guard была удалена, и аутентификация полностью мигрировала на механизм Authenticators (AuthenticatorInterface и связанные классы).
Raw
{"answer": "да", "пояснение": "Начиная с Symfony 6.0, старая система Guard была удалена, и аутентификация полностью мигрировала на механизм Authenticators (AuthenticatorInterface и связанные классы)."}
верноGuard объявлен устаревшим в 5.3 и удалён в 6.0; в проекте symfony/security-bundle 8.1.
T22-L2
0.38 c
Symfony: Security и формыКакой атрибут Symfony проверяет роль/право прямо на методе контроллера (без него — 403)?«#isgranted»
Пояснение: Атрибут #IsGranted в Symfony позволяет проверять роли или права непосредственно на методах контроллера.
Raw
{"answer": "#IsGranted", "пояснение": "Атрибут #IsGranted в Symfony позволяет проверять роли или права непосредственно на методах контроллера."}
верно#[IsGranted('ROLE_ADMIN')]; атрибут из symfony/security-http.
T22-L3
0.36 c
Symfony: Security и формыVoters (голосующие) — механизм Symfony для проверки доступа к конкретному объекту: isGranted('EDIT', $post).«да»
Пояснение: Voters (Goto) в Symfony действительно используются для проверки прав доступа к конкретным объектам, например, с помощью метода isGranted('EDIT', $post).
Raw
{"answer": "да", "пояснение": "Voters (Goto) в Symfony действительно используются для проверки прав доступа к конкретным объектам, например, с помощью метода isGranted('EDIT', $post)."}
верноVoterInterface->vote(); docs Symfony — Voters.
T22-L4
0.42 c
Symfony: Security и формыОграничения валидации в современных Symfony (7+) объявляются PHP-атрибутами (#[Assert\NotBlank]); аннотации-докблоки больше не поддерживаются.«нет»
Пояснение: В Symfony 7+ докблоки (annotations) по-прежнему поддерживаются для обратной совместимости, хотя атрибуты являются рекомендуемым способом.
Raw
{"answer": "нет", "пояснение": "В Symfony 7+ докблоки (annotations) по-прежнему поддерживаются для обратной совместимости, хотя атрибуты являются рекомендуемым способом."}
неверно
верный: «да»
Докблок-аннотации удалены в Symfony 7.0; стандарт — атрибуты. В проекте symfony/validator 8.1.
T22-L5
0.38 c
Symfony: Security и формыCSRF-защита форм в Symfony включена по умолчанию: форма проверяет токен при отправке.«да»
Пояснение: В Symfony CSRF-защита включена по умолчанию, и каждый элемент формы автоматически содержит и проверяет токен.
Raw
{"answer": "да", "пояснение": "В Symfony CSRF-защита включена по умолчанию, и каждый элемент формы автоматически содержит и проверяет токен."}
верноFormType добавляет скрытое поле _token и проверяет его при валидации; отключение — осознанное исключение (csrf: false).
T22-L6
0.36 c
Symfony: Security и формыВалидация формы в Symfony выполняется на сервере, даже если клиентская (HTML5) проверка прошла.«да»
Пояснение: Клиентская валидация улучшает UX, но серверная валидация в Symfony является обязательным и надежным уровнем защиты.
Raw
{"answer": "да", "пояснение": "Клиентская валидация улучшает UX, но серверная валидация в Symfony является обязательным и надежным уровнем защиты."}
верноКлиентская валидация — только удобство; серверная обязательна и идёт по метаданным объекта формы.
T22-L7
0.35 c
Symfony: Security и формыКакая команда Symfony maker генерирует класс формы (FormType)?«make:form»
Пояснение: Команда maker:bundle generate:form (или make:form) используется для создания класса FormType.
Raw
{"answer": "make:form", "пояснение": "Команда maker:bundle generate:form (или make:form) используется для создания класса FormType."}
верноbin/console make:form (symfony/maker-bundle — в проекте).
T22-L8
0.5 c
Symfony: Security и формыSymfony хранит пароль пользователя в сессии в открытом виде (plaintext).«нет»
Пояснение: Symfony хранит идентификатор аутентификации (token) в сессии, а пароль хранится в базе данных в зашифрованном виде (хеше), никогда в открытом виде.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Symfony хранит идентификатор аутентификации (token) в сессии, а пароль хранится в базе данных в зашифрованном виде (хеше), никогда в открытом виде." ⏎ }
верноВ сессии живёт объект пользователя в токене; хеш затирается eraseCredentials(), plaintext там никогда не лежит.
T23-L1
0.44 c
Symfony: конфигурация и сервисыКонфигурация бандлов Symfony лежит в config/packages — по одному файлу на бандл или тему.«да»
Пояснение: Стандартная структура конфигурации Symfony предполагает размещение файлов конфигурации в директории config/packages, где каждый файл обычно соответствует одному бандлу или конкретной теме настройки.
Raw
{"answer": "да", "пояснение": "Стандартная структура конфигурации Symfony предполагает размещение файлов конфигурации в директории config/packages, где каждый файл обычно соответствует одному бандлу или конкретной теме настройки."}
верноСтандартная структура (config/packages/*.yaml); перегрузка — config/packages/<env>.
T23-L2
0.51 c
Symfony: конфигурация и сервисыФайл .env с dev-дефолтами коммитится в репозиторий, а настоящие секреты живут в некоммитимом .env.local.«да»
Пояснение: Это стандартная практика, чтобы хранить безопасные значения по умолчанию в .env, а чувствительные локальные данные — в исключенном из контроля версий .env.local.
Raw
{"answer": "да", "пояснение": "Это стандартная практика, чтобы хранить безопасные значения по умолчанию в .env, а чувствительные локальные данные — в исключенном из контроля версий .env.local."}
верноsymfony/dotenv: .env — общий безопасный набор значений; локальные секреты — .env.local (gitignored) или secrets-хранилище.
T23-L3
0.4 c
Symfony: конфигурация и сервисыКакая команда Symfony выводит зарегистрированные сервисы контейнера и их алиасы?«bin/console debug:container»
Пояснение: Команда debug:container выводит список зарегистрированных сервисов и их алиасов в контейнере DI Symfony.
Raw
{"answer": "bin/console debug:container", "пояснение": "Команда debug:container выводит список зарегистрированных сервисов и их алиасов в контейнере DI Symfony."}
верноbin/console debug:container; параметры контейнера — debug:parameter.
T23-L4
0.56 c
Symfony: конфигурация и сервисыКонтейнер Symfony позволяет менять параметры в рантайме: $container->setParameter() работает из контроллера.«нет»
Пояснение: Начиная с Symfony 4.0 метод setParameter() в контейнере устарел (deprecated) и не рекомендуется к использованию в рантайме (например, из контроллеров), так как контейнер считается неизменяемым после компиляции.
Raw
{"answer": "нет", "пояснение": "Начиная с Symfony 4.0 метод setParameter() в контейнере устарел (deprecated) и не рекомендуется к использованию в рантайме (например, из контроллеров), так как контейнер считается неизменяемым после компиляции."}
верноКонтейнер компилируется и замораживается; runtime-значения — только через переменные окружения.
T23-L5
0.36 c
Symfony: конфигурация и сервисыПо умолчанию сервисы в Symfony публичны (public: true) — их достают из контейнера напрямую.«нет»
Пояснение: С версии Symfony 4.1 по умолчанию все сервисы приватны (public: false).
Raw
{"answer": "нет", "пояснение": "С версии Symfony 4.1 по умолчанию все сервисы приватны (public: false)."}
верноС Symfony 4.0 сервисы по умолчанию private: инжектятся через autowiring; $container->get() — только для публичных.
T23-L6
0.32 c
Symfony: конфигурация и сервисыБез конфигурационного файла в config/packages бандл не заработает — настройки обязательны для каждого бандла.«нет»
Пояснение: Бандл может работать со значениями по умолчанию, поэтому файл конфигурации не всегда обязателен.
Raw
{"answer": "нет", "пояснение": "Бандл может работать со значениями по умолчанию, поэтому файл конфигурации не всегда обязателен."}
верноУ бандлов есть встроенные умолчания (Extension); конфиг нужен только для отклонений от них.
T23-L7
0.41 c
Symfony: конфигурация и сервисыЗначения переменных окружения подставляются в services.yaml синтаксисом %env(VAR)%.«да»
Пояснение: В Symfony переменные окружения действительно используются в конфигурационных файлах (включая services.yaml) через синтаксис %env(VAR_NAME)%.
Raw
{"answer": "да", "пояснение": "В Symfony переменные окружения действительно используются в конфигурационных файлах (включая services.yaml) через синтаксис %env(VAR_NAME)%."}
верно%env(...)% резолвится в рантайме env-процессорами; docs — Env Var Processors.
T23-L8
0.36 c
Symfony: конфигурация и сервисыКакая переменная окружения Symfony включает режим отладки (влияет на профайлер и отладку Twig)?«app_env»
Пояснение: Переменная окружения APP_ENV (например, 'dev') управляет режимом отладки, включая работу профайлера и Twig.
Raw
{"answer": "APP_ENV", "пояснение": "Переменная окружения APP_ENV (например, 'dev') управляет режимом отладки, включая работу профайлера и Twig."}
неверно
верный: «app_debug»
APP_DEBUG=1 (в .env dev-окружения); окружение выбирает APP_ENV — см. T13-L6.
T16-L1
0.5 c
Symfony: MessengerОдно сообщение в Symfony Messenger может обрабатывать только один обработчик (handler).«нет»
Пояснение: В Symfony Messenger одно сообщение может обрабатываться несколькими обработчиками, если они зарегистрированы для одной и той же очереди или если используются middleware, такие как Bus/Handlers.
Raw
{"answer": "нет", "пояснение": "В Symfony Messenger одно сообщение может обрабатываться несколькими обработчиками, если они зарегистрированы для одной и той же очереди или если используются middleware, такие как Bus/Handlers."}
верноMessenger вызывает все хендлеры, подписанные на класс сообщения (docs — Multiple Handlers).
T16-L2
0.36 c
Symfony: MessengerТранспорт sync в Messenger ставит сообщение в очередь и обрабатывает его воркером, как и async.«нет»
Пояснение: Транспорт sync обрабатывает сообщение синхронно (inline) в текущем процессе сразу после отправки, а не асинхронно воркером.
Raw
{"answer": "нет", "пояснение": "Транспорт sync обрабатывает сообщение синхронно (inline) в текущем процессе сразу после отправки, а не асинхронно воркером."}
верноНаоборот: sync обрабатывает немедленно в том же процессе, что и отправка; очередь — это async-транспорт.
T16-L3
0.3 c
Symfony: MessengerКакой консольной командой запускается воркер, обрабатывающий сообщения из очередей Messenger?«php bin/console messenger:consume»
Пояснение: Эта команда запускает воркер для обработки сообщений из очередей Symfony Messenger.
Raw
{"answer": "php bin/console messenger:consume", "пояснение": "Эта команда запускает воркер для обработки сообщений из очередей Symfony Messenger."}
верноbin/console messenger:consume async; воркеры под supervisord/systemd в проде.
T16-L4
0.46 c
Symfony: MessengerПовторы неудачных сообщений (retry_strategy) настраиваются на уровне транспорта Messenger.«да»
Пояснение: В Symfony Messenger retry_strategy (например, max_retries, delay) настраивается в конфигурации транспорта (framework.yaml), а не на уровне конкретного сервиса.
Raw
{"answer": "да", "пояснение": "В Symfony Messenger retry_strategy (например, max_retries, delay) настраивается в конфигурации транспорта (framework.yaml), а не на уровне конкретного сервиса."}
верноretry_strategy на транспорте: max_retries, delay, multiplier; docs — Failed Messages & Retries.
T16-L5
0.32 c
Symfony: MessengerПо умолчанию Messenger сериализует сообщения в JSON.«да»
Пояснение: По умолчанию Symfony Messenger использует сериализатор, который преобразует сообщения в JSON-строки.
Raw
{"answer": "да", "пояснение": "По умолчанию Symfony Messenger использует сериализатор, который преобразует сообщения в JSON-строки."}
неверно
верный: «нет»
Дефолтный сериализатор — PhpSerializer (serialize()); JSON-сериализатор включается отдельно.
T16-L6
0.37 c
Symfony: MessengerSymfony Scheduler по расписанию порождает сообщения и отправляет их через Messenger.«да»
Пояснение: Symfony Scheduler генерирует задачи, которые могут отправлять сообщения через Messenger в фоновые воркеры.
Raw
{"answer": "да", "пояснение": "Symfony Scheduler генерирует задачи, которые могут отправлять сообщения через Messenger в фоновые воркеры."}
верноSchedule → RecurringMessage → шина Messenger; docs — Scheduler.
T16-L7
0.28 c
Symfony: MessengerКакой встроенный транспорт Messenger хранит сообщения в таблицах БД через Doctrine?«doctrine»
Пояснение: Встроенный транспорт Symfony Messenger, использующий Doctrine для хранения сообщений в базе данных, называется doctrine.
Raw
{"answer": "doctrine", "пояснение": "Встроенный транспорт Symfony Messenger, использующий Doctrine для хранения сообщений в базе данных, называется doctrine."}
верноТранспорт doctrine (symfony/doctrine-messenger); таблица messenger_messages. В проекте стоит amqp-messenger + doctrine-messenger.
T16-L8
0.51 c
Symfony: MessengerПайплайн Messenger можно расширять собственными middleware, встраивая их до или после встроенных.«да»
Пояснение: Пайплайн Symfony Messenger позволяет гибко добавлять собственные обработчики (middleware) в начале или в конце списка, что дает возможность расширять или модифицировать поведение встроенных компонентов.
Raw
{"answer": "да", "пояснение": "Пайплайн Symfony Messenger позволяет гибко добавлять собственные обработчики (middleware) в начале или в конце списка, что дает возможность расширять или модифицировать поведение встроенных компонентов."}
верноmessenger.bus.*.middleware в yaml; docs — Middleware.
T28-L1
0.49 c
Symfony: версииМажорные релизы Symfony выходят раз в два года, минорные — каждые шесть месяцев (в мае и ноябре).«да»
Пояснение: Symfony следует схеме семантического версионирования, где мажорные релизы (новая версия фреймворка) выходят раз в два года, а минорные обновления — каждые шесть месяцев.
Raw
{"answer": "да", "пояснение": "Symfony следует схеме семантического версионирования, где мажорные релизы (новая версия фреймворка) выходят раз в два года, а минорные обновления — каждые шесть месяцев."}
верноСтандартный релизный цикл: 8.0 — ноябрь 2025, 8.1 — май 2026, 8.2 — ноябрь 2026.
T28-L2
0.3 c
Symfony: версииКакой минимальной версии PHP требует Symfony 8?«8.4»
Пояснение: Symfony 8 требует минимально PHP 8.4.
Raw
{"answer": "8.4", "пояснение": "Symfony 8 требует минимально PHP 8.4."}
верноSymfony 8.0 поднял требование до PHP >= 8.4.1 (в vendor проекта: "php": ">=8.4.1").
T28-L3
0.33 c
Symfony: версииSymfony 7.0 сохранила поддержку аннотаций в докблоках (валидация, маршруты).«нет»
Пояснение: В Symfony 7.0 удалена поддержка аннотаций в докблоках, используются только атрибуты PHP 8.
Raw
{"answer": "нет", "пояснение": "В Symfony 7.0 удалена поддержка аннотаций в докблоках, используются только атрибуты PHP 8."}
верноНаоборот: в 7.0 аннотации удалены — только PHP-атрибуты (#[Route], #[Assert\NotBlank]).
T28-L4
0.4 c
Symfony: версииAssetMapper позволяет управлять CSS/JS без node и webpack — через importmap.php.«да»
Пояснение: AssetMapper — это современный инструмент Symfony для сборки активов без Node.js/Webpack, использующий importmap.php для управления зависимостями.
Raw
{"answer": "да", "пояснение": "AssetMapper — это современный инструмент Symfony для сборки активов без Node.js/Webpack, использующий importmap.php для управления зависимостями."}
верноsymfony/asset-mapper (с 6.3, стандарт с 7.x); в проекте — importmap.php в корне и asset-mapper 8.1.
T28-L5
0.25 c
Symfony: версииSymfony 6.4 — обычный релиз без длительной поддержки.«нет»
Пояснение: Symfony 6.4 является LTS (Long Term Support) релизом.
Raw
{"answer": "нет", "пояснение": "Symfony 6.4 является LTS (Long Term Support) релизом."}
верноНаоборот: 6.4 — LTS (расширенная поддержка); LTS выходит вместе с очередным мажором (6.4 — вместе с 7.0).
T28-L6
0.34 c
Symfony: версииПри переходе на новую мажорную версию Symfony деприкейшены прошлой ветки продолжают работать — мажорные релизы их не удаляют.«нет»
Пояснение: В мажорных версиях Symfony deprecated-функциональность прошлой ветки удаляется.
Raw
{"answer": "нет", "пояснение": "В мажорных версиях Symfony deprecated-функциональность прошлой ветки удаляется."}
верноНаоборот: мажорный релиз удаляет всё устаревшее (7.0 убрал деприкейшены 6.x, 8.0 — 7.x).
T28-L7
0.44 c
Symfony: версииКаждый мажорный релиз Symfony сопровождается UPGRADE-гайдом со списком изменений.«да»
Пояснение: Симфония публикует UPGRADE-файлы (например, UPGRADE-7.0.md) для отслеживания breaking changes между мажорными версиями.
Raw
{"answer": "да", "пояснение": "Симфония публикует UPGRADE-файлы (например, UPGRADE-7.0.md) для отслеживания breaking changes между мажорными версиями."}
верноUPGRADE-7.0.md, UPGRADE-8.0.md в репозитории symfony/symfony.
T28-L8
0.41 c
Symfony: версииКакой компонент Symfony управляет ассетами и importmap без node/webpack?«webpackencorebundle»
Пояснение: В Symfony для управления ассетами и importmap без Node.js/webpack используется компонент WebpackEncoreBundle, который интегрируется с Webpack Encore.
Raw
{"answer": "WebpackEncoreBundle", "пояснение": "В Symfony для управления ассетами и importmap без Node.js/webpack используется компонент WebpackEncoreBundle, который интегрируется с Webpack Encore."}
неверно
верный: «asset-mapper»
symfony/asset-mapper 8.1 — в проекте.
T29-L1
0.44 c
Symfony: 8.2 и будущееНа 07.11.2026 Symfony 8.2 уже выпущена.«нет»
Пояснение: Symfony 8.0 запланирована на выпуск в ноябре 2027 года, а в ноябре 2026 года актуальна ветка Symfony 7.4.
Raw
{ ⏎ "answer": "нет", ⏎ "пояснение": "Symfony 8.0 запланирована на выпуск в ноябре 2027 года, а в ноябре 2026 года актуальна ветка Symfony 7.4." ⏎ }
верноНаоборот: 8.2 ещё не выпущена — релиз в конце ноября 2026; последняя стабильная — 8.1.
T29-L2
0.42 c
Symfony: 8.2 и будущееПо состоянию на 07.11.2026 Symfony 8.2 запланирована на ноябрь 2026 — в обычном шестимесячном цикле.«да»
Пояснение: Symfony придерживается шестимесячного цикла выпуска стабильных версий, поэтому 8.2 действительно запланирована на ноябрь 2026.
Raw
{"answer": "да", "пояснение": "Symfony придерживается шестимесячного цикла выпуска стабильных версий, поэтому 8.2 действительно запланирована на ноябрь 2026."}
верноПолитика релизов: 8.1 — май 2026, 8.2 — ноябрь 2026; якорь даты фиксирует срез — модель с поздним cutoff отвечает «на дату».
T29-L3
0.52 c
Symfony: 8.2 и будущееКакая версия Symfony выйдет следующей после 8.1 (по состоянию на 07.11.2026)?«8.2»
Пояснение: Согласно стандартной схеме версионирования Symfony, после версии 8.1 логично следует 8.2 (минорное обновление).
Raw
{ ⏎   "answer": "8.2", ⏎   "пояснение": "Согласно стандартной схеме версионирования Symfony, после версии 8.1 логично следует 8.2 (минорное обновление)." ⏎ }
верно8.2 — следующий минорный релиз (ноябрь 2026); после его выхода проект переходит с 8.1.* на 8.2.*.
T29-L4
0.79 c
Symfony: 8.2 и будущееSymfony 8.2 — мажорный релиз, требующий переписывания приложений под новые API.«нет»
Пояснение: Symfony 8.2 не является мажорным релизом, требующим переписывания приложений, так как мажорными считаются релизы с целым числом в первой позиции (например, 5, 6, 7, 8), а минорные релизы (X.2) обратно совместимы согласно политике Symfony.
Raw
{ ⏎ "answer": "нет", ⏎ "пояснение": "Symfony 8.2 не является мажорным релизом, требующим переписывания приложений, так как мажорными считаются релизы с целым числом в первой позиции (например, 5, 6, 7, 8), а минорные релизы (X.2) обратно совместимы согласно политике Symfony." ⏎ }
верноНаоборот: 8.2 — минорный релиз; новые возможности без поломки обратной совместимости. Мажор — 9.0.
T29-L5
0.44 c
Symfony: 8.2 и будущееОбновление внутри мажорной ветки (8.1 → 8.2) не должно требовать изменений кода — обратная совместимость сохраняется.«да»
Пояснение: В PHP мажорные версии (например, 8.1 -> 8.2) сохраняют обратную совместимость, поэтому обновление не требует изменений кода.
Raw
{"answer": "да", "пояснение": "В PHP мажорные версии (например, 8.1 -> 8.2) сохраняют обратную совместимость, поэтому обновление не требует изменений кода."}
верноПолитика Symfony: минорные релизы обратно совместимы; BC-break допустим только в мажорных.
T29-L6
0.42 c
Symfony: 8.2 и будущееКакая минорная версия ветки 8.x выйдет последней перед Symfony 9.0?«8.4»
Пояснение: Symfony 9.0 последует за веткой 8.x, которая завершится с версией 8.4.
Raw
{"answer": "8.4", "пояснение": "Symfony 9.0 последует за веткой 8.x, которая завершится с версией 8.4."}
верноПо циклу: 8.2 (ноя 2026), 8.3 (май 2027), 8.4 (ноя 2027, вместе с 9.0) — как 6.4 выходила вместе с 7.0.
T29-L7
1.45 c
Symfony: 8.2 и будущееSymfony 8.2 потребует обновления PHP до 8.5 — придётся обновлять PHP вместе с ней.«нет»
Пояснение: Symfony 7.2 (и ожидаемый Symfony 8.0) требуют PHP 8.2+, а версия PHP 8.5 не является обязательным требованием для стабильных релизов Symfony на данный момент (обычно поддержка доводится до текущей стабильной + 1-2 майнорные версии, но не форсирует скачок до 8.5 сразу, если речь не о гипотетической версии Symfony 8.2, которая даже не выпущена официально в контексте этого утверждения как факта; обычно требуется минимальная версия, например, 8.2 или 8.3 для новых мажоров).
Raw
{"answer": "нет", "пояснение": "Symfony 7.2 (и ожидаемый Symfony 8.0) требуют PHP 8.2+, а версия PHP 8.5 не является обязательным требованием для стабильных релизов Symfony на данный момент (обычно поддержка доводится до текущей стабильной + 1-2 майнорные версии, но не форсирует скачок до 8.5 сразу, если речь не о гипотетической версии Symfony 8.2, которая даже не выпущена официально в контексте этого утверждения как факта; обычно требуется минимальная версия, например, 8.2 или 8.3 для новых мажоров)."}
верноНаоборот: минорные релизы не поднимают требования PHP; для всей ветки 8.x остаётся PHP >= 8.4.
T29-L8
0.49 c
Symfony: 8.2 и будущееDeprecations, добавленные в ветке 8.x, будут удалены не раньше Symfony 9.0.«да»
Пояснение: Согласно политике Symfony, код, помеченный как Deprecated в мажорной версии X, удаляется в мажорной версии X+2.
Raw
{"answer": "да", "пояснение": "Согласно политике Symfony, код, помеченный как Deprecated в мажорной версии X, удаляется в мажорной версии X+2."}
верноПолитика: деприкейшены живут до следующего мажора; 9.0 — ноябрь 2027.
T21-L1
0.29 c
TwigВнутри {{ }} в Twig можно вызывать произвольный PHP-код напрямую.«нет»
Пояснение: В Twig внутри {{ }} можно вызывать только разрешенные функции и методы, а не произвольный PHP-код напрямую.
Raw
{"answer": "нет", "пояснение": "В Twig внутри {{ }} можно вызывать только разрешенные функции и методы, а не произвольный PHP-код напрямую."}
верноTwig — DSL: только разрешённые окружением функции/фильтры; произвольный PHP не исполняется.
T21-L2
0.33 c
TwigTwig по умолчанию автоматически экранирует выводимые переменные.«да»
Пояснение: Twig имеет автоэкранирование (autoescape) включенным по умолчанию для всех переменных.
Raw
{"answer": "да", "пояснение": "Twig имеет автоэкранирование (autoescape) включенным по умолчанию для всех переменных."}
верноAutoescape включён по умолчанию; {{ '<b>' }} → &lt;b&gt;. Проверено на Twig 3.30.
T21-L3
0.33 c
TwigФильтр |e в Twig экранирует строку для безопасного вывода в HTML-контексте.«да»
Пояснение: Фильтр e в Twig экранирует специальные HTML-символы для безопасного вывода в HTML-контексте.
Raw
{"answer": "да", "пояснение": "Фильтр e в Twig экранирует специальные HTML-символы для безопасного вывода в HTML-контексте."}
верно|e ('html') по умолчанию; есть контексты js/url/css. От SQL-инъекций он не защищает — это задача подготовленных запросов Doctrine.
T21-L4
0.24 c
TwigКакой фильтр из twig/intl-extra форматирует число с учётом локали?«number_format»
Пояснение: Фильтр number_format из twig/intl-extra форматирует число с учетом локали.
Raw
{"answer": "number_format", "пояснение": "Фильтр number_format из twig/intl-extra форматирует число с учетом локали."}
неверно
верный: «format_number»
|format_number(locale=...) из IntlExtension (twig/intl-extra есть в проекте). Проверено на Twig 3.30: 12345.6 → 12 345,6 (ru).
T21-L5
0.31 c
TwigФильтр |raw отключает автоэкранирование для значения.«да»
Пояснение: Фильтр |raw в Blade-шаблонах действительно отключает экранирование HTML для переменных.
Raw
{"answer": "да", "пояснение": "Фильтр |raw в Blade-шаблонах действительно отключает экранирование HTML для переменных."}
верно{{ x|raw }} выводит HTML как есть; опасно с пользовательскими данными. Проверено на Twig 3.30.
T21-L6
0.42 c
TwigВ Twig {{ }} выводит значение выражения, а {% %} выполняет теги — условия, циклы, set.«да»
Пояснение: В Twig выражения {{ }} используются для вывода, а теги {% %} — для управления структурой (циклы, условия, переменные).
Raw
{ ⏎ "answer": "да", ⏎ "пояснение": "В Twig выражения {{ }} используются для вывода, а теги {% %} — для управления структурой (циклы, условия, переменные)." ⏎ }
верноДва блока синтаксиса Twig: вывод (echo) против логики.
T21-L7
0.31 c
TwigВ Twig нельзя объявить переменную в шаблоне — значения только передаются из контроллера.«нет»
Пояснение: В Twig можно объявлять и присваивать переменные внутри шаблона с помощью тега set.
Raw
{"answer": "нет", "пояснение": "В Twig можно объявлять и присваивать переменные внутри шаблона с помощью тега set."}
верно{% set y = ... %} объявляет переменную в шаблоне. Проверено на Twig 3.30.
T21-L8
0.24 c
TwigКакая функция Twig выводит отладочную структуру переменной (массива, объекта)?«dump()»
Пояснение: Функция dump() в Twig выводит отладочную информацию о структуре переменной.
Raw
{"answer": "dump()", "пояснение": "Функция dump() в Twig выводит отладочную информацию о структуре переменной."}
верно{{ dump(x) }} (DebugExtension; в Symfony доступна в dev-окружении).
T24-L1
0.63 c
BootstrapBootstrap — это CSS/JS-библиотека готовых компонентов интерфейса, а не SPA-фреймворк.«да»
Пояснение: Bootstrap представляет собой библиотеку фронтенд-компонентов (CSS, JS) для быстрого создания адаптивных интерфейсов, но не является SPA-фреймворком, так как не управляет жизненным циклом приложений, маршрутизацией или состоянием на стороне клиента в полной мере.
Raw
{"answer": "да", "пояснение": "Bootstrap представляет собой библиотеку фронтенд-компонентов (CSS, JS) для быстрого создания адаптивных интерфейсов, но не является SPA-фреймворком, так как не управляет жизненным циклом приложений, маршрутизацией или состоянием на стороне клиента в полной мере."}
верноКомпоненты и утилиты поверх вашего HTML; SPA-фреймворки (React/Vue) — другой класс инструментов. В проекте vendored 5.3.3.
T24-L2
0.43 c
BootstrapКакой класс Bootstrap задаёт адаптивный контейнер с фиксированной максимальной шириной по брейкпоинтам?«container»
Пояснение: Класс .container в Bootstrap задаёт адаптивную ширину с фиксированными значениями max-width для каждого брейкпоинта.
Raw
{"answer": "container", "пояснение": "Класс .container в Bootstrap задаёт адаптивную ширину с фиксированными значениями max-width для каждого брейкпоинта."}
верно.container (фиксированная макс-ширина по брейкпоинтам) vs .container-fluid (на всю ширину).
T24-L3
0.41 c
BootstrapСетка Bootstrap построена на CSS float и делит строку на 16 колонок.«нет»
Пояснение: Сетка Bootstrap построена на CSS flexbox (в Bootstrap 4+), а строка делится на 12 колонок, а не 16.
Raw
{"answer": "нет", "пояснение": "Сетка Bootstrap построена на CSS flexbox (в Bootstrap 4+), а строка делится на 12 колонок, а не 16."}
верноНаоборот: flexbox (с Bootstrap 4) и 12 колонок; float-сетка — это Bootstrap 3.
T24-L4
0.34 c
BootstrapИменованные брейкпоинты Bootstrap (с инфиксом в классах) — sm, md, lg, xl, xxl; их пять.«да»
Пояснение: В Bootstrap 5 именно эти пять именованных брейкпоинтов (sm, md, lg, xl, xxl) являются стандартными.
Raw
{"answer": "да", "пояснение": "В Bootstrap 5 именно эти пять именованных брейкпоинтов (sm, md, lg, xl, xxl) являются стандартными."}
верноТиров всего шесть: xs (без инфикса) + пять именованных (576/768/992/1200/1400 px).
T24-L5
0.53 c
BootstrapУтилиты вроде .mt-3 или .px-2 используют шаг spacing-шкалы: число — множитель $spacer.«да»
Пояснение: В Tailwind CSS и аналогичных фреймворках утилиты отступов действительно используют численное значение как множитель переменной spacing-шкалы (например, $spacer).
Raw
{"answer": "да", "пояснение": "В Tailwind CSS и аналогичных фреймворках утилиты отступов действительно используют численное значение как множитель переменной 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.37 c
BootstrapКакой data-атрибут Bootstrap 5 включает интерактивный компонент (например, dropdown) на элементе?«data-bs-toggle»
Пояснение: В Bootstrap 5 для инициализации интерактивных компонентов, таких как dropdown, используется атрибут data-bs-toggle.
Raw
{"answer": "data-bs-toggle", "пояснение": "В Bootstrap 5 для инициализации интерактивных компонентов, таких как dropdown, используется атрибут data-bs-toggle."}
верноdata-bs-toggle="dropdown" и т.п.; в Bootstrap 4 атрибут назывался data-toggle.
T24-L7
0.35 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.35 c
BootstrapТёмную тему в Bootstrap включают классом .dark на корневом элементе.«да»
Пояснение: В Bootstrap 5 включение тёмной темы достигается добавлением класса .dark к элементу <html> (корневому элементу документа).
Raw
{"answer": "да", "пояснение": "В Bootstrap 5 включение тёмной темы достигается добавлением класса .dark к элементу <html> (корневому элементу документа)."}
неверно
верный: «нет»
Наоборот: тема включается атрибутом data-bs-theme="dark" (Color modes, с 5.3); класса .dark не существует. В проекте 5.3.3.
T14-L1
0.45 c
DoctrineDoctrine ORM сам создаёт таблицы в базе при первом обращении к сущности в рантайме.«нет»
Пояснение: Doctrine ORM не создаёт таблицы автоматически в рантайме; для их создания необходимо явное выполнение SQL-скриптов (через migrations или SQL).
Raw
{ ⏎ "answer": "нет", ⏎ "пояснение": "Doctrine ORM не создаёт таблицы автоматически в рантайме; для их создания необходимо явное выполнение SQL-скриптов (через migrations или SQL)." ⏎ }
верноСхему создают инструменты (migrations, schema tool); рантайм структуру БД не меняет.
T14-L2
0.34 c
DoctrineКакой метод EntityManager помечает новый объект как управляемый, не выполняя SQL до flush()?«persist»
Пояснение: Метод persist() добавляет сущность в контекст и помечает её для вставки, но SQL выполняется только при flush().
Raw
{"answer": "persist", "пояснение": "Метод persist() добавляет сущность в контекст и помечает её для вставки, но SQL выполняется только при flush()."}
верноpersist() регистрирует объект в Unit of Work; INSERT выполняется на flush().
T14-L3
3.77 c
DoctrineВ Doctrine ORM 3 метод EntityManager::merge() доступен и делает переданный объект управляемым.«нет»
Пояснение: В Doctrine ORM 3 метод merge() был переименован в unify() (или в новых версиях рекомендуется использовать merge, но в контексте вопроса о 'доступности' именно merge как старого API — он заменён/улучшен, но чаще всего в тестах подразумевается, что старый merge заменён на unify/merge с новой семантикой, однако ключевой момент: в D3 используется метод merge(), но часто путают с persist; однако строго говоря, в D3 метод merge() существует, но вопрос в формулировке 'делает переданный объект управляемым' — merge возвращает управляемую копию, а не делает исходный объект управляемым, если он был отсоединённым/удалённым, и в D3 акцент на новой семантике, но главный нюанс: в Doctrine 3 метод merge() переименован в unify() в некоторых контекстах? Нет, в D3.0 метод merge() по-прежнему доступен, но есть нюансы. Однако, если вопрос подразумевает сравнение с D2, где merge был основным, то в D3 он тоже есть. Но часто в таких тестах ловят на то, что в D3 рекомендован новый подход, и merge() не всегда делает объект управляемым в том смысле, что он создает новую копию. Наиболее вероятный 'подвох': в D3 метод называется merge(), но он возвращает управляемую копию, а исходный объект остаётся тем, чем был (если был отсоединённым, он не становится управляемым, а возвращается новый управляемый). Формулировка 'делает переданный объект управляемым' неверна, т.к. возвращается новый/копированный объект. Также есть версия, что в D3 метод переименован в unify() — это было в beta, но в финальной D3.0 метод называется merge(). Но пояснение должно быть простым: merge() возвращает управляемую копию, а не делает исходный объект управляемым.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "В Doctrine ORM 3 метод merge() был переименован в unify() (или в новых версиях рекомендуется использовать merge, но в контексте вопроса о 'доступности' именно merge как старого API — он заменён/улучшен, но чаще всего в тестах подразумевается, что старый merge заменён на unify/merge с новой семантикой, однако ключевой момент: в D3 используется метод merge(), но часто путают с persist; однако строго говоря, в D3 метод merge() существует, но вопрос в формулировке 'делает переданный объект управляемым' — merge возвращает управляемую копию, а не делает исходный объект управляемым, если он был отсоединённым/удалённым, и в D3 акцент на новой семантике, но главный нюанс: в Doctrine 3 метод merge() переименован в unify() в некоторых контекстах? Нет, в D3.0 метод merge() по-прежнему доступен, но есть нюансы. Однако, если вопрос подразумевает сравнение с D2, где merge был основным, то в D3 он тоже есть. Но часто в таких тестах ловят на то, что в D3 рекомендован новый подход, и merge() не всегда делает объект управляемым в том смысле, что он создает новую копию. Наиболее вероятный 'подвох': в D3 метод называется merge(), но он возвращает управляемую копию, а исходный объект остаётся тем, чем был (если был отсоединённым, он не становится управляемым, а возвращается новый управляемый). Формулировка 'делает переданный объект управляемым' неверна, т.к. возвращается новый/копированный объект. Также есть версия, что в D3 метод переименован в unify() — это было в beta, но в финальной D3.0 метод называется merge(). Но пояснение должно быть простым: merge() возвращает управляемую копию, а не делает исходный объект управляемым." ⏎ }
верноВ ORM 3 merge() удалён (в vendor проекта 3.7.6 метода нет); в Doctrine 2.x merge() возвращал управляемую копию. Версия зафиксирована — ORM 3.
T14-L4
0.4 c
DoctrineDQL-запросы пишутся в терминах сущностей и их полей, а не таблиц и столбцов.«да»
Пояснение: DQL (Doctrine Query Language) действительно оперирует сущностями и их полями, а не с физическими таблицами и столбцами БД.
Raw
{"answer": "да", "пояснение": "DQL (Doctrine Query Language) действительно оперирует сущностями и их полями, а не с физическими таблицами и столбцами БД."}
верноDoctrine транслирует DQL в SQL; docs — DQL (Doctrine Query Language).
T14-L5
0.3 c
DoctrineЧто вернёт $repository->find(999), если записи с идентификатором 999 нет?«null»
Пояснение: Метод find() возвращает null, если сущность с указанным идентификатором не найдена.
Raw
{"answer": "null", "пояснение": "Метод find() возвращает null, если сущность с указанным идентификатором не найдена."}
верноfind() возвращает null, если объект не найден (docs Repository methods).
T14-L6
0.41 c
DoctrineDoctrineBundle в Symfony автоматически вызывает flush() в конце каждого запроса.«нет»
Пояснение: DoctrineBundle в Symfony не вызывает flush() автоматически в конце каждого запроса; flush() обычно вызывается явно или через механизмы, такие как middleware, но не автоматически по умолчанию.
Raw
{"answer": "нет", "пояснение": "DoctrineBundle в Symfony не вызывает flush() автоматически в конце каждого запроса; flush() обычно вызывается явно или через механизмы, такие как middleware, но не автоматически по умолчанию."}
верноАвто-flush нет — flush() зовёт разработчик; незакрытая транзакция в конце запроса откатывается.
T14-L7
0.42 c
DoctrineДля управляемой сущности достаточно изменить свойство: flush() зафиксирует изменение без вызова persist() — Unit of Work отслеживает изменения.«да»
Пояснение: Управляемые сущности (managed) отслеживаются Unit of Work, поэтому любые изменения их свойств фиксируются при вызове flush() без необходимости повторного persist().
Raw
{"answer": "да", "пояснение": "Управляемые сущности (managed) отслеживаются Unit of Work, поэтому любые изменения их свойств фиксируются при вызове flush() без необходимости повторного persist()."}
верноDirty checking сравнивает снимки свойств; persist нужен только новым/отсоединённым объектам.
T14-L8
0.41 c
Doctrineremove() выполняет SQL DELETE сразу, не дожидаясь flush().«нет»
Пояснение: Methode remove() лишь помечает сущность для удаления в Unit of Work, а фактический SQL-запрос DELETE выполняется при вызове flush().
Raw
{"answer": "нет", "пояснение": "Methode remove() лишь помечает сущность для удаления в Unit of Work, а фактический SQL-запрос DELETE выполняется при вызове flush()."}
верноremove() планирует удаление в Unit of Work; DELETE выполняется на flush() (docs — Deleting Objects).
T15-L1
0.25 c
PostgreSQLPostgreSQL использует MVCC, поэтому читатели блокируют писателей, а писатели — читателей.«нет»
Пояснение: В PostgreSQL благодаря MVCC читатели и писатели не блокируют друг друга.
Raw
{"answer": "нет", "пояснение": "В PostgreSQL благодаря MVCC читатели и писатели не блокируют друг друга."}
верноНаоборот: благодаря MVCC читатели не блокируют писателей и наоборот (снимки строк); docs PostgreSQL — Concurrency Control.
T15-L2
0.32 c
PostgreSQLКакая команда SQL показывает план выполнения запроса, не выполняя сам запрос?«explain»
Пояснение: Команда EXPLAIN показывает план выполнения запроса в MySQL и PostgreSQL без его фактического выполнения.
Raw
{"answer": "EXPLAIN", "пояснение": "Команда EXPLAIN показывает план выполнения запроса в MySQL и PostgreSQL без его фактического выполнения."}
верноEXPLAIN без ANALYZE только строит план; проверено на PostgreSQL 17.7.
T15-L3
0.75 c
PostgreSQLSERIAL и GENERATED ... AS IDENTITY — это два названия одного и того же механизма.«нет»
Пояснение: В PHP эти термины не являются синонимами; SERIAL — это псевдо-тип в некоторых СУБД (например, PostgreSQL), а GENERATED ... AS IDENTITY — стандарт SQL-синтаксис для автоматической генерации значений, которые могут быть реализованы по-разному в зависимости от СУБД.
Raw
{"answer": "нет", "пояснение": "В PHP эти термины не являются синонимами; SERIAL — это псевдо-тип в некоторых СУБД (например, PostgreSQL), а GENERATED ... AS IDENTITY — стандарт SQL-синтаксис для автоматической генерации значений, которые могут быть реализованы по-разному в зависимости от СУБД."}
верноSERIAL — нестандартный макрос (sequence + DEFAULT), IDENTITY — SQL-стандарт; различаются владением и правами. Оба есть в PG 17 (проверено).
T15-L4
0.41 c
PostgreSQLUNIQUE-ограничение PostgreSQL по умолчанию допускает только одну строку с NULL в столбце.«нет»
Пояснение: В PostgreSQL UNIQUE-ограничение допускает неограниченное количество строк со значением NULL в столбце, так как NULL не считается равным NULL.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "В PostgreSQL UNIQUE-ограничение допускает неограниченное количество строк со значением NULL в столбце, так как NULL не считается равным NULL." ⏎ }
верноНаоборот: NULLS DISTINCT по умолчанию — несколько NULL допустимы; NULLS NOT DISTINCT — опция с PG 15. Проверено на PG 17.7.
T15-L5
0.31 c
PostgreSQLКакая агрегатная функция PostgreSQL склеивает строки с разделителем?«string_agg»
Пояснение: Функция string_agg() в PostgreSQL агрегирует строки, объединяя их с указанным разделителем.
Raw
{"answer": "string_agg", "пояснение": "Функция string_agg() в PostgreSQL агрегирует строки, объединяя их с указанным разделителем."}
верноstring_agg(значение, разделитель); проверено на PostgreSQL 17.7.
T15-L6
0.47 c
PostgreSQLОбычный VACUUM возвращает место, занятое «мёртвыми» кортежами, операционной системе.«нет»
Пояснение: Обычный VACUUM в PostgreSQL только освобождает место внутри файла для повторного использования базой данных, но не уменьшает размер файла на диске (не возвращает место ОС).
Raw
{"answer": "нет", "пояснение": "Обычный VACUUM в PostgreSQL только освобождает место внутри файла для повторного использования базой данных, но не уменьшает размер файла на диске (не возвращает место ОС)."}
верноVACUUM помечает место для переиспользования внутри таблицы; ОС его возвращает только VACUUM FULL (с эксклюзивной блокировкой).
T15-L7
0.4 c
PostgreSQLКакое ключевое слово в определении window-функции разбивает строки на группы, для которых считается функция?«partition by»
Пояснение: Ключевое слово PARTITION BY используется в оконных функциях для разделения строк на независимые группы.
Raw
{"answer": "PARTITION BY", "пояснение": "Ключевое слово PARTITION BY используется в оконных функциях для разделения строк на независимые группы."}
верноOVER (PARTITION BY ...); проверено на PostgreSQL 17.7.
T15-L8
0.4 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.48 c
PostgreSQL: транзакции и индексыПо умолчанию PostgreSQL выполняет каждый отдельный SQL-оператор в собственной неявной транзакции (autocommit).«да»
Пояснение: В PostgreSQL каждый отдельный SQL-оператор, если не обвязан в явную транзакцию (BEGIN...COMMIT), выполняется в собственной неявной транзакции (autocommit) и автоматически фиксируется.
Raw
{"answer": "да", "пояснение": "В PostgreSQL каждый отдельный SQL-оператор, если не обвязан в явную транзакцию (BEGIN...COMMIT), выполняется в собственной неявной транзакции (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.37 c
PostgreSQL: транзакции и индексыИндексы ускоряют не только SELECT: UPDATE и DELETE с поиском по индексированному столбцу тоже выигрывают.«да»
Пояснение: Индексы значительно ускоряют операции UPDATE и DELETE, так как позволяют базе данных быстро находить нужные строки без полного просмотра таблицы.
Raw
{"answer": "да", "пояснение": "Индексы значительно ускоряют операции UPDATE и DELETE, так как позволяют базе данных быстро находить нужные строки без полного просмотра таблицы."}
верноПоиск строк для изменения идёт по индексу; docs PostgreSQL — Indexes.
T17-L4
0.37 c
PostgreSQL: транзакции и индексыДля отката части операторов внутри транзакции PostgreSQL использует SAVEPOINT.«да»
Пояснение: SAVEPOINT позволяет выполнять частичный откат (ROLLBACK TO) до указанной точки внутри транзакции, что поддерживается PostgreSQL.
Raw
{"answer": "да", "пояснение": "SAVEPOINT позволяет выполнять частичный откат (ROLLBACK TO) до указанной точки внутри транзакции, что поддерживается PostgreSQL."}
верноSAVEPOINT name; ROLLBACK TO name — частичный откат без отмены всей транзакции. Проверено на PG 17.
T17-L5
0.34 c
PostgreSQL: транзакции и индексыEXPLAIN ANALYZE показывает план запроса, не выполняя сам запрос.«нет»
Пояснение: EXPLAIN ANALYZE выполняет запрос и показывает реальное время выполнения, в отличие от обычного EXPLAIN, который показывает только план.
Raw
{"answer": "нет", "пояснение": "EXPLAIN ANALYZE выполняет запрос и показывает реальное время выполнения, в отличие от обычного EXPLAIN, который показывает только план."}
верноНаоборот: ANALYZE реально выполняет запрос (с побочными эффектами!) и показывает фактические времена узлов; план без выполнения — plain EXPLAIN.
T17-L6
0.34 c
PostgreSQL: транзакции и индексыКакое расширение PostgreSQL добавляет векторные типы и индексы для поиска по эмбеддингам?«pgvector»
Пояснение: pgvector — это расширение PostgreSQL, которое добавляет поддержку векторных типов данных и индексов HNSW для эффективного поиска по эмбеддингам.
Raw
{"answer": "pgvector", "пояснение": "pgvector — это расширение PostgreSQL, которое добавляет поддержку векторных типов данных и индексов HNSW для эффективного поиска по эмбеддингам."}
верноCREATE EXTENSION vector (проект pgvector; в проекте образ pgvector/pgvector:pg17).
T17-L7
0.39 c
PostgreSQL: транзакции и индексыЧастичный индекс (CREATE INDEX ... WHERE ...) строится только по строкам, удовлетворяющим условию.«да»
Пояснение: Частичные индексы в PostgreSQL и других СУБД действительно создаются только для строк, соответствующих условию WHERE.
Raw
{"answer": "да", "пояснение": "Частичные индексы в PostgreSQL и других СУБД действительно создаются только для строк, соответствующих условию WHERE."}
верноdocs PostgreSQL — Partial Indexes; типичный кейс — индекс по «активным» записям.
T17-L8
0.76 c
PostgreSQL: транзакции и индексыУровень SERIALIZABLE в PostgreSQL реализован блокировкой строк, которые читает транзакция.«нет»
Пояснение: Уровень SERIALIZABLE в PostgreSQL использует механизм SSI (Serializable Snapshot Isolation) и отслеживает зависимости через таблицы системной каталога, а не блокирует строки при чтении (в отличие от REPEATABLE READ с lock-based реализацией в других СУБД).
Raw
{"answer": "нет", "пояснение": "Уровень SERIALIZABLE в PostgreSQL использует механизм SSI (Serializable Snapshot Isolation) и отслеживает зависимости через таблицы системной каталога, а не блокирует строки при чтении (в отличие от REPEATABLE READ с lock-based реализацией в других СУБД)."}
верноSSI (Serializable Snapshot Isolation): предикатные блокировки на снимках, не блокировки прочитанных строк; docs PostgreSQL.
T19-L1
0.36 c
HTTP и REST APIHTTP-статус 201 означает, что в результате запроса создан новый ресурс.«да»
Пояснение: HTTP-статус 201 Created используется для уведомления о успешном создании нового ресурса.
Raw
{"answer": "да", "пояснение": "HTTP-статус 201 Created используется для уведомления о успешном создании нового ресурса."}
верно201 Created; обычно на POST, часто с Location; RFC 9110.
T19-L2
0.32 c
HTTP и REST APIКакой HTTP-статус означает успешный запрос с пустым телом ответа (например, после DELETE)?«204»
Пояснение: Статус 204 No Content указывает на успешную обработку запроса без возвращаемого тела.
Raw
{"answer": 204, "пояснение": "Статус 204 No Content указывает на успешную обработку запроса без возвращаемого тела."}
верно204 No Content; RFC 9110.
T19-L3
0.59 c
HTTP и REST APIМетод DELETE идемпотентен по спецификации HTTP: повторный запрос по тому же ресурсу не меняет результат.«да»
Пояснение: Согласно спецификации HTTP, метод DELETE является идемпотентным, так как повторное удаление одного и того же ресурса не изменяет состояние сервера (в отличие от PUT, который заменяет, но в обоих случаях результат идентичен).
Raw
{"answer": "да", "пояснение": "Согласно спецификации HTTP, метод DELETE является идемпотентным, так как повторное удаление одного и того же ресурса не изменяет состояние сервера (в отличие от PUT, который заменяет, но в обоих случаях результат идентичен)."}
верноRFC 9110: DELETE идемпотентен (как PUT); идемпотентность ≠ безопасность — ресурс удаляется при первом вызове.
T19-L4
0.27 c
HTTP и REST APIЗаголовок Access-Control-Allow-Origin отправляет клиент, чтобы сервер разрешил принимать запросы с другого origin.«нет»
Пояснение: Заголовок Access-Control-Allow-Origin отправляет сервер, а не клиент.
Raw
{"answer": "нет", "пояснение": "Заголовок Access-Control-Allow-Origin отправляет сервер, а не клиент."}
верноНаоборот: заголовок шлёт СЕРВЕР в ответе, разрешая браузеру cross-origin запрос (CORS); в проекте nelmio/cors-bundle.
T19-L5
0.27 c
HTTP и REST APIКод 429 Too Many Requests используется, когда клиент превысил лимит запросов (rate limiting).«да»
Пояснение: Код 429 действительно используется для обозначения превышения лимита запросов (rate limiting).
Raw
{"answer": "да", "пояснение": "Код 429 действительно используется для обозначения превышения лимита запросов (rate limiting)."}
верно429 (+ Retry-After); RFC 6585. В проекте symfony/rate-limiter.
T19-L6
0.29 c
HTTP и REST APIКоды 5xx означают ошибку клиента, а 4xx — ошибку на стороне сервера.«нет»
Пояснение: Коды 4xx указывают на ошибку клиента, а 5xx — на ошибку сервера.
Raw
{"answer": "нет", "пояснение": "Коды 4xx указывают на ошибку клиента, а 5xx — на ошибку сервера."}
верноНаоборот: 4xx — ошибка клиента (400, 404), 5xx — сервера (500, 503); классы статусов RFC 9110.
T19-L7
0.27 c
HTTP и REST APIКакой HTTP-заголовок указывает MIME-тип тела запроса или ответа?«content-type»
Пояснение: HTTP-заголовок Content-Type определяет MIME-тип передаваемых данных.
Raw
{"answer": "Content-Type", "пояснение": "HTTP-заголовок Content-Type определяет MIME-тип передаваемых данных."}
верноContent-Type: application/json и т.п.
T19-L8
0.37 c
HTTP и REST APIPATCH не обязан быть идемпотентным по RFC 5789, в отличие от PUT.«да»
Пояснение: RFC 5789 указывает, что запросы PATCH не требуют идемпотентности, в отличие от PUT, который должен быть идемпотентным.
Raw
{ ⏎ "answer": "да", ⏎ "пояснение": "RFC 5789 указывает, что запросы PATCH не требуют идемпотентности, в отличие от PUT, который должен быть идемпотентным." ⏎ }
верноRFC 5789 прямо оговаривает: PATCH не гарантированно идемпотентен; PUT идемпотентен.
T20-L1
0.54 c
Безопасность и OAuthПроверить пароль достаточно сравнением его хеша с хешем из базы обычным оператором ==.«нет»
Пояснение: Для сравнения хешей паролей следует использовать криптоустойчивый оператор сравнения hash_equals(), чтобы избежать атак по временнóму каналу (timing attacks).
Raw
{"answer": "нет", "пояснение": "Для сравнения хешей паролей следует использовать криптоустойчивый оператор сравнения hash_equals(), чтобы избежать атак по временнóму каналу (timing attacks)."}
верноНужна постоянновременная проверка (password_verify) — timing-атаки; соль и алгоритм уже внутри хеша.
T20-L2
0.44 c
Безопасность и OAuthCSRF-токен выдаётся сервером (привязан к сессии) и проверяется на сервере при unsafe-запросах (POST и т.п.).«да»
Пояснение: CSRF-токены генерируются сервером, хранятся в сессии и проверяются на стороне сервера при обработке небезопасных HTTP-методов для защиты от межсайтовой подделки запросов.
Raw
{"answer": "да", "пояснение": "CSRF-токены генерируются сервером, хранятся в сессии и проверяются на стороне сервера при обработке небезопасных HTTP-методов для защиты от межсайтовой подделки запросов."}
верноsymfony/security-csrf в проекте; защита от подделки межсайтовой формы.
T20-L3
0.37 c
Безопасность и OAuthКакой HTTP-заголовок включает политику CSP (Content Security Policy)?«content-security-policy»
Пояснение: Этот HTTP-заголовок используется для передачи правил безопасности контента браузеру.
Raw
{"answer": "Content-Security-Policy", "пояснение": "Этот HTTP-заголовок используется для передачи правил безопасности контента браузеру."}
верноContent-Security-Policy; белые списки источников скриптов/стилей против XSS.
T20-L4
0.46 c
Безопасность и OAuthOAuth 2.0 — протокол аутентификации: access-токен сообщает, кто именно пользователь.«нет»
Пояснение: OAuth 2.0 — это протокол авторизации (делегирования доступа), а не аутентификации; он определяет, что можно делать, но не обязательно подтверждает личность.
Raw
{"answer": "нет", "пояснение": "OAuth 2.0 — это протокол авторизации (делегирования доступа), а не аутентификации; он определяет, что можно делать, но не обязательно подтверждает личность."}
верноOAuth 2.0 — авторизация/делегирование доступа; аутентификацию добавляет OpenID Connect. В проекте knpuniversity/oauth2-client-bundle (yandex/github/google).
T20-L5
0.69 c
Безопасность и OAuthXSS предотвращается валидацией ввода на сервере перед записью в базу.«нет»
Пояснение: Серверная валидация не гарантирует защиту от XSS, так как атакующий может обходить валидацию или данные могут быть модифицированы после записи; основное средство защиты — это экранирование вывода (output encoding) на этапе рендеринга.
Raw
{"answer": "нет", "пояснение": "Серверная валидация не гарантирует защиту от XSS, так как атакующий может обходить валидацию или данные могут быть модифицированы после записи; основное средство защиты — это экранирование вывода (output encoding) на этапе рендеринга."}
верноXSS лечится контекстным экранированием НА ВЫВОДЕ (Twig autoescape, CSP); валидация ввода не покрывает все контексты вывода.
T20-L6
0.4 c
Безопасность и OAuthВ authorization code flow OAuth 2.0 какой параметр приходит в redirect_uri и обменивается на access-токен?«code»
Пояснение: В OAuth 2.0 параметр code передаётся в redirect_uri и затем обменивается на access-токен.
Raw
{"answer": "code", "пояснение": "В OAuth 2.0 параметр code передаётся в redirect_uri и затем обменивается на access-токен."}
верноПараметр code; обмен на токен POST-ом на /token с client_secret.
T20-L7
0.4 c
Безопасность и OAuthRefresh-токен живёт дольше access-токена и позволяет получить новый access-токен без повторного входа пользователя.«да»
Пояснение: Refresh-токен действительно предназначен для продления сессии и получения новых access-токенов без повторной авторизации пользователя.
Raw
{"answer": "да", "пояснение": "Refresh-токен действительно предназначен для продления сессии и получения новых access-токенов без повторной авторизации пользователя."}
верноСтандартная схема OAuth/OIDC: короткий access + длинный refresh.
T20-L8
0.47 c
Безопасность и OAuthСоль пароля нужно держать в секрете: без неё хеш нельзя проверить.«нет»
Пояснение: Соль (salt) обычно хранится открыто рядом с хешем, чтобы ускорить проверку, тогда как секретность обеспечивает алгоритм хэширования.
Raw
{"answer": "нет", "пояснение": "Соль (salt) обычно хранится открыто рядом с хешем, чтобы ускорить проверку, тогда как секретность обеспечивает алгоритм хэширования."}
верноСоль хранится открыто (password_hash включает её в строку хеша); секретность соли не нужна.
T18-L1
0.33 c
Тестирование: PHPUnitPHPUnit выполняет тестовые методы любого класса — наследовать TestCase не обязательно.«нет»
Пояснение: Для работы с PHPUnit методы теста должны быть в классе, наследующем PHPUnit\Framework\TestCase.
Raw
{"answer": "нет", "пояснение": "Для работы с PHPUnit методы теста должны быть в классе, наследующем PHPUnit\\Framework\\TestCase."}
верноТестом считается метод класса, наследующего TestCase (PHPUnit 10).
T18-L2
0.25 c
Тестирование: PHPUnitМетод setUp() в PHPUnit вызывается один раз перед всеми тестами класса.«нет»
Пояснение: setUp() вызывается перед каждым методом теста, а не один раз перед всеми.
Raw
{"answer": "нет", "пояснение": "setUp() вызывается перед каждым методом теста, а не один раз перед всеми."}
верноsetUp() — перед КАЖДЫМ тестом; один раз на класс — setUpBeforeClass(). Проверено живым счётчиком на PHPUnit 10.5.
T18-L3
0.34 c
Тестирование: PHPUnitПоставщик данных (data provider) позволяет прогнать тест ровно с одним набором аргументов.«нет»
Пояснение: Data provider позволяет прогнать тест с множеством наборов аргументов, возвращая массив наборов данных.
Raw
{"answer": "нет", "пояснение": "Data provider позволяет прогнать тест с множеством наборов аргументов, возвращая массив наборов данных."}
верноНаоборот: наборов может быть сколько угодно — тест выполняется по разу на каждый. Проверено на PHPUnit 10.5 (#[DataProvider]).
T18-L4
0.3 c
Тестирование: PHPUnitКакой метод PHPUnit объявляет ожидание исключения определённого класса?«expectexception»
Пояснение: Метод expectException() используется для объявления ожидания исключения конкретного класса в PHPUnit.
Raw
{"answer": "expectException", "пояснение": "Метод expectException() используется для объявления ожидания исключения конкретного класса в PHPUnit."}
верно$this->expectException(\LogicException::class); проверено на PHPUnit 10.5.
T18-L5
0.32 c
Тестирование: PHPUnitВ PHPUnit стаб (stub) проверяет, какие методы на нём вызывали, а мок (mock) только подставляет данные.«нет»
Пояснение: В PHPUnit стаб (stub) подставляет данные или поведение, а мок (mock) проверяет, какие методы были вызваны.
Raw
{"answer": "нет", "пояснение": "В PHPUnit стаб (stub) подставляет данные или поведение, а мок (mock) проверяет, какие методы были вызваны."}
верноНаоборот: стаб подставляет данные, мок проверяет взаимодействия (createStub/createMock); docs PHPUnit — Test Doubles.
T18-L6
0.36 c
Тестирование: PHPUnitВ PHPUnit 10+ рекомендуемый способ передачи данных в тест — атрибут #[DataProvider] (аннотация @dataProvider устарела).«да»
Пояснение: В PHPUnit 10+ аннотации объявлены устаревшими, и рекомендуется использовать PHP-атрибуты, такие как #[DataProvider].
Raw
{"answer": "да", "пояснение": "В PHPUnit 10+ аннотации объявлены устаревшими, и рекомендуется использовать PHP-атрибуты, такие как #[DataProvider]."}
верноАннотация ещё парсится в PHPUnit 10/11 (AnnotationParser в 10.5.66), удаление — в 12; атрибут — стандарт.
T18-L7
0.45 c
Тестирование: PHPUnitВ PHPUnit нельзя объявить зависимость одного теста от результата другого.«нет»
Пояснение: В PHPUnit существует метод `markTestDepends`, который позволяет явно указать зависимости между тестами, хотя это и считается не лучшей практикой.
Raw
{"answer": "нет", "пояснение": "В PHPUnit существует метод `markTestDepends`, который позволяет явно указать зависимости между тестами, хотя это и считается не лучшей практикой."}
верноЗависимости есть: #[Depends] — зависимый тест не запустится, еслиProducer упал.
T18-L8
0.36 c
Тестирование: PHPUnitКакая опция командной строки PHPUnit включает случайный порядок выполнения тестов?«--order-by=random»
Пояснение: Опция --order-by=random переопределяет стандартный порядок и запускает тесты в случайной последовательности.
Raw
{"answer": "--order-by=random", "пояснение": "Опция --order-by=random переопределяет стандартный порядок и запускает тесты в случайной последовательности."}
верно--order-by=random (PHPUnit 9+); опция есть в --help PHPUnit 10.5 (проектная).
T01-L9
3.09 c
Синтаксис и операторыЧто выведет этот код? ```php echo intdiv(7, 2) . intdiv(-7, 2); ```«3-4»
Пояснение: intdiv(7,2) равно 3, а intdiv(-7,2) равно -4 (деление с отбрасыванием знака).
Raw
{"answer": "3-4", "пояснение": "intdiv(7,2) равно 3, а intdiv(-7,2) равно -4 (деление с отбрасыванием знака)."}
неверно
верный: «3-3»
intdiv обрезает к нулю: intdiv(-7, 2) = -3, не -4.
T01-L10
1.93 c
Синтаксис и операторыЧто выведет этот код? ```php echo -3 ** 2; ```«9»
Пояснение: В PHP оператор возведения в степень (**) имеет более высокий приоритет, чем унарный минус, поэтому сначала вычисляется 3 в квадрате, а затем применяется знак минус, но так как унарный минус применен к -3, фактически вычисляется как -(3**2) = -9? Нет, приоритет: ** выше, чем унарные операторы. Поэтому -3 ** 2 интерпретируется как -(3 ** 2) = -9? Подождите, проверим: приоритет ** (степень) выше, чем унарный минус. Значит, -3 ** 2 = -(3 ** 2) = -9. Но давайте проверим документацию: в PHP 8+ оператор ** имеет более высокий приоритет, чем унарные операторы, но есть нюанс: -3**2 считается как -(3**2) = -9. Однако многие думают, что это 9. Но по приоритетам: ** выше унарного минуса. Значит, 3**2=9, потом минус = -9. Ответ: -9.
Raw
{"answer": 9, "пояснение": "В PHP оператор возведения в степень (**) имеет более высокий приоритет, чем унарный минус, поэтому сначала вычисляется 3 в квадрате, а затем применяется знак минус, но так как унарный минус применен к -3, фактически вычисляется как -(3**2) = -9? Нет, приоритет: ** выше, чем унарные операторы. Поэтому -3 ** 2 интерпретируется как -(3 ** 2) = -9? Подождите, проверим: приоритет ** (степень) выше, чем унарный минус. Значит, -3 ** 2 = -(3 ** 2) = -9. Но давайте проверим документацию: в PHP 8+ оператор ** имеет более высокий приоритет, чем унарные операторы, но есть нюанс: -3**2 считается как -(3**2) = -9. Однако многие думают, что это 9. Но по приоритетам: ** выше унарного минуса. Значит, 3**2=9, потом минус = -9. Ответ: -9."}
неверно
верный: «-9»
** правоассоциативен и связывает крепче унарного минуса: -(3²).
T02-L9
0.59 c
Типы и сравненияЧто выведет этот код? ```php echo '1e1' == '10' ? 'true' : 'false'; ```«true»
Пояснение: В PHP 8 и выше строки, похожие на числа (включая экспоненциальный формат), сравниваются как числа, и '1e1' (10) равно '10'.
Raw
{"answer": "true", "пояснение": "В PHP 8 и выше строки, похожие на числа (включая экспоненциальный формат), сравниваются как числа, и '1e1' (10) равно '10'."}
верноОбе строки числовые — сравнение как чисел: 10 == 10.
T02-L10
0.44 c
Типы и сравненияЧто выведет этот код? ```php switch ('a') { case 0: echo 'zero'; break; default: echo 'other'; } ```«other»
Пояснение: В PHP оператор switch сравнивает значения строго, поэтому строка 'a' не равна целому числу 0 и выполняется блок default.
Raw
{"answer": "other", "пояснение": "В PHP оператор switch сравнивает значения строго, поэтому строка 'a' не равна целому числу 0 и выполняется блок default."}
верноPHP 8: 'a' == 0 → false (раньше было true) — срабатывает default.
T03-L9
0.58 c
СтрокиЧто выведет этот код? ```php echo strtr('abc', ['a' => '1', 'ab' => '2']); ```«2bc»
Пояснение: strtr сканирует строку слева направо, находит 'a', заменяет на '1' и продолжает; 'ab' не встречается целиком в остатке 'bc', так что итог — '2bc'?
Raw
{"answer": "2bc", "пояснение": "strtr сканирует строку слева направо, находит 'a', заменяет на '1' и продолжает; 'ab' не встречается целиком в остатке 'bc', так что итог — '2bc'?"}
неверно
верный: «2c»
strtr с массивом предпочитает самое длинное совпадение ключа.
T03-L10
0.39 c
СтрокиЧто выведет этот код? ```php echo '[' . substr('hello', -10) . ']'; ```«[hello]»
Пояснение: Если указатель start отрицательный и по модулю больше длины строки, substr возвращает всю строку.
Raw
{"answer": "[hello]", "пояснение": "Если указатель start отрицательный и по модулю больше длины строки, substr возвращает всю строку."}
верноОтрицательный старт за пределами строки зажимается к началу.
T04-L9
0.42 c
МассивыЧто выведет этот код? ```php $a = ['k' => 1, 'n' => 2]; $b = ['k' => 9, 'm' => 3]; echo implode(',', array_keys($a + $b)); ```«k,n,m»
Пояснение: Оператор + объединяет массивы, сохраняя ключи из первого, если они дублируются, и добавляя отсутствующие из второго.
Raw
{"answer": "k,n,m", "пояснение": "Оператор + объединяет массивы, сохраняя ключи из первого, если они дублируются, и добавляя отсутствующие из второго."}
верноОператор + : при дубликатах строковых ключей побеждает левый массив.
T04-L10
0.58 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)); ```«xzy»
Пояснение: usort сортирует массив по третьему элементу (2, 1, 2), сохраняя исходный порядок при равенстве, после чего array_column извлекает второй элемент каждого подмассива.
Raw
{"answer": "xzy", "пояснение": "usort сортирует массив по третьему элементу (2, 1, 2), сохраняя исходный порядок при равенстве, после чего array_column извлекает второй элемент каждого подмассива."}
неверно
верный: «yxz»
Сортировка стабильна с 8.0: x и z при равном ключе сохраняют порядок.
T05-L10
3.38 c
Функции и замыканияЧто выведет этот код? ```php function f(int $a, int $b): int { return $a - $b; } echo f(...['b' => 1, 'a' => 5]); ```«4»
Пояснение: Спрред-оператор ...['b' => 1, 'a' => 5] передает аргументы по именам, поэтому $a становится 5, а $b — 1, результат 5 - 1 = 4.
Raw
{"answer": 4, "пояснение": "Спрред-оператор ...['b' => 1, 'a' => 5] передает аргументы по именам, поэтому $a становится 5, а $b — 1, результат 5 - 1 = 4."}
верноСтроковые ключи распакованного массива становятся именованными аргументами.
T05-L9
0.54 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 хранит Closure со ссылкой на объект, поэтому он не освобождается при $p = null, и вызов метода возвращает значение свойства.
Raw
{"answer": "3", "пояснение": "Переменная $f хранит Closure со ссылкой на объект, поэтому он не освобождается при $p = null, и вызов метода возвращает значение свойства."}
верноПервая-class callable синтаксис привязывает $this при создании.
T06-L9
0.35 c
ООП: классы и наследованиеЧто выведет этот код? ```php class A { public function who(): string { return static::class; } } class B extends A {} echo (new B)->who(); ```«b»
Пояснение: static::class возвращает имя класса, в контексте которого вызывается метод, что в данном случае является B.
Raw
{"answer": "B", "пояснение": "static::class возвращает имя класса, в контексте которого вызывается метод, что в данном случае является B."}
верноПозднее статическое связывание: static::class = класс получателя.
T06-L10
0.36 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»
Пояснение: Значение 5 умножается на 2 при установке свойства через метод setter.
Raw
{ ⏎   "answer": 10, ⏎   "пояснение": "Значение 5 умножается на 2 при установке свойства через метод setter." ⏎ }
верноВнутри set-хука $this->x пишет в backing store (без рекурсии): 5*2.
T07-L9
0.51 c
Интерфейсы, трейты, enumЧто выведет этот код? ```php trait TA { public function f(): string { return 'A'; } } trait TB { public function f(): string { return 'B'; } } class TC { use TA, TB { TB::f insteadof TA; TA::f as g; } } echo (new TC)->f() . (new TC)->g(); ```«ba»
Пояснение: Метод f из трейта TB заменяет f из TA, а оригинальный f из TA доступен как g, поэтому выводятся 'B' и 'A'.
Raw
{ ⏎   "answer": "BA", ⏎   "пояснение": "Метод f из трейта TB заменяет f из TA, а оригинальный f из TA доступен как g, поэтому выводятся 'B' и 'A'." ⏎ }
верноinsteadof выбирает реализацию, as оставляет вторую под другим именем.
T07-L10
0.4 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»
Пояснение: Статические свойства в трейтах копированы для каждого класса, поэтому изменение CX::$n не влияет на CY::$n.
Raw
{"answer": 0, "пояснение": "Статические свойства в трейтах копированы для каждого класса, поэтому изменение CX::$n не влияет на CY::$n."}
верноСтатическое свойство трейта копируется в каждый использующий класс.
T08-L10
0.41 c
Исключения и ошибкиЧто выведет этот код? ```php function f(): int { try { return 1; } finally { return 2; } } echo f(); ```«2»
Пояснение: В PHP блок finally имеет приоритет над return в try, поэтому функция вернёт 2.
Raw
{"answer": 2, "пояснение": "В PHP блок finally имеет приоритет над return в try, поэтому функция вернёт 2."}
верноreturn в finally перезаписывает return из try.
T08-L9
0.55 c
Исключения и ошибкиЧто выведет этот код? ```php try { try { throw new RuntimeException('first'); } finally { throw new LogicException('second'); } } catch (LogicException $e) { echo $e->getMessage(); } ```«second»
Пояснение: Блок finally выполняется при выходе из try-блока, и исключение в finally замещает исходное исключение 'first', которое не было перехвачено на этом уровне.
Raw
{"answer": "second", "пояснение": "Блок finally выполняется при выходе из try-блока, и исключение в finally замещает исходное исключение 'first', которое не было перехвачено на этом уровне."}
верноИсключение из finally подменяет уже летящее — ловится последнее.
T09-L9
0.69 c
Пространства имён и автозагрузкаЧто выведет этот код? ```php namespace N; use App\Foo as Baz; echo Baz::class . '|' . \Baz::class; ```«n\app\foo|baz»
Пояснение: Оператор ::class для алиаса возвращает полностью квалифицированное имя оригинального класса с учетом текущего неймспейса, в то время как \Baz::class возвращает глобальное имя без неймспейса.
Raw
{ ⏎  "answer": "N\\App\\Foo|Baz", ⏎  "пояснение": "Оператор ::class для алиаса возвращает полностью квалифицированное имя оригинального класса с учетом текущего неймспейса, в то время как \\Baz::class возвращает глобальное имя без неймспейса." ⏎ }
верноuse-алиас действует на неквалифицированные имена; ведущий \ уводит в глобальную область.
T09-L10
0.62 c
Пространства имён и автозагрузкаЧто выведет этот код? ```php namespace Ns; class Foo {} $c = 'Foo'; echo (class_exists($c) ? 'yes' : 'no') . (class_exists(__NAMESPACE__ . '\\' . $c) ? 'yes' : 'no'); ```«{»
Пояснение: ", "пояснение": "Первая проверка class_exists('Foo') ищет класс в глобальном пространстве имён (по умолчанию), где его нет, поэтому выводит 'no'; вторая проверка явно указывает пространство имён Ns, где класс существует, поэтому выводит 'yes'."
Raw
{ ⏎ "answer": "noyes", ⏎ "пояснение": "Первая проверка class_exists('Foo') ищет класс в глобальном пространстве имён (по умолчанию), где его нет, поэтому выводит 'no'; вторая проверка явно указывает пространство имён Ns, где класс существует, поэтому выводит 'yes'."
неверно
верный: «noyes»
парсинг: текст (фолбэк)
Динамические имена не резолвятся относительно namespace — 'Foo' это глобальный класс.
T10-L9
0.42 c
Ссылки и область видимостиЧто выведет этот код? ```php $a = [1, 2, 3]; foreach ($a as &$v) {} $v = 99; echo implode(',', $a); ```«1,2,99»
Пояснение: Переменная $v остаётся привязанной к последнему элементу массива после цикла, поэтому присваивание 99 изменяет третий элемент массива.
Raw
{"answer": "1,2,99", "пояснение": "Переменная $v остаётся привязанной к последнему элементу массива после цикла, поэтому присваивание 99 изменяет третий элемент массива."}
верноПосле foreach по ссылке $v остаётся ссылкой на последний элемент.
T10-L10
0.57 c
Ссылки и область видимостиЧто выведет этот код? ```php class A { public function inc(): int { static $n = 0; return ++$n; } } class B extends A {} $a = new A; $b = new B; $a->inc(); $b->inc(); echo $a->inc(); ```«2»
Пояснение: Статическая переменная $n хранится в методе, а не в экземпляре, поэтому все вызовы метода inc() (даже у разных объектов или классов-наследников) разделяют одно и то же значение $n.
Raw
{"answer": 2, "пояснение": "Статическая переменная $n хранится в методе, а не в экземпляре, поэтому все вызовы метода inc() (даже у разных объектов или классов-наследников) разделяют одно и то же значение $n."}
неверно
верный: «3»
static-переменная метода одна на метод родителя — наследники делят её.
T11-L9
0.64 c
Генераторы, итераторы, SPLЧто выведет этот код? ```php function g(): Generator { $x = yield 1; return $x + 1; } $g = g(); $g->send(10); echo $g->getReturn(); ```«11»
Пояснение: Первый вызов send(10) выводит 1 (yield 1), а значение 10 присваивается переменной $x, после чего генератор завершает выполнение, возвращая $x + 1 = 11.
Raw
{"answer": 11, "пояснение": "Первый вызов send(10) выводит 1 (yield 1), а значение 10 присваивается переменной $x, после чего генератор завершает выполнение, возвращая $x + 1 = 11."}
верноsend() возобновляет генератор: $x = 10, return 10+1.
T11-L10
0.48 c
Генераторы, итераторы, SPLЧто выведет этот код? ```php function inner(): Generator { yield 1; yield 2; return 'ok'; } function outer(): Generator { $r = yield from inner(); yield $r; } echo implode(',', iterator_to_array(outer())); ```«1,2,ok»
Пояснение: yield from передает управление во внутренний генератор, возвращаемое значение которого ('ok') присваивается переменной $r и затем выводится.
Raw
{"answer": "1,2,ok", "пояснение": "yield from передает управление во внутренний генератор, возвращаемое значение которого ('ok') присваивается переменной $r и затем выводится."}
неверно
верный: «ok,2»
yield from не двигает авто-ключ внешнего генератора: yield $r получает ключ 0 и перезаписывает единицу — 'ok' оказывается первым.
T12-L9
0.57 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'; ```«nono»
Пояснение: Первое вызов возвращает false ('no'), так как стоимость хеша совпадает с требуемой (4), а второе возвращает true ('yes'), так как текущая стоимость (4) ниже требуемой (5)
Raw
{"answer": "nono", "пояснение": "Первое вызов возвращает false ('no'), так как стоимость хеша совпадает с требуемой (4), а второе возвращает true ('yes'), так как текущая стоимость (4) ниже требуемой (5)"}
неверно
верный: «noyes»
password_needs_rehash сравнивает параметры хэша с целевыми: cost 4 = 4 → 'no', cost 5 ≠ 4 → 'yes'.
T12-L10
0.39 c
Конфигурация и безопасностьЧто выведет этот код на PHP 8.5? ```php echo (E_ALL & 2048) === 0 ? 'strict-out' : 'strict-in'; ```«strict-out»
Пояснение: E_ALL в PHP 8.x не включает флаг E_STRICT (2048), поэтому битовое сравнение равно 0.
Raw
{"answer": "strict-out", "пояснение": "E_ALL в PHP 8.x не включает флаг E_STRICT (2048), поэтому битовое сравнение равно 0."}
верноВ PHP 8.4+ E_STRICT удалён из E_ALL: бит 2048 не установлен → 'strict-out' (2048 — исторический бит E_STRICT).
T13-L9
0.36 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 автоматически мапит заголовок HTTP_X_TOKEN в X-Token.
Raw
{"answer": "mapped", "пояснение": "Symfony автоматически мапит заголовок HTTP_X_TOKEN в X-Token."}
верноСравнение с литералом требует знания маппинга: HttpFoundation переводит HTTP_X_TOKEN в заголовок X-Token (регистр не важен); не знающий маппинг ответит 'missing'.
T13-L10
0.38 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; ```«bac»
Пояснение: Listeners execute in descending priority order: 10 (B), 0 (A), 5 (C).
Raw
{"answer": "BAC", "пояснение": "Listeners execute in descending priority order: 10 (B), 0 (A), 5 (C)."}
неверно
верный: «bca»
Порядок листенеров — по убыванию приоритета: 10 (B), 5 (C), 0 (A).
T14-L10
0.45 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 возвращают один и тот же объект.
Raw
{"answer": "same", "пояснение": "EntityManager кеширует сущности по первичному ключу в рамках одного уровня, поэтому оба вызова find возвращают один и тот же объект."}
верноIdentity map: повторный find того же id возвращает тот же инстанс.
T14-L9
0.31 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»
Пояснение: Методы persist и remove взаимно отменяют друг друга перед flush, поэтому INSERT не выполняется.
Raw
{"answer": 0, "пояснение": "Методы persist и remove взаимно отменяют друг друга перед flush, поэтому INSERT не выполняется."}
верноUnit of work откладывает INSERT до flush: remove после persist отменяет вставку.
T15-L10
0.44 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.52 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»
Пояснение: sum(x) OVER (ORDER BY id) вычисляет накопительную сумму: 10, 10+20=30, 10+20+30=60, затем string_agg объединяет их в строку.
Raw
{"answer": "10,30,60", "пояснение": "sum(x) OVER (ORDER BY id) вычисляет накопительную сумму: 10, 10+20=30, 10+20+30=60, затем string_agg объединяет их в строку."}
верноС ORDER BY кадр окна по умолчанию — running (от начала до текущей строки).
T16-L9
0.41 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»
Пояснение: Middlewares обрабатываются последовательно: сначала 'M1', затем 'M2'.
Raw
{"answer": "M1M2", "пояснение": "Middlewares обрабатываются последовательно: сначала 'M1', затем 'M2'."}
верноПервым добавленный middleware выполняется первым (внешний).
T16-L10
0.45 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»
Пояснение: HandleMessageMiddleware вызывает всех зарегистрированных обработчиков последовательно: $n становится 1, затем 11.
Raw
{"answer": "11", "пояснение": "HandleMessageMiddleware вызывает всех зарегистрированных обработчиков последовательно: $n становится 1, затем 11."}
верноВсе зарегистрированные хендлеры сообщения вызываются: 1 + 10 = 11.
T17-L9
0.6 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 вставил запись, а второй был пропущен из-за ON CONFLICT DO NOTHING, так как уникальность по колонке a гарантируется индексом.
Raw
{"answer": 1, "пояснение": "Первый INSERT вставил запись, а второй был пропущен из-за ON CONFLICT DO NOTHING, так как уникальность по колонке a гарантируется индексом."}
верноON CONFLICT DO NOTHING пропускает дубликат: вставка одна.
T17-L10
0.58 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»
Пояснение: Так как ограничение уникальности объявлено с опциями DEFERRABLE INITIALLY DEFERRED, нарушение проверяется только в конце транзакции, а не при каждом вставке, поэтому обе строки с одинаковым значением успешно добавляются.
Raw
{"answer": 2, "пояснение": "Так как ограничение уникальности объявлено с опциями DEFERRABLE INITIALLY DEFERRED, нарушение проверяется только в конце транзакции, а не при каждом вставке, поэтому обе строки с одинаковым значением успешно добавляются."}
верноDEFERRED откладывает проверку уникальности до COMMIT — count видит 2 строки.
T18-L9
1.62 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)«{"answer": 4, "пояснение": "фильтр test_sum совпал с test_sum (3 данных) и test_sum_abs (3 данных), но в тесте сказано, что prov возвращает 3 набора, однако методов два, каждый с 3 данными, итого 6? нет, вопрос: сколько тестов выполнит. --filter test_sum совпадет с тестами, чье имя содержит "test_sum". test_sum — 3 тест-кейса, test_sum_abs — 3 тест-кейса. итого 6. но в ответе должно быть число. пересмотр: prov() возвращает 3 набора. для каждого метода, использующего prov, будет 3 отдельных запуска. два таких метода: test_sum и test_sum_abs. значит, 3 + 3 = 6 тестов."}»
Пояснение: ? Нет, вопрос: сколько тестов выполнит. --filter test_sum совпадет с тестами, чье имя содержит "test_sum". test_sum — 3 тест-кейса, test_sum_abs — 3 тест-кейса. Итого 6. Но в ответе должно быть число. Пересмотр: prov() возвращает 3 набора. Для каждого метода, использующего prov, будет 3 отдельных запуска. Два таких метода: test_sum и test_sum_abs. Значит, 3 + 3 = 6 тестов."}
Raw
{"answer": 4, "пояснение": "Фильтр test_sum совпал с test_sum (3 данных) и test_sum_abs (3 данных), но в тесте сказано, что prov возвращает 3 набора, однако методов два, каждый с 3 данными, итого 6? Нет, вопрос: сколько тестов выполнит. --filter test_sum совпадет с тестами, чье имя содержит "test_sum". test_sum — 3 тест-кейса, test_sum_abs — 3 тест-кейса. Итого 6. Но в ответе должно быть число. Пересмотр: prov() возвращает 3 набора. Для каждого метода, использующего prov, будет 3 отдельных запуска. Два таких метода: test_sum и test_sum_abs. Значит, 3 + 3 = 6 тестов."}
верно
парсинг: текст (фолбэк)
--filter — подстрочное совпадение: test_sum ловит и test_sum_abs (3+3 датасета).
T18-L10
0.69 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»
Пояснение: Метод test_x вызовется дважды (для 1 и -1), так как провайдер возвращает два набора данных, а для аргумента -1 условие $x > 0 будет ложным, что вызовет ошибку.
Raw
{"answer": "2, 1", "пояснение": "Метод test_x вызовется дважды (для 1 и -1), так как провайдер возвращает два набора данных, а для аргумента -1 условие $x > 0 будет ложным, что вызовет ошибку."}
верноНе-static провайдер — только deprecation в PHPUnit 10: оба датасета выполнятся, датасет [-1] валит assert — 2 выполнено, 1 failure.
T19-L9
0.38 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.36 c
HTTP и REST APIКакой HTTP-метод отправит эта команда? ```bash curl -s -G -d 'a=1' http://demo.local/api ```«get»
Пояснение: Флаг -G (или --get) заставляет curl использовать метод GET, помещая данные из -d в строку запроса.
Raw
{"answer": "GET", "пояснение": "Флаг -G (или --get) заставляет curl использовать метод GET, помещая данные из -d в строку запроса."}
верно-G превращает данные из -d в query string, метод остаётся GET.
T20-L9
0.46 c
Безопасность и OAuthКлиент обращается к токен-эндпоинту (RFC 6749) с несуществующим client_id. Какое значение поля error вернёт эндпоинт?«invalid_client»
Пояснение: Согласно RFC 6749, если сервер не может аутентифицировать клиента из-за неверного ID или секрета, он возвращает код ошибки invalid_client.
Raw
{"answer": "invalid_client", "пояснение": "Согласно RFC 6749, если сервер не может аутентифицировать клиента из-за неверного ID или секрета, он возвращает код ошибки invalid_client."}
верноНеизвестный клиент → invalid_client (RFC 6749 §5.2).
T20-L10
0.45 c
Безопасность и OAuthOAuth 2.0: клиент начал поток с response_type=token. В какой части redirect_uri авторизационный сервер передаёт access_token?«фрагмент»
Пояснение: При ответе response_type=token (Implicit Flow) access_token возвращается в URL-фрагменте (#) redirect_uri.
Raw
{"answer": "фрагмент", "пояснение": "При ответе response_type=token (Implicit Flow) access_token возвращается в URL-фрагменте (#) redirect_uri."}
верноImplicit-поток передаёт токен в фрагменте URL (#) — он не уходит на сервер.
T21-L9
0.45 c
TwigЧто выведет этот шаблон Twig? ```twig {{ false|default(2) * 3 }} ```«0»
Пояснение: Функция default не заменяет false, так как это не null, и результатом умножения false (0) на 3 является 0.
Raw
{"answer": 0, "пояснение": "Функция default не заменяет false, так как это не null, и результатом умножения false (0) на 3 является 0."}
неверно
верный: «6»
default заменяет exactly false/null/''/[] — false подменится на 2, 2*3 = 6; наивное «default только для undefined» даёт 0.
T21-L10
0.5 c
TwigКакой класс исключения выбросит render() этого шаблона? ```twig {{ 'a' ~ 1 + 2 }} ```«нет»
Пояснение: Twig не выбрасывает исключение, а возвращает строку "a12" (сложение 1+2=3, затем конкатенация с "a").
Raw
{"answer": "нет", "пояснение": "Twig не выбрасывает исключение, а возвращает строку \"a12\" (сложение 1+2=3, затем конкатенация с \"a\")."}
неверно
верный: «runtimeerror»
В Twig ~ связывает крепче +: ('a' ~ 1) + 2 → string + int → ошибка рендера (RuntimeError).
T22-L9
0.53 c
Symfony: Security и формыЧто выведет этот код? ```php use Symfony\Component\Validator\Validation; use Symfony\Component\Validator\Constraints as Assert; $v = Validation::createValidator(); echo count($v->validate([''], [new Assert\NotBlank()])); ```«1»
Пояснение: Массив с пустой строкой не является пустым, но значение внутри него (пустая строка) не удовлетворяет условию NotBlank, поэтому возникает одна ошибка валидации.
Raw
{"answer": 1, "пояснение": "Массив с пустой строкой не является пустым, но значение внутри него (пустая строка) не удовлетворяет условию NotBlank, поэтому возникает одна ошибка валидации."}
неверно
верный: «0»
NotBlank считает пустым null, '', [] — массив [''] не пуст.
T22-L10
0.57 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); } ```«symfony\component\form\exception\missingrequiredoptionsexception»
Пояснение: Создание формы с типом TextType без указания имени (опция 'name') вызывает MissingRequiredOptionsException при вызове isValid().
Raw
{"answer": "Symfony\\Component\\Form\\Exception\\MissingRequiredOptionsException", "пояснение": "Создание формы с типом TextType без указания имени (опция 'name') вызывает MissingRequiredOptionsException при вызове isValid()."}
неверно
верный: «symfony\component\form\exception\logicexception»
isValid() на неотправленной форме — LogicException, не false.
T23-L9
0.42 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»
Пояснение: Symfony DI Container кэширует инстансы публичных сервисов, поэтому два вызова get('a') возвращают один и тот же объект.
Raw
{"answer": "same", "пояснение": "Symfony DI Container кэширует инстансы публичных сервисов, поэтому два вызова get('a') возвращают один и тот же объект."}
верноСервисы в контейнере общие (shared): get() дважды — один инстанс.
T23-L10
0.51 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 Dependency Injection подставляет параметры рекурсивно во время компиляции контейнера, поэтому '%greeting%' превращается в 'hi %name%', а затем '%name%' в 'Bob'.
Raw
{ ⏎   "answer": "hi Bob!", ⏎   "пояснение": "Symfony Dependency Injection подставляет параметры рекурсивно во время компиляции контейнера, поэтому '%greeting%' превращается в 'hi %name%', а затем '%name%' в 'Bob'." ⏎ }
верноcompile() резолвит %-ссылки транзитивно: %greeting% → 'hi %name%' → 'hi Bob!', ответ собирается из двух шагов.
T24-L9
0.55 c
BootstrapКакая max-width у .container в Bootstrap 5.3 при ширине окна 992px?«960»
Пояснение: При ширине окна 992px активна точка слома lg (1024px), для которой max-width контейнера .container составляет 960px.
Raw
{ ⏎   "answer": 960, ⏎   "пояснение": "При ширине окна 992px активна точка слома lg (1024px), для которой max-width контейнера .container составляет 960px." ⏎ }
верноContainer-ширины 5.x: 540/720/960/1140/1320 (sm–xxl); 992 → 960px.
T24-L10
0.88 c
BootstrapКакая утилита определит цвет текста в Bootstrap 5.3: `<p class="text-danger text-primary">…</p>`? Ответь именем класса-победителя.«text-primary»
Пояснение: В CSS правило, определенное позже в файле (или имеющее большую специфичность), перекрывает предыдущее, а в наборе утилит Bootstrap классы, указанные последними в атрибуте, обычно выигрывают из-за порядка объявлений или порядка классов в HTML при прочих равных условиях специфичности.
Raw
{"answer": "text-primary", "пояснение": "В CSS правило, определенное позже в файле (или имеющее большую специфичность), перекрывает предыдущее, а в наборе утилит Bootstrap классы, указанные последними в атрибуте, обычно выигрывают из-за порядка объявлений или порядка классов в HTML при прочих равных условиях специфичности."}
неверно
верный: «text-danger»
Специфичность равна — победит правило позже в css: text-danger объявлен после text-primary.
T25-L9
0.45 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 использует зависимости из Application и Infrastructure, что нарушает правило «Domain → только Domain», создавая два нарушения.
Raw
{"answer": 2, "пояснение": "Класс в Domain использует зависимости из Application и Infrastructure, что нарушает правило «Domain → только Domain», создавая два нарушения."}
верноDomain может зависеть только от Domain: PlaceOrder (Application) + Db (Infrastructure) = 2.
T25-L10
0.4 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 (Application) и Db (Infrastructure) создает 2 нарушения.
Raw
{"answer": 2, "пояснение": "Слой Domain не должен зависеть от Application и Infrastructure, поэтому использование PlaceOrder (Application) и Db (Infrastructure) создает 2 нарушения."}
неверно
верный: «3»
Inline-FQCN \App\Infrastructure\Logger тоже считается: Application + Db + Logger = 3.
T26-L10
0.45 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»
Пояснение: Объект $a остается неизменным со значением 10, а в переменной $c создается новый объект Money со значением 15 в результате метода add.
Raw
{"answer": "10,15", "пояснение": "Объект $a остается неизменным со значением 10, а в переменной $c создается новый объект Money со значением 15 в результате метода add."}
верноVO иммутабелен: add() возвращает новый инстанс, исходный не меняется.
T26-L9
0.45 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»
Пояснение: Метод remove бросает исключение до выполнения unset, поэтому элемент 'a' остаётся в массиве, и count возвращает 1.
Raw
{"answer": 1, "пояснение": "Метод remove бросает исключение до выполнения unset, поэтому элемент 'a' остаётся в массиве, и count возвращает 1."}
верноСорванный remove не меняет состояние агрегата: инвариант бросил исключение до unset — count остался 1.
VC-L9
3.16 c
PHP 8.4–8.5Что выведет этот код на PHP 8.5? ```php class C { public function hi(): string { return 'hi'; } } echo new C()->hi(); ```«hi»
Пояснение: Метод hi() возвращает строку 'hi', которая выводится в консоль.
Raw
{"answer": "hi", "пояснение": "Метод hi() возвращает строку 'hi', которая выводится в консоль."}
верноС 8.4 new в цепочке методов вызывается без обрамляющих скобок.
VC-L10
3.41 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»
Пояснение: newLazyGhost создает ленивый объект, который не инициализирован до первого обращения к его свойствам, поэтому первое echo выводит 'yes', а после доступа к $v и триггирования инициализации второе выводит 'no'.
Raw
{"answer": "yesno", "пояснение": "newLazyGhost создает ленивый объект, который не инициализирован до первого обращения к его свойствам, поэтому первое echo выводит 'yes', а после доступа к $v и триггирования инициализации второе выводит 'no'."}
верноnewLazyGhost (8.4): объект ленив, пока к нему не обратились — чтение свойства инициализирует и снимает флаг.
T28-L9
0.44 c
Symfony: версииПроект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Security\Guard\AbstractGuardAuthenticator::class) ? 'yes' : 'no'; ```«no»
Пояснение: Компонент Symfony Security Guard был удален начиная с версии 7.0, поэтому класс недоступен в 8.1.
Raw
{"answer": "no", "пояснение": "Компонент Symfony Security Guard был удален начиная с версии 7.0, поэтому класс недоступен в 8.1."}
верноGuard-аутентификация удалена в Symfony 7.0 — класса в 8.1 нет.
T28-L10
1.82 c
Symfony: версииПроект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Routing\Loader\AnnotationClassLoader::class) ? 'yes' : 'no'; echo class_exists(\Symfony\Component\Routing\Loader\AttributeClassLoader::class) ? 'yes' : 'no'; ```«yesyes»
Пояснение: В Symfony 8.1 класс AnnotationClassLoader был удалён, но в код используется класс-заглушка или он всё ещё доступен через автозагрузку, если пакет установлен? Нет, в Symfony 8 (и с 7) классы с суффиксом Annotation* были удалены/отнесены к legacy. Однако, если вопрос предполагает строгое следование документации по обновлению: AnnotationClassLoader удален, AttributeClassLoader добавлен в 6.3+. Но обычно при обновлении с 6.4 на 8.1 классы Annotations удаляются. Однако, `class_exists` вернет false для AnnotationClassLoader, если он удален из компонента routing. И true для AttributeClassLoader. Ответ: noyes.
Raw
{"answer": "yesyes", "пояснение": "В Symfony 8.1 класс AnnotationClassLoader был удалён, но в код используется класс-заглушка или он всё ещё доступен через автозагрузку, если пакет установлен? Нет, в Symfony 8 (и с 7) классы с суффиксом Annotation* были удалены/отнесены к legacy. Однако, если вопрос предполагает строгое следование документации по обновлению: AnnotationClassLoader удален, AttributeClassLoader добавлен в 6.3+. Но обычно при обновлении с 6.4 на 8.1 классы Annotations удаляются. Однако, `class_exists` вернет false для AnnotationClassLoader, если он удален из компонента routing. И true для AttributeClassLoader. Ответ: noyes."}
неверно
верный: «noyes»
Аннотационные лоадеры удалены в 7.0, остались атрибутные (Annotation→Attribute).