Карта знаний PHP — qwen3.8:latest, run-03 · think: off

Оценка: PHP 96.9% · PHP+версии 89.3% · Symfony 93.8% · Symfony+версии 93.8% · БД и ORM 95.8% · Архитектура 81.2% · Фронтенд 81.2% · HTTP 100.0% · Безопасность 100.0% · Тесты 75.0% · Глубина 75.0% · Всего 90.0%
Разобрано JSON: 99.3% (294 из 296)
По зонам: База 93.3% · PHP 8.4–8.5 56.2% · Будущее 81.2% · Глубина 75.0%
Точность: 216 / 240 (+ глубина 42 / 56)
Разобрано ответов: 295 / 240 (не по JSON-формату: 2 · без вердикта: -55)
Ответов «да»: 51.1% (баланс вопросника 50/50, базлайн константного ответа — 50%)
Время: 2.4 мин (0.41 c на клетку — медиана)
Цена: $0.017
Токены: 42548 вх / 15869 вых (кэш: 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)?
Модель: «{"answer": "сумма: 5", "пояснение": "оператор . имеет более высокий приоритет, чем +, поэтому сначала конкатенируется строка и число 2, затем к результату прибавляется 3 (строка приводится к числу 0, но так как левая часть начинается с буквы, она воспринимается как 0, однако в php 8 кастинг строки 'сумма: 2' к числу дает 0, и 0+3=3? нет, оператор . возвращает строку. строка 'сумма: 2' + 3. в php сложение строки и числа приводит строку к числу. строка 'сумма: 2' начинается с не-цифры, поэтому приводится к 0. 0 + 3 = 3. но wait, let's re-evaluate precedence. . is higher than +. so it is ('сумма: ' . 2) + 3. 'сумма: ' . 2 becomes 'сумма: 2'. then 'сумма: 2' + 3. in php, if you add a number to a string, the string is cast to a number. 'сумма: 2' starts with a letter, so it is cast to 0. 0 + 3 = 3. echo 3. result is '3'. let me double check. if the string is not numeric, it is 0. so result is 3. wait, is it? let's check php docs or common sense. 'abc' + 1 is 1. '1abc' + 1 is 2. 'abc1' + 1 is 1. 'сумма: 2' is non-numeric start, so 0. 0+3=3. so the output is '3'. let's verify. actually, i should be careful. the expression is `echo 'сумма: ' . 2 + 3;`. precedence: `. ` is higher than `+`. so it evaluates to `('сумма: ' . 2) + 3`. `'сумма: ' . 2` is `'сумма: 2'`. then `'сумма: 2' + 3`. php casts the string to a number. since it starts with a letter, it becomes 0. 0 + 3 = 3. so echo outputs 3»
Верный ответ: сумма: 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
10/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']); ```
Модель: «12c»
Верный ответ: 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)?
Модель: «[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)); ```
Модель: «xyz»
Верный ответ: yxz
9/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
10/10
Интерфейсы, трейты, enum
T07-L1 · Интерфейсы, трейты, enum
Интерфейс может объявлять константы.
Модель: «да»
Верный ответ: да
T07-L2 · Интерфейсы, трейты, enum
Какой оператор проверяет, что объект реализует класс или интерфейс?
Модель: «instanceof»
Верный ответ: instanceof
T07-L3 · Интерфейсы, трейты, enum
Интерфейс может объявлять статические методы.
Модель: «да»
Верный ответ: да
T07-L4 · Интерфейсы, трейты, enum
Оператор instanceof проверяет только наследование классов: интерфейсы он не учитывает.
Модель: «нет»
Верный ответ: нет
T07-L5 · Интерфейсы, трейты, enum
Метод интерфейса может иметь реализацию по умолчанию, как метод трейта.
Модель: «нет»
Верный ответ: нет
T07-L6 · Интерфейсы, трейты, enum
Абстрактный метод в абстрактном классе может иметь видимость protected.
Модель: «да»
Верный ответ: да
T07-L7 · Интерфейсы, трейты, enum
Сколько элементов вернёт Foo::cases() для enum Foo { case A; case B; case C; }?
Модель: «3»
Верный ответ: 3
T07-L8 · Интерфейсы, трейты, enum
Трейт может объявлять константы.
Модель: «да»
Верный ответ: да
T07-L9 · Интерфейсы, трейты, enum
Что выведет этот код? ```php trait TA { public function f(): string { return 'A'; } } trait TB { public function f(): string { return 'B'; } } class TC { use TA, TB { TB::f insteadof TA; TA::f as g; } } echo (new TC)->f() . (new TC)->g(); ```
Модель: «ba»
Верный ответ: ba
T07-L10 · Интерфейсы, трейты, enum
Что выведет этот код? ```php trait Counter { public static int $n = 0; } class CX { use Counter; } class CY { use Counter; } CX::$n = 1; echo CY::$n; ```
Модель: «1»
Верный ответ: 0
9/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\baz|baz»
Верный ответ: app\foo|baz
T09-L10 · Пространства имён и автозагрузка
Что выведет этот код? ```php namespace Ns; class Foo {} $c = 'Foo'; echo (class_exists($c) ? 'yes' : 'no') . (class_exists(__NAMESPACE__ . '\\' . $c) ? 'yes' : 'no'); ```
Модель: «noyes»
Верный ответ: noyes
8/10
Ссылки и область видимости
T10-L1 · Ссылки и область видимости
Массивы при присваивании копируются, а не передаются по ссылке.
Модель: «да»
Верный ответ: да
T10-L2 · Ссылки и область видимости
Что выведет: $a = [1, 2]; $b = $a; $b[] = 3; echo count($a);
Модель: «2»
Верный ответ: 2
T10-L3 · Ссылки и область видимости
Внутри функции пользовательские переменные глобальной области недоступны без global, $GLOBALS или передачи параметром.
Модель: «да»
Верный ответ: да
T10-L4 · Ссылки и область видимости
unset($GLOBALS['x']) внутри функции удаляет глобальную переменную только для этой функции.
Модель: «да»
Верный ответ: нет
T10-L5 · Ссылки и область видимости
Что выведет: function inc(&$x) { $x++; } $n = 5; inc($n); echo $n;
Модель: «6»
Верный ответ: 6
T10-L6 · Ссылки и область видимости
Foreach по массиву (по значению) работает с «живым» массивом: изменения массива внутри цикла видны в этом же проходе.
Модель: «нет»
Верный ответ: нет
T10-L7 · Ссылки и область видимости
Статическое свойство класса у каждого экземпляра своё: изменения в одном объекте не видны в других.
Модель: «нет»
Верный ответ: нет
T10-L8 · Ссылки и область видимости
Массив может иметь булев ключ true, и он сохранится как bool.
Модель: «нет»
Верный ответ: нет
T10-L9 · Ссылки и область видимости
Что выведет этот код? ```php $a = [1, 2, 3]; foreach ($a as &$v) {} $v = 99; echo implode(',', $a); ```
Модель: «1,2,3»
Верный ответ: 1,2,99
T10-L10 · Ссылки и область видимости
Что выведет этот код? ```php class A { public function inc(): int { static $n = 0; return ++$n; } } class B extends A {} $a = new A; $b = new B; $a->inc(); $b->inc(); echo $a->inc(); ```
Модель: «3»
Верный ответ: 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())); ```
Модель: «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'; ```
Модель: «noyes»
Верный ответ: noyes
T12-L10 · Конфигурация и безопасность
Что выведет этот код на PHP 8.5? ```php echo (E_ALL & 2048) === 0 ? 'strict-out' : 'strict-in'; ```
Модель: «strict-in»
Верный ответ: strict-out
9/10
PHP 8.4–8.5
VC-L1 · PHP 8.4–8.5
В какой версии PHP появилась функция array_find()?
Модель: «нет»
Верный ответ: 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.5
VC-L5 · PHP 8.4–8.5
В какой версии PHP впервые появился оператор конвейера |> (pipe)? Ответь номером версии.
Модель: «8.1»
Верный ответ: 8.5
VC-L6 · PHP 8.4–8.5
В какой версии PHP появился clone-with — синтаксис clone($obj, ['x' => 1])? Ответь номером версии.
Модель: «8.4»
Верный ответ: 8.5
VC-L7 · PHP 8.4–8.5
В какой версии PHP появились функции array_first() и array_last()?
Модель: «8.1»
Верный ответ: 8.5
VC-L8 · PHP 8.4–8.5
Для какой версии PHP был принят RFC Partial Function Application v2 (по состоянию на 07.11.2026)? Ответь номером версии.
Модель: «8.5»
Верный ответ: 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
4/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] в ядро был принят.
Модель: «да»
Верный ответ: да
5/8
Чистая архитектура
T25-L1 · Чистая архитектура
Правило зависимостей в чистой и луковичной архитектурах: внутренние слои не знают о внешних — зависимости направлены к центру.
Модель: «да»
Верный ответ: да
T25-L2 · Чистая архитектура
Сущности домена не импортируют ни Doctrine, ни Symfony — только язык и, возможно, стандартную библиотеку.
Модель: «да»
Верный ответ: да
T25-L3 · Чистая архитектура
Контроллеры и Twig-шаблоны относятся к слою бизнес-логики, потому что именно они вызывают use cases.
Модель: «нет»
Верный ответ: нет
T25-L4 · Чистая архитектура
Что находится в самом центре луковичной архитектуры?
Модель: «ядро»
Верный ответ: доменная модель
T25-L5 · Чистая архитектура
Нарушение границ слоёв можно поймать автоматикой: анализатор зависимостей между слоями (например, deptrac) падает на запрещённом вызове.
Модель: «да»
Верный ответ: да
T25-L6 · Чистая архитектура
Use case (interactor) может принимать HTTP-запрос или EntityManager как аргументы — так проще.
Модель: «нет»
Верный ответ: нет
T25-L7 · Чистая архитектура
Как называется компонент, предоставляющий коллекцию агрегатов/сущностей, скрывая механизм хранения за интерфейсом?
Модель: «repository»
Верный ответ: репозиторий
T25-L8 · Чистая архитектура
Замена PostgreSQL на другую БД в чистой архитектуре затрагивает только внешний слой — домен и use cases не меняются.
Модель: «да»
Верный ответ: да
T25-L9 · Чистая архитектура
Слои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class OrderService { public function __construct( private PlaceOrder $handler, private Db $db, ) {} } ```
Модель: «2»
Верный ответ: 2
T25-L10 · Чистая архитектура
Слои: Domain, Application, Infrastructure. Правила deptrac: Application → Domain; Infrastructure → Domain, Application; Domain → только Domain. Сколько нарушений (Violations) покажет deptrac для этого класса? ```php namespace App\Domain; use App\Application\PlaceOrder; use App\Infrastructure\Db; class BillingService { public function __construct( private PlaceOrder $handler, private Db $db, private \App\Infrastructure\Logger $logger, ) {} } ```
Модель: «3»
Верный ответ: 3
9/10
DDD
T26-L1 · DDD
Агрегат в DDD — это просто другое название таблицы базы данных.
Модель: «нет»
Верный ответ: нет
T26-L2 · DDD
Value Object неизменяем и сравнивается по значениям полей, а не по идентификатору.
Модель: «да»
Верный ответ: да
T26-L3 · DDD
Как называется единственная точка внешнего входа в агрегат, через которую проходят все изменения?
Модель: «aggregator»
Верный ответ: aggregate root
T26-L4 · DDD
В DDD репозиторий объявляется на агрегат (его корень), а не на каждую сущность.
Модель: «да»
Верный ответ: да
T26-L5 · DDD
Ubiquitous language — единый язык модели, общий для разработчиков и предметных экспертов.
Модель: «да»
Верный ответ: да
T26-L6 · DDD
Как называется граница, внутри которой модель и её язык едины, а снаружи те же понятия — другие модели?
Модель: «контекст»
Верный ответ: bounded context
T26-L7 · DDD
Анемичная модель (объекты только с геттерами/сеттерами, логика в сервисах) — рекомендуемый стиль DDD.
Модель: «нет»
Верный ответ: нет
T26-L8 · DDD
Bounded context означает, что у каждого контекста своя модель: одно и то же понятие в разных контекстах — разные классы.
Модель: «да»
Верный ответ: да
T26-L9 · DDD
Что выведет этот код? ```php final class Order { private array $items = []; public function add(string $sku): void { $this->items[$sku] = true; } public function count(): int { return count($this->items); } public function remove(string $sku): void { if (count($this->items) === 1) { throw new DomainException('last item'); } unset($this->items[$sku]); } } $o = new Order; $o->add('a'); try { $o->remove('a'); } catch (DomainException) { } echo $o->count(); ```
Модель: «1»
Верный ответ: 1
T26-L10 · DDD
Что выведет этот код? ```php final class Money { public function __construct(public readonly int $amount) {} public function add(Money $o): Money { return new self($this->amount + $o->amount); } } $a = new Money(10); $c = $a->add(new Money(5)); echo $a->amount . ',' . $c->amount; ```
Модель: «10,15»
Верный ответ: 10,15
8/10
Symfony
T13-L1 · Symfony
Сервисы в DI-контейнере Symfony по умолчанию создаются лениво — при первом обращении к ним.
Модель: «да»
Верный ответ: да
T13-L2 · Symfony
Какая консольная команда Symfony выводит список всех зарегистрированных маршрутов?
Модель: «php 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; ```
Модель: «cba»
Верный ответ: bca
9/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()])); ```
Модель: «0»
Верный ответ: 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\runtimeexception»
Верный ответ: symfony\component\form\exception\logicexception
9/10
Symfony: конфигурация и сервисы
T23-L1 · Symfony: конфигурация и сервисы
Конфигурация бандлов Symfony лежит в config/packages — по одному файлу на бандл или тему.
Модель: «да»
Верный ответ: да
T23-L2 · Symfony: конфигурация и сервисы
Файл .env с dev-дефолтами коммитится в репозиторий, а настоящие секреты живут в некоммитимом .env.local.
Модель: «да»
Верный ответ: да
T23-L3 · Symfony: конфигурация и сервисы
Какая команда Symfony выводит зарегистрированные сервисы контейнера и их алиасы?
Модель: «bin/console debug:autowiring»
Верный ответ: debug:container
T23-L4 · Symfony: конфигурация и сервисы
Контейнер Symfony позволяет менять параметры в рантайме: $container->setParameter() работает из контроллера.
Модель: «нет»
Верный ответ: нет
T23-L5 · Symfony: конфигурация и сервисы
По умолчанию сервисы в Symfony публичны (public: true) — их достают из контейнера напрямую.
Модель: «нет»
Верный ответ: нет
T23-L6 · Symfony: конфигурация и сервисы
Без конфигурационного файла в config/packages бандл не заработает — настройки обязательны для каждого бандла.
Модель: «нет»
Верный ответ: нет
T23-L7 · Symfony: конфигурация и сервисы
Значения переменных окружения подставляются в services.yaml синтаксисом %env(VAR)%.
Модель: «да»
Верный ответ: да
T23-L8 · Symfony: конфигурация и сервисы
Какая переменная окружения Symfony включает режим отладки (влияет на профайлер и отладку Twig)?
Модель: «app_debug»
Верный ответ: app_debug
T23-L9 · Symfony: конфигурация и сервисы
Что выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->register('a', stdClass::class)->setPublic(true); $c->compile(); echo spl_object_id($c->get('a')) === spl_object_id($c->get('a')) ? 'same' : 'diff'; ```
Модель: «same»
Верный ответ: same
T23-L10 · Symfony: конфигурация и сервисы
Что выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->setParameter('name', 'Bob'); $c->setParameter('greeting', 'hi %name%'); $c->setParameter('message', '%greeting%!'); $c->compile(); echo $c->getParameter('message'); ```
Модель: «hi bob!»
Верный ответ: hi bob!
9/10
Symfony: Messenger
T16-L1 · Symfony: Messenger
Одно сообщение в Symfony Messenger может обрабатывать только один обработчик (handler).
Модель: «нет»
Верный ответ: нет
T16-L2 · Symfony: Messenger
Транспорт sync в Messenger ставит сообщение в очередь и обрабатывает его воркером, как и async.
Модель: «нет»
Верный ответ: нет
T16-L3 · Symfony: Messenger
Какой консольной командой запускается воркер, обрабатывающий сообщения из очередей Messenger?
Модель: «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?
Модель: «assetmapper»
Верный ответ: asset-mapper
T28-L9 · Symfony: версии
Проект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Security\Guard\AbstractGuardAuthenticator::class) ? 'yes' : 'no'; ```
Модель: «no»
Верный ответ: no
T28-L10 · Symfony: версии
Проект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Routing\Loader\AnnotationClassLoader::class) ? 'yes' : 'no'; echo class_exists(\Symfony\Component\Routing\Loader\AttributeClassLoader::class) ? 'yes' : 'no'; ```
Модель: «noyes»
Верный ответ: noyes
9/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 форматирует число с учётом локали?
Модель: «num_format»
Верный ответ: format_number
T21-L5 · Twig
Фильтр |raw отключает автоэкранирование для значения.
Модель: «нет»
Верный ответ: да
T21-L6 · Twig
В Twig {{ }} выводит значение выражения, а {% %} выполняет теги — условия, циклы, set.
Модель: «да»
Верный ответ: да
T21-L7 · Twig
В Twig нельзя объявить переменную в шаблоне — значения только передаются из контроллера.
Модель: «нет»
Верный ответ: нет
T21-L8 · Twig
Какая функция Twig выводит отладочную структуру переменной (массива, объекта)?
Модель: «dump»
Верный ответ: dump
T21-L9 · Twig
Что выведет этот шаблон Twig? ```twig {{ false|default(2) * 3 }} ```
Модель: «6»
Верный ответ: 6
T21-L10 · Twig
Какой класс исключения выбросит render() этого шаблона? ```twig {{ 'a' ~ 1 + 2 }} ```
Модель: «нет»
Верный ответ: runtimeerror
7/10
Bootstrap
T24-L1 · Bootstrap
Bootstrap — это CSS/JS-библиотека готовых компонентов интерфейса, а не SPA-фреймворк.
Модель: «да»
Верный ответ: да
T24-L2 · Bootstrap
Какой класс Bootstrap задаёт адаптивный контейнер с фиксированной максимальной шириной по брейкпоинтам?
Модель: «container»
Верный ответ: container
T24-L3 · Bootstrap
Сетка Bootstrap построена на CSS float и делит строку на 16 колонок.
Модель: «нет»
Верный ответ: нет
T24-L4 · Bootstrap
Именованные брейкпоинты Bootstrap (с инфиксом в классах) — sm, md, lg, xl, xxl; их пять.
Модель: «да»
Верный ответ: да
T24-L5 · Bootstrap
Утилиты вроде .mt-3 или .px-2 используют шаг spacing-шкалы: число — множитель $spacer.
Модель: «да»
Верный ответ: нет
T24-L6 · Bootstrap
Какой data-атрибут Bootstrap 5 включает интерактивный компонент (например, dropdown) на элементе?
Модель: «data-bs-toggle»
Верный ответ: data-bs-toggle
T24-L7 · Bootstrap
Компоненты Bootstrap 5 работают без jQuery — на чистом vanilla JS.
Модель: «да»
Верный ответ: да
T24-L8 · Bootstrap
Тёмную тему в Bootstrap включают классом .dark на корневом элементе.
Модель: «нет»
Верный ответ: нет
T24-L9 · Bootstrap
Какая max-width у .container в Bootstrap 5.3 при ширине окна 992px?
Модель: «960px»
Верный ответ: 960
T24-L10 · Bootstrap
Какая утилита определит цвет текста в Bootstrap 5.3: `<p class="text-danger text-primary">…</p>`? Ответь именем класса-победителя.
Модель: «text-primary»
Верный ответ: text-danger
8/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
9/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»
Верный ответ: 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=defects»
Верный ответ: --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)
Модель: «3»
Верный ответ: 6
T18-L10 · Тестирование: PHPUnit
Сколько тестов выполнит эта команда и сколько из них завершится failure? Ответь двумя числами через запятую (выполнено, упало). ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class Calc2Test extends TestCase { public function prov(): array { return [[1], [-1]]; } #[DataProvider('prov')] public function test_x(int $x): void { $this->assertTrue($x > 0); } } ``` Команда: `phpunit Calc2Test.php` (PHPUnit 10.5)
Модель: «2, 1»
Верный ответ: 2,1
7/10

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

КлеткаТемаУтверждениеОтвет РезультатОбоснование
T01-L1
3.4 c
Синтаксис и операторыСтроки в двойных и одинарных кавычках обрабатываются одинаково, разница только в скорости.«нет»
Пояснение: В двойных кавычках происходит интерполяция переменных и экранированные последовательности (например, \n), а в одинарных — только обратная перед обратной кавычкой и сама обратная кавычка.
Raw
{"answer": "нет", "пояснение": "В двойных кавычках происходит интерполяция переменных и экранированные последовательности (например, \\n), а в одинарных — только обратная перед обратной кавычкой и сама обратная кавычка."}
верноВ двойных кавычках работают интерполяция переменных и escape-последовательности, в одинарных — нет.
T01-L2
0.45 c
Синтаксис и операторыОператор ?? работает по семантике isset и не порождает предупреждений для неопределённых переменных.«да»
Пояснение: Оператор ?? действительно проверяет isset и подавляет предупреждения об неопределенных переменных или ключах.
Raw
{"answer": "да", "пояснение": "Оператор ?? действительно проверяет isset и подавляет предупреждения об неопределенных переменных или ключах."}
верно?? работает по семантике isset — несуществующие переменные и ключи допустимы.
T01-L3
0.35 c
Синтаксис и операторыЧто выведет: echo 'a', 'b';«ab»
Пояснение: Оператор запятой склеивает строки, а echo выводит их последовательно как одну строку.
Raw
{"answer": "ab", "пояснение": "Оператор запятой склеивает строки, а echo выводит их последовательно как одну строку."}
верноecho принимает список аргументов: ab.
T01-L4
0.25 c
Синтаксис и операторыprint возвращает значение 1 и может использоваться внутри выражения.«да»
Пояснение: Функция print в PHP возвращает значение 1, что позволяет использовать её внутри выражений.
Raw
{"answer": "да", "пояснение": "Функция print в PHP возвращает значение 1, что позволяет использовать её внутри выражений."}
верноprint — выражение со значением 1, в отличие от echo, который значения не возвращает.
T01-L5
0.47 c
Синтаксис и операторыОператор ?: (элвис) возвращает левый операнд, если он ложный.«нет»
Пояснение: Оператор элвис (?:) возвращает левый операнд, если он истинный (truthy), а если он ложный (falsy) или не задан, то возвращается правый операнд.
Raw
{"answer": "нет", "пояснение": "Оператор элвис (?:) возвращает левый операнд, если он истинный (truthy), а если он ложный (falsy) или не задан, то возвращается правый операнд."}
верноНаоборот: $a ?: $b возвращает $a, если он истинный, иначе $b.
T01-L6
0.56 c
Синтаксис и операторыВ PHP 8 приоритет оператора конкатенации (.) ниже, чем у сложения и вычитания.«да»
Пояснение: В PHP оператор конкатенации (.) имеет меньший приоритет, чем арифметические операторы + и -, поэтому выражение $a + $b . $c будет сгруппировано как ($a + $b) . $c.
Raw
{"answer": "да", "пояснение": "В PHP оператор конкатенации (.) имеет меньший приоритет, чем арифметические операторы + и -, поэтому выражение $a + $b . $c будет сгруппировано как ($a + $b) . $c."}
верноС PHP 8 (RFC concat precedence) '.' имеет приоритет ниже арифметики: 'сумма: ' . 2 + 3 → 'сумма: 5' (в PHP 7 было иначе).
T01-L7
0.51 c
Синтаксис и операторыВыражение 2 ** 3 ** 2 в PHP вычисляется как (2 ** 3) ** 2, то есть 64.«нет»
Пояснение: Оператор повышения в степень в PHP ассоциативен справа налево, поэтому выражение вычисляется как 2 ** (3 ** 2) = 2 ** 9 = 512.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Оператор повышения в степень в PHP ассоциативен справа налево, поэтому выражение вычисляется как 2 ** (3 ** 2) = 2 ** 9 = 512." ⏎ }
верно** право-ассоциативен: 2 ** (3 ** 2) = 2 ** 9 = 512.
T01-L8
3.75 c
Синтаксис и операторыКакую строку выведет: echo 'сумма: ' . 2 + 3; (PHP 8)?«{"answer": "сумма: 5", "пояснение": "оператор . имеет более высокий приоритет, чем +, поэтому сначала конкатенируется строка и число 2, затем к результату прибавляется 3 (строка приводится к числу 0, но так как левая часть начинается с буквы, она воспринимается как 0, однако в php 8 кастинг строки 'сумма: 2' к числу дает 0, и 0+3=3? нет, оператор . возвращает строку. строка 'сумма: 2' + 3. в php сложение строки и числа приводит строку к числу. строка 'сумма: 2' начинается с не-цифры, поэтому приводится к 0. 0 + 3 = 3. но wait, let's re-evaluate precedence. . is higher than +. so it is ('сумма: ' . 2) + 3. 'сумма: ' . 2 becomes 'сумма: 2'. then 'сумма: 2' + 3. in php, if you add a number to a string, the string is cast to a number. 'сумма: 2' starts with a letter, so it is cast to 0. 0 + 3 = 3. echo 3. result is '3'. let me double check. if the string is not numeric, it is 0. so result is 3. wait, is it? let's check php docs or common sense. 'abc' + 1 is 1. '1abc' + 1 is 2. 'abc1' + 1 is 1. 'сумма: 2' is non-numeric start, so 0. 0+3=3. so the output is '3'. let's verify. actually, i should be careful. the expression is `echo 'сумма: ' . 2 + 3;`. precedence: `. ` is higher than `+`. so it evaluates to `('сумма: ' . 2) + 3`. `'сумма: ' . 2` is `'сумма: 2'`. then `'сумма: 2' + 3`. php casts the string to a number. since it starts with a letter, it becomes 0. 0 + 3 = 3. so echo outputs 3»
Пояснение: ", "пояснение": "Оператор . имеет более высокий приоритет, чем +, поэтому сначала конкатенируется строка и число 2, затем к результату прибавляется 3 (строка приводится к числу 0, но так как левая часть начинается с буквы, она воспринимается как 0, однако в PHP 8 кастинг строки 'сумма: 2' к числу дает 0, и 0+3=3? Нет, оператор . возвращает строку. Строка 'сумма: 2' + 3. В PHP сложение строки и числа приводит строку к числу. Строка 'сумма: 2' начинается с не-цифры, поэтому приводится к 0. 0 + 3 = 3. Но wait, let's re-evaluate precedence. . is higher than +. So it is ('сумма: ' . 2) + 3. 'сумма: ' . 2 becomes 'сумма: 2'. Then 'сумма: 2' + 3. In PHP, if you add a number to a string, the string is cast to a number. 'сумма: 2' starts with a letter, so it is cast to 0. 0 + 3 = 3. Echo 3. Result is '3'. Let me double check. If the string is not numeric, it is 0. So result is 3. Wait, is it? Let's check PHP docs or common sense. 'abc' + 1 is 1. '1abc' + 1 is 2. 'abc1' + 1 is 1. 'сумма: 2' is non-numeric start, so 0. 0+3=3. So the output is '3'. Let's verify. Actually, I should be careful. The expression is `echo 'сумма: ' . 2 + 3;`. Precedence: `. ` is higher than `+`. So it evaluates to `('сумма: ' . 2) + 3`. `'сумма: ' . 2` is `'сумма: 2'`. Then `'сумма: 2' + 3`. PHP casts the string to a number. Since it starts with a letter, it becomes 0. 0 + 3 = 3. So echo outputs 3."
Raw
{"answer": "сумма: 5", "пояснение": "Оператор . имеет более высокий приоритет, чем +, поэтому сначала конкатенируется строка и число 2, затем к результату прибавляется 3 (строка приводится к числу 0, но так как левая часть начинается с буквы, она воспринимается как 0, однако в PHP 8 кастинг строки 'сумма: 2' к числу дает 0, и 0+3=3? Нет, оператор . возвращает строку. Строка 'сумма: 2' + 3. В PHP сложение строки и числа приводит строку к числу. Строка 'сумма: 2' начинается с не-цифры, поэтому приводится к 0. 0 + 3 = 3. Но wait, let's re-evaluate precedence. . is higher than +. So it is ('сумма: ' . 2) + 3. 'сумма: ' . 2 becomes 'сумма: 2'. Then 'сумма: 2' + 3. In PHP, if you add a number to a string, the string is cast to a number. 'сумма: 2' starts with a letter, so it is cast to 0. 0 + 3 = 3. Echo 3. Result is '3'. Let me double check. If the string is not numeric, it is 0. So result is 3. Wait, is it? Let's check PHP docs or common sense. 'abc' + 1 is 1. '1abc' + 1 is 2. 'abc1' + 1 is 1. 'сумма: 2' is non-numeric start, so 0. 0+3=3. So the output is '3'. Let's verify. Actually, I should be careful. The expression is `echo 'сумма: ' . 2 + 3;`. Precedence: `. ` is higher than `+`. So it evaluates to `('сумма: ' . 2) + 3`. `'сумма: ' . 2` is `'сумма: 2'`. Then `'сумма: 2' + 3`. PHP casts the string to a number. Since it starts with a letter, it becomes 0. 0 + 3 = 3. So echo outputs 3."
верно
парсинг: текст (фолбэк)
Парная к verify-клетке про приоритет: 'сумма: 5'.
T02-L1
0.35 c
Типы и сравненияМассивы при строгом сравнении === считаются равными независимо от порядка элементов.«нет»
Пояснение: Строгое сравнение массивов (===) требует идентичности ключей, значений и их порядка.
Raw
{"answer": "нет", "пояснение": "Строгое сравнение массивов (===) требует идентичности ключей, значений и их порядка."}
верно=== для массивов требует совпадения и значений, и их порядка.
T02-L2
0.37 c
Типы и сравненияСравнение 0 == false возвращает false, потому что это строгое сравнение.«нет»
Пояснение: 0 == false возвращает true, так как это непрямое сравнение, при котором оба значения приводятся к одному типу.
Raw
{"answer": "нет", "пояснение": "0 == false возвращает true, так как это непрямое сравнение, при котором оба значения приводятся к одному типу."}
верноНаоборот: == — нестрогое сравнение и возвращает true; строгое — это === (0 === false → false).
T02-L3
0.41 c
Типы и сравненияВ PHP 8 выражение "abc" == 0 возвращает true.«нет»
Пояснение: В PHP 8 сравнение несмежного типа строк и чисел возвращает false, если строка не является числом.
Raw
{"answer": "нет", "пояснение": "В PHP 8 сравнение несмежного типа строк и чисел возвращает false, если строка не является числом."}
верноС PHP 8 нечисловая строка сравнивается как строка: "abc" == "0" → false (в PHP 7 было true).
T02-L4
0.41 c
Типы и сравненияЗначение null при нестрогом сравнении равно одновременно 0, пустой строке и false.«да»
Пояснение: В PHP 8+ null считается равной пустой строке, но не равна 0 и false при нестрогом сравнении.
Raw
{"answer": "да", "пояснение": "В PHP 8+ null считается равной пустой строке, но не равна 0 и false при нестрогом сравнении."}
верноnull == 0, null == "" и null == false — все true.
T02-L5
0.5 c
Типы и сравненияЧто вернёт выражение: (int) '42abc'?«42»
Пояснение: Функция (int) преобразует строку в целое число, останавливаясь при встрече первого нечислового символа, поэтому из '42abc' будет извлечено 42.
Raw
{"answer": 42, "пояснение": "Функция (int) преобразует строку в целое число, останавливаясь при встрече первого нечислового символа, поэтому из '42abc' будет извлечено 42."}
верноВедущая числовая часть: 42, без ошибок и warning.
T02-L6
0.44 c
Типы и сравненияЧто вернёт выражение: '5' + 5?«10»
Пояснение: В PHP строка, содержащая число, приводится к целому типу при арифметических операциях, поэтому 5 + 5 равно 10.
Raw
{"answer": 10, "пояснение": "В PHP строка, содержащая число, приводится к целому типу при арифметических операциях, поэтому 5 + 5 равно 10."}
верноЧисловая строка приводится: int 10.
T02-L7
0.23 c
Типы и сравненияПри приведении к строке значение false превращается в "0".«нет»
Пояснение: При приведении к строке значение false превращается в пустую строку "".
Raw
{"answer": "нет", "пояснение": "При приведении к строке значение false превращается в пустую строку \"\"."}
верноfalse → "", true → "1".
T02-L8
0.4 c
Типы и сравненияСравнение 0.1 + 0.2 === 0.3 возвращает false.«да»
Пояснение: Из-за ошибок округления в арифметике с плавающей точкой результат сложения 0.1 и 0.2 не равен 0.3, поэтому строгое сравнение возвращает false.
Raw
{"answer": "да", "пояснение": "Из-за ошибок округления в арифметике с плавающей точкой результат сложения 0.1 и 0.2 не равен 0.3, поэтому строгое сравнение возвращает false."}
верноДвоичная погрешность float: 0.1 + 0.2 = 0.30000000000000004.
T03-L1
0.45 c
Строкиstrrev() корректно переворачивает строку в UTF-8.«нет»
Пояснение: Функция strrev() оперирует байтами, а не символами, поэтому она разрывает многобайтовые UTF-8 символы, искажая строку.
Raw
{"answer": "нет", "пояснение": "Функция strrev() оперирует байтами, а не символами, поэтому она разрывает многобайтовые UTF-8 символы, искажая строку."}
верноstrrev переворачивает байты и ломает многобайтовые последовательности.
T03-L2
0.35 c
Строкиstr_contains('Hello world', 'world') возвращает true.«да»
Пояснение: Функция str_contains проверяет наличие подстроки и возвращает true, если строка 'Hello world' содержит 'world'.
Raw
{"answer": "да", "пояснение": "Функция str_contains проверяет наличие подстроки и возвращает true, если строка 'Hello world' содержит 'world'."}
верноstr_contains с PHP 8.0 проверяет вхождение подстроки.
T03-L3
0.5 c
Строкиstr_pad() умеет дополнять строку только справа.«нет»
Пояснение: Функция str_pad() принимает третий аргумент $pad_type, который позволяет указать, где делать паддинг: STR_PAD_RIGHT (по умолчанию), STR_PAD_LEFT или STR_PAD_BOTH.
Raw
{"answer": "нет", "пояснение": "Функция str_pad() принимает третий аргумент $pad_type, который позволяет указать, где делать паддинг: STR_PAD_RIGHT (по умолчанию), STR_PAD_LEFT или STR_PAD_BOTH."}
верноSTR_PAD_LEFT / STR_PAD_BOTH меняют сторону дополнения.
T03-L4
0.36 c
СтрокиПо умолчанию trim() срезает только пробелы, не трогая табы и переводы строк.«нет»
Пояснение: По умолчанию trim() удаляет пробелы, табы, переводы строк и другие управляющие символы из начала и конца строки.
Raw
{"answer": "нет", "пояснение": "По умолчанию trim() удаляет пробелы, табы, переводы строк и другие управляющие символы из начала и конца строки."}
верноСписок символов по умолчанию: « \t\n\r\0\x0B» — пробелы, табы, переводы строк, возврат каретки, null-байт, вертикальный таб. Проверено php -r.
T03-L5
0.36 c
СтрокиСколько БАЙТ вернёт strlen('привет') для строки в UTF-8?«12»
Пояснение: Каждая кириллическая буква в UTF-8 занимает 2 байта, поэтому 6 символов дают 12 байт.
Raw
{"answer": 12, "пояснение": "Каждая кириллическая буква в UTF-8 занимает 2 байта, поэтому 6 символов дают 12 байт."}
верно6 букв по 2 байта: 12.
T03-L6
0.37 c
СтрокиЧто вернёт substr('abcdef', -3)?«def»
Пояснение: Функция substr извлекает подстроку, начиная с позиции -3, что соответствует третьему символу с конца строки.
Raw
{"answer": "def", "пояснение": "Функция substr извлекает подстроку, начиная с позиции -3, что соответствует третьему символу с конца строки."}
верноОтрицательное смещение — с конца: def.
T03-L7
0.31 c
Строкиucfirst() изменяет строку, переданную ей, на месте.«нет»
Пояснение: Функция ucfirst() возвращает новую строку, не изменяя исходную.
Raw
{ ⏎ "answer": "нет", ⏎ "пояснение": "Функция ucfirst() возвращает новую строку, не изменяя исходную." ⏎ }
верноСтроки неизменяемы; ucfirst возвращает новую строку.
T03-L8
0.43 c
СтрокиВ heredoc работают интерполяция переменных, а в nowdoc — нет.«да»
Пояснение: Heredoc позволяет интерполировать переменные и выражения, тогда как nowdoc (начинающийся с NOWDOC) обрабатывает содержимое как обычный текст без интерполяции.
Raw
{"answer": "да", "пояснение": "Heredoc позволяет интерполировать переменные и выражения, тогда как nowdoc (начинающийся с NOWDOC) обрабатывает содержимое как обычный текст без интерполяции."}
верноNowdoc — «одинарные кавычки» в тройном синтаксисе: текст как есть.
T04-L1
0.41 c
МассивыФункция sort() сохраняет связь ключей и значений массива.«нет»
Пояснение: Функция sort() сортирует массив по значениям и перенумерует ключи с нуля, в отличие от asort(), который сохраняет связь ключей и значений.
Raw
{"answer": "нет", "пояснение": "Функция sort() сортирует массив по значениям и перенумерует ключи с нуля, в отличие от asort(), который сохраняет связь ключей и значений."}
верноsort перенумеровывает ключи; связь сохраняет asort.
T04-L2
0.37 c
МассивыСтроковый ключ '5' в массиве сохраняется как целое число 5.«да»
Пояснение: В PHP строковые ключи массива, состоящие из цифр и представляющие целые числа, автоматически преобразуются в тип integer.
Raw
{"answer": "да", "пояснение": "В PHP строковые ключи массива, состоящие из цифр и представляющие целые числа, автоматически преобразуются в тип integer."}
верноКаноничные десятичные строковые ключи приводятся к int.
T04-L3
0.35 c
МассивыФункция in_array() по умолчанию использует строгое сравнение (===).«нет»
Пояснение: По умолчанию in_array() использует слабое сравнение, а строгое включается только при передаче третьего аргумента true.
Raw
{"answer": "нет", "пояснение": "По умолчанию in_array() использует слабое сравнение, а строгое включается только при передаче третьего аргумента true."}
верноПо умолчанию сравнение нестрогое; строгое — третий аргумент true.
T04-L4
0.42 c
Массивыarray_filter() без колбэка удаляет из массива все «пустые» (falsy) элементы.«да»
Пояснение: Если callback не передан, array_filter() фильтрует элементы, удаляя все, которые считаются falsy (false, 0, '', null и т.д.).
Raw
{"answer": "да", "пояснение": "Если callback не передан, array_filter() фильтрует элементы, удаляя все, которые считаются falsy (false, 0, '', null и т.д.)."}
верноУбирает 0, "", null, false и пустые массивы.
T04-L5
0.44 c
МассивыФункция array_slice() по умолчанию сохраняет исходные числовые ключи массива.«нет»
Пояснение: Функция array_slice() по умолчанию сохраняет ключи, только если параметр preserve_keys установлен в true, но по умолчанию он равен false, поэтому ключи переиндексируются.
Raw
{"answer": "нет", "пояснение": "Функция array_slice() по умолчанию сохраняет ключи, только если параметр preserve_keys установлен в true, но по умолчанию он равен false, поэтому ключи переиндексируются."}
верноПо умолчанию ключи перенумеровываются; сохранение — preserve_keys = true.
T04-L6
0.3 c
МассивыЧто вернёт array_slice([10, 20, 30, 40], 1, 2)?«[20, 30]»
Пояснение: array_slice извлекает элементы с индекса 1 длиной 2.
Raw
{"answer": "[20, 30]", "пояснение": "array_slice извлекает элементы с индекса 1 длиной 2."}
верно[20,30]; ключи перенумеровываются.
T04-L7
0.42 c
МассивыСколько элементов будет в count(['a' => 1] + ['a' => 9, 'b' => 2])?«2»
Пояснение: При объединении массивов оператором + ключи из левого массива имеют приоритет, поэтому ключ 'a' останется с значением 1, и добавится только новый ключ 'b'.
Raw
{"answer": 2, "пояснение": "При объединении массивов оператором + ключи из левого массива имеют приоритет, поэтому ключ 'a' останется с значением 1, и добавится только новый ключ 'b'."}
верноОператор + : по ключу 'a' побеждает левый; итого 2.
T04-L8
0.55 c
МассивыSpread-оператор [...$a, ...$b] с PHP 8.1 поддерживает массивы со строковыми ключами.«да»
Пояснение: Начиная с PHP 8.1, распространение (spread) с помощью ... для массивов с нецелочисленными ключами действительно разрешено и поддерживается.
Raw
{"answer": "да", "пояснение": "Начиная с PHP 8.1, распространение (spread) с помощью ... для массивов с нецелочисленными ключами действительно разрешено и поддерживается."}
верноВ 8.0 — только числовые ключи; 8.1 снял ограничение.
T05-L1
0.92 c
Функции и замыканияИменованные аргументы нельзя комбинировать с распаковкой массива ...$args в одном вызове.«нет»
Пояснение: В PHP 8.0 и выше именованные аргументы можно комбинировать с распаковкой массива ...$args, хотя именованные аргументы должны идти перед распаковкой или после, если это не приводит к конфликтам, но синтаксически это разрешено в определенных конфигурациях, однако стандартно рекомендуется избегать смешивания, но утверждение об абсолютном запрете неверно.
Raw
{"answer": "нет", "пояснение": "В PHP 8.0 и выше именованные аргументы можно комбинировать с распаковкой массива ...$args, хотя именованные аргументы должны идти перед распаковкой или после, если это не приводит к конфликтам, но синтаксически это разрешено в определенных конфигурациях, однако стандартно рекомендуется избегать смешивания, но утверждение об абсолютном запрете неверно."}
верноМожно: f(...$args, имя: значение). Нельзя только позиционный аргумент после распаковки.
T05-L2
0.41 c
Функции и замыканияАнонимная функция без use видит переменные внешней области видимости.«нет»
Пояснение: Анонимные функции в PHP не захватывают переменные внешней области видимости, если явно не объявить их с помощью ключевого слова use.
Raw
{"answer": "нет", "пояснение": "Анонимные функции в PHP не захватывают переменные внешней области видимости, если явно не объявить их с помощью ключевого слова use."}
верноБез use внешние переменные недоступны; авто-захват только у fn.
T05-L3
0.38 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.59 c
Функции и замыканияТело стрелочной функции fn может состоять из нескольких выражений в фигурных скобках.«нет»
Пояснение: Стрелочные функции (arrow functions) в PHP могут содержать только одно выражение без фигурных скобок; для нескольких инструкций нужны замыкания (closures) с ключевым словом use и фигурными скобками.
Raw
{"answer": "нет", "пояснение": "Стрелочные функции (arrow functions) в PHP могут содержать только одно выражение без фигурных скобок; для нескольких инструкций нужны замыкания (closures) с ключевым словом use и фигурными скобками."}
верноfn — всегда одно выражение; блок операторов делает обычная анонимная функция.
T05-L5
0.37 c
Функции и замыканияСтрелочная функция fn захватывает внешние переменные по ссылке (лениво, при использовании).«нет»
Пояснение: Стрелочные функции в PHP захватывают переменные контекста по значению, а не по ссылке.
Raw
```json ⏎ {"answer": "нет", "пояснение": "Стрелочные функции в PHP захватывают переменные контекста по значению, а не по ссылке."} ⏎ ```
верноfn захватывает только по значению, автоматически; по ссылке — только &$var в use у обычной функции (fn так не умеет).
T05-L6
0.37 c
Функции и замыканияЗамыкание, объявленное как static function () {}, не захватывает $this.«да»
Пояснение: Статические замыкания в PHP по определению не имеют привязки к объекту и не могут обращаться к $this.
Raw
{"answer": "да", "пояснение": "Статические замыкания в PHP по определению не имеют привязки к объекту и не могут обращаться к $this."}
верноstatic-замыкание отвязано от объекта: $this внутри недоступен.
T05-L7
0.48 c
Функции и замыканияЧто выведет: $x = 5; $f = function () use ($x) { return $x; }; $x = 7; echo $f();«5»
Пояснение: Значение переменной $x, переданное через use, захватывается по значению на момент определения функции и не изменяется при последующей перезаписи внешней переменной.
Raw
{"answer": 5, "пояснение": "Значение переменной $x, переданное через use, захватывается по значению на момент определения функции и не изменяется при последующей перезаписи внешней переменной."}
верноuse захватывает по значению в момент создания: 5.
T05-L8
0.46 c
Функции и замыканияВ «слабом» режиме типизации (без strict_types) передача строки "5" в параметр с типом int допустима.«да»
Пояснение: В нестрогом режиме PHP автоматически преобразует строку, содержащую число, в int при передаче в типизированный параметр.
Raw
{"answer": "да", "пояснение": "В нестрогом режиме PHP автоматически преобразует строку, содержащую число, в int при передаче в типизированный параметр."}
верноCoercive typing приводит "5" к 5; strict_types=1 требует точного типа.
T06-L1
0.45 c
ООП: классы и наследованиеPHP поддерживает promotion свойств в конструкторе: public function __construct(private int $x) {}.«да»
Пояснение: Promotion свойств (property promotion) в конструкторе была введена в PHP 8.0 и позволяет объявлять свойства непосредственно в параметрах метода __construct.
Raw
{"answer": "да", "пояснение": "Promotion свойств (property promotion) в конструкторе была введена в PHP 8.0 и позволяет объявлять свойства непосредственно в параметрах метода __construct."}
верноС PHP 8.0 параметр с модификатором создаёт свойство и присваивание.
T06-L2
0.36 c
ООП: классы и наследованиеКакое ключевое слово запрещает переопределять метод в подклассах?«final»
Пояснение: Ключевое слово final перед методом (или классом) запрещает его переопределение (override) в наследниках.
Raw
{ ⏎ "answer": "final", ⏎ "пояснение": "Ключевое слово final перед методом (или классом) запрещает его переопределение (override) в наследниках." ⏎ }
верноfinal.
T06-L3
0.31 c
ООП: классы и наследованиеМетод, объявленный как final, нельзя переопределить в подклассе.«да»
Пояснение: Ключевое слово final запрещает переопределение метода или расширение класса в дочерних классах.
Raw
{"answer": "да", "пояснение": "Ключевое слово final запрещает переопределение метода или расширение класса в дочерних классах."}
верноfinal запрещает переопределение метода и наследование класса.
T06-L4
0.39 c
ООП: классы и наследованиеСвойства родителя с видимостью private доступны в подклассе.«нет»
Пояснение: Свойства с модификатором private доступны только в классе, где они объявлены, и недоступны в наследниках.
Raw
{"answer": "нет", "пояснение": "Свойства с модификатором private доступны только в классе, где они объявлены, и недоступны в наследниках."}
верноВ подклассе видны protected и public; private — только внутри своего класса.
T06-L5
0.34 c
ООП: классы и наследованиеЧто вернёт get_class(new class {})? Ответь частью имени до нулевого байта (без пути к файлу).«class@anonymous»
Пояснение: get_class для анонимного класса возвращает строку, начинающуюся с 'class@anonymous'.
Raw
{"answer": "class@anonymous", "пояснение": "get_class для анонимного класса возвращает строку, начинающуюся с 'class@anonymous'."}
верноget_class анонимного класса печатает class@anonymous\0<файл>:<строка>$n; короткая форма — часть до NUL-байта. Проверено php -r (hex).
T06-L6
0.56 c
ООП: классы и наследованиеprivate-метод родителя не входит в контракт наследования: потомок может объявить метод с тем же именем с любой видимостью.«да»
Пояснение: В PHP приватные методы не наследуются и не являются частью публичного API, поэтому потомок может переопределить имя метода с любой видимость, включая публичную, без нарушения правил наследования.
Raw
{"answer": "да", "пояснение": "В PHP приватные методы не наследуются и не являются частью публичного API, поэтому потомок может переопределить имя метода с любой видимость, включая публичную, без нарушения правил наследования."}
верноprivate-члены не наследуются — правила совместимости подписей не действуют.
T06-L7
0.91 c
ООП: классы и наследованиеМагический метод __get() вызывается только для несуществующих свойств.«нет»
Пояснение: __get() вызывается только для свойств, которые не могут быть получены (например, private/protected или несуществующих), а не для всех несуществующих в общем смысле, и главное — он работает и для несуществующих, и для невидимых, но формулировка «только для несуществующих» неверна, так как он также вызывается для защищенных/приватных свойств, к которым нет доступа.
Raw
{"answer": "нет", "пояснение": "__get() вызывается только для свойств, которые не могут быть получены (например, private/protected или несуществующих), а не для всех несуществующих в общем смысле, и главное — он работает и для несуществующих, и для невидимых, но формулировка «только для несуществующих» неверна, так как он также вызывается для защищенных/приватных свойств, к которым нет доступа."}
верно__get срабатывает и для существующих, но недоступных (private/protected извне).
T06-L8
0.58 c
ООП: классы и наследованиеЧто бросит повторное присваивание readonly-свойства — Exception или Error?«error»
Пояснение: В PHP попытка изменить значение readonly-свойства бросает Error (concrete класс ReadOnlyPropertyError с версии 8.3, либо TypeError ранее).
Raw
{"answer": "Error", "пояснение": "В PHP попытка изменить значение readonly-свойства бросает Error (concrete класс ReadOnlyPropertyError с версии 8.3, либо TypeError ранее)."}
верноError (readonly с 8.1); оговорка: в __clone() переинициализация допустима (8.3+).
T07-L1
0.35 c
Интерфейсы, трейты, enumИнтерфейс может объявлять константы.«да»
Пояснение: В PHP интерфейсы могут содержать константы, но не свойства или методы (кроме сигнатур).
Raw
{"answer": "да", "пояснение": "В PHP интерфейсы могут содержать константы, но не свойства или методы (кроме сигнатур)."}
верноКонстанты интерфейса наследуются реализациями.
T07-L2
0.35 c
Интерфейсы, трейты, enumКакой оператор проверяет, что объект реализует класс или интерфейс?«instanceof»
Пояснение: Оператор instanceof используется в PHP для проверки, является ли объект экземпляром конкретного класса или реализует ли он интерфейс.
Raw
{"answer": "instanceof", "пояснение": "Оператор instanceof используется в PHP для проверки, является ли объект экземпляром конкретного класса или реализует ли он интерфейс."}
верноinstanceof.
T07-L3
0.41 c
Интерфейсы, трейты, enumИнтерфейс может объявлять статические методы.«да»
Пояснение: В PHP 8.0+ интерфейс может объявлять статические методы, которые реализуются классами как статические методы с соответствующей сигнатурой.
Raw
{"answer": "да", "пояснение": "В PHP 8.0+ интерфейс может объявлять статические методы, которые реализуются классами как статические методы с соответствующей сигнатурой."}
верноРеализация обязана дать статический метод с той же сигнатурой.
T07-L4
0.31 c
Интерфейсы, трейты, enumОператор instanceof проверяет только наследование классов: интерфейсы он не учитывает.«нет»
Пояснение: Оператор instanceof в PHP успешно проверяет как наследование классов, так и реализацию интерфейсов.
Raw
{"answer": "нет", "пояснение": "Оператор instanceof в PHP успешно проверяет как наследование классов, так и реализацию интерфейсов."}
верноinstanceof возвращает true и для интерфейсов объекта.
T07-L5
0.39 c
Интерфейсы, трейты, enumМетод интерфейса может иметь реализацию по умолчанию, как метод трейта.«нет»
Пояснение: В PHP методы интерфейсов не могут иметь тела (реализацию по умолчанию), они всегда абстрактные, в отличие от трейтов.
Raw
{"answer": "нет", "пояснение": "В PHP методы интерфейсов не могут иметь тела (реализацию по умолчанию), они всегда абстрактные, в отличие от трейтов."}
верноМетоды интерфейса — только сигнатуры; тело даёт реализующий класс.
T07-L6
0.53 c
Интерфейсы, трейты, enumАбстрактный метод в абстрактном классе может иметь видимость protected.«да»
Пояснение: Абстрактные методы могут иметь видимость public, protected или private (хотя private абстрактные методы бесполезны, так как не могут быть реализованы наследниками), поэтому protected — допустимая видимость.
Raw
{"answer": "да", "пояснение": "Абстрактные методы могут иметь видимость public, protected или private (хотя private абстрактные методы бесполезны, так как не могут быть реализованы наследниками), поэтому protected — допустимая видимость."}
верноВ абстрактном классе — любая видимость; в интерфейсе — только public.
T07-L7
0.26 c
Интерфейсы, трейты, enumСколько элементов вернёт Foo::cases() для enum Foo { case A; case B; case C; }?«3»
Пояснение: Enum Foo имеет три случая: A, B и C.
Raw
{"answer": 3, "пояснение": "Enum Foo имеет три случая: A, B и C."}
верноСтатический метод cases(): 3.
T07-L8
0.35 c
Интерфейсы, трейты, enumТрейт может объявлять константы.«да»
Пояснение: Трейты в PHP поддерживают объявление констант, которые наследуются классами, использующими эти трейты.
Raw
{"answer": "да", "пояснение": "Трейты в PHP поддерживают объявление констант, которые наследуются классами, использующими эти трейты."}
верноС PHP 8.2 трейты могут объявлять константы (RFC constants_in_traits); до 8.2 — нет.
T08-L1
0.37 c
Исключения и ошибкиИнтерфейс Throwable — общий предок и для Exception, и для Error.«да»
Пояснение: В PHP интерфейс Throwable наследуется от Exception и Error, что позволяет перехватывать оба типа с помощью catch (Throwable $e).
Raw
{"answer": "да", "пояснение": "В PHP интерфейс Throwable наследуется от Exception и Error, что позволяет перехватывать оба типа с помощью catch (Throwable $e)."}
верноИерархия с PHP 7: Throwable → Exception и Throwable → Error.
T08-L2
0.46 c
Исключения и ошибкиБлок catch (Exception $e) перехватит и TypeError, потому что TypeError в итоге наследуется от Exception.«да»
Пояснение: В PHP 8.0 класс TypeError наследуется от Throwable, а в PHP 7.x — от Exception, поэтому блок catch (Exception $e) перехватывает этот тип ошибок.
Raw
{"answer": "да", "пояснение": "В PHP 8.0 класс TypeError наследуется от Throwable, а в PHP 7.x — от Exception, поэтому блок catch (Exception $e) перехватывает этот тип ошибок."}
неверно
верный: «нет»
TypeError наследуется от Error; catch (Exception) его не ловит.
T08-L3
0.43 c
Исключения и ошибкиОператор @ подавляет и исключения тоже.«нет»
Пояснение: Оператор @ подавляет только сообщения об ошибках (warnings, notices, strict standards), но не блокирует выброс исключений (Exceptions).
Raw
{ ⏎ "answer": "нет", ⏎ "пояснение": "Оператор @ подавляет только сообщения об ошибках (warnings, notices, strict standards), но не блокирует выброс исключений (Exceptions)." ⏎ }
верно@ глушит диагностику (warnings/notices), исключения не перехватывает.
T08-L4
0.31 c
Исключения и ошибкиКакой класс ошибки бросит intdiv(5, 0)?«divisionbyzeroerror»
Пояснение: Функция intdiv() бросает исключение DivisionByZeroError при делении на ноль.
Raw
{"answer": "DivisionByZeroError", "пояснение": "Функция intdiv() бросает исключение DivisionByZeroError при делении на ноль."}
верноDivisionByZeroError (иерархия Error, не Exception); php-грейдер объективен.
T08-L5
0.27 c
Исключения и ошибкиБлок finally выполняется только если исключение было поймано блоком catch.«нет»
Пояснение: Блок finally выполняется всегда, независимо от того, произошло ли исключение и было ли оно поймано.
Raw
{"answer": "нет", "пояснение": "Блок finally выполняется всегда, независимо от того, произошло ли исключение и было ли оно поймано."}
верноНаоборот: finally выполняется всегда — даже когда исключение не поймано и уходит выше. Проверено php -r.
T08-L6
0.39 c
Исключения и ошибкиИсключение, выброшенное внутри блока finally, никак не влияет на результат try-блока.«нет»
Пояснение: Исключение, выброшенное в finally, прерывает выполнение и становится активным, маскируя или заменяя исходный результат try.
Raw
{"answer": "нет", "пояснение": "Исключение, выброшенное в finally, прерывает выполнение и становится активным, маскируя или заменяя исходный результат try."}
верноИсключение из finally перекрывает исходное и уходит вместо него.
T08-L7
0.3 c
Исключения и ошибкиЧто вернёт выражение: (bool) new Exception('x')?«да»
Пояснение: Приведение любого объекта к булеву значению всегда дает true.
Raw
{"answer": "да", "пояснение": "Приведение любого объекта к булеву значению всегда дает true."}
верноЛюбой объект при приведении к bool — true. Формы ответа: true или да.
T08-L8
0.39 c
Исключения и ошибкиФункции, зарегистрированные через register_shutdown_function(), выполняются при вызове exit.«да»
Пояснение: Функции, зарегистрированные через register_shutdown_function(), вызываются в конце выполнения скрипта, что происходит как при естественном завершении, так и при вызове exit или die.
Raw
{"answer": "да", "пояснение": "Функции, зарегистрированные через register_shutdown_function(), вызываются в конце выполнения скрипта, что происходит как при естественном завершении, так и при вызове exit или die."}
верноexit завершает скрипт, но shutdown-функции отрабатывают.
T09-L1
0.39 c
Пространства имён и автозагрузкаДиректива use App\Service\Mailer; сама по себе подключает файл с классом.«нет»
Пояснение: Директива use только импортирует алиас класса, а загрузку файла выполняет автозагрузчик (например, PSR-4).
Raw
{"answer": "нет", "пояснение": "Директива use только импортирует алиас класса, а загрузку файла выполняет автозагрузчик (например, PSR-4)."}
верноuse — псевдоним на этапе компиляции; файл грузит автозагрузчик при первом обращении.
T09-L2
0.34 c
Пространства имён и автозагрузкаЧто пишут после use, чтобы импортировать функцию (а не класс): слово function или const?«function»
Пояснение: Для импорта функций в PHP после ключевого слова use указывается keyword function.
Raw
{"answer": "function", "пояснение": "Для импорта функций в PHP после ключевого слова use указывается keyword function."}
верноuse function ...; (и use const для констант).
T09-L3
0.5 c
Пространства имён и автозагрузкаВ какой файл (путь от src/) PSR-4 «App\ → src/» положит класс App\Controller\Api\UserController?«controller/api/usercontroller.php»
Пояснение: PSR-4 заменяет префикс App\ на src/, а оставшиеся части имени пространства имён (Controller, Api) становятся подкаталогами, а имя класса — именем файла.
Raw
{"answer": "Controller/Api/UserController.php", "пояснение": "PSR-4 заменяет префикс App\\ на src/, а оставшиеся части имени пространства имён (Controller, Api) становятся подкаталогами, а имя класса — именем файла."}
верноОстаток имени после префикса, \ → /.
T09-L4
0.42 c
Пространства имён и автозагрузкаПодключение vendor/autoload.php регистрирует обработчики через spl_autoload_register().«да»
Пояснение: Файл vendor/autoload.php генерируется Composer и использует spl_autoload_register() для добавления своего загрузчика в очередь PHP.
Raw
{"answer": "да", "пояснение": "Файл vendor/autoload.php генерируется Composer и использует spl_autoload_register() для добавления своего загрузчика в очередь PHP."}
верноComposer ставит автозагрузчик именно на spl_autoload_register.
T09-L5
0.27 c
Пространства имён и автозагрузкаМагическая константа __NAMESPACE__ содержит имя текущего пространства имён.«да»
Пояснение: Магическая константа __NAMESPACE__ действительно возвращает имя текущего пространства имён в файле PHP.
Raw
{"answer": "да", "пояснение": "Магическая константа __NAMESPACE__ действительно возвращает имя текущего пространства имён в файле PHP."}
верноВ корневом пространстве — пустая строка.
T09-L6
0.38 c
Пространства имён и автозагрузкаОтносительное имя класса (без ведущего \) в new резолвится от глобального корня.«нет»
Пояснение: В PHP относительные имена классов (без ведущего слеша) резолвятся от текущего пространства имен (namespace), а не от глобального корня.
Raw
{"answer": "нет", "пояснение": "В PHP относительные имена классов (без ведущего слеша) резолвятся от текущего пространства имен (namespace), а не от глобального корня."}
верноРезолвится относительно текущего namespace (с учётом импортов).
T09-L7
0.48 c
Пространства имён и автозагрузкаПри маппинге PSR-4 «App\ → src/» класс App\Model\User лежит в файле src/Model/User.php.«да»
Пояснение: Согласно стандарту PSR-4, пространство имен App\Model соответствует каталогу Model внутри корня (src/), а класс User файлу User.php.
Raw
{"answer": "да", "пояснение": "Согласно стандарту PSR-4, пространство имен App\\Model соответствует каталогу Model внутри корня (src/), а класс User файлу User.php."}
верноОстаток имени после префикса переносится в путь как есть.
T09-L8
0.61 c
Пространства имён и автозагрузкаДирективу use можно писать внутри тела функции — импорт будет действовать для этой функции.«да»
Пояснение: В PHP директива use можно размещать внутри объявления класса или интерфейса, а также в теле функции, что позволяет ограничивать область видимости импортируемых символов только для этого блока кода.
Raw
{"answer": "да", "пояснение": "В PHP директива use можно размещать внутри объявления класса или интерфейса, а также в теле функции, что позволяет ограничивать область видимости импортируемых символов только для этого блока кода."}
неверно
верный: «нет»
use внутри тела функции — parse error; импорты файловые и компиляционные.
T10-L1
0.34 c
Ссылки и область видимостиМассивы при присваивании копируются, а не передаются по ссылке.«да»
Пояснение: В PHP массивы копируются по значению при присваивании, если не используется оператор ссылки (&).
Raw
{"answer": "да", "пояснение": "В PHP массивы копируются по значению при присваивании, если не используется оператор ссылки (&)."}
верноПрисваивание массива — копия (в движке — copy-on-write).
T10-L2
0.34 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.45 c
Ссылки и область видимостиВнутри функции пользовательские переменные глобальной области недоступны без global, $GLOBALS или передачи параметром.«да»
Пояснение: В PHP переменные, объявленные вне функций, имеют глобальную область видимости, и для их использования внутри функции необходимо явное обращение через global, $GLOBALS или передача в качестве параметра.
Raw
{"answer": "да", "пояснение": "В PHP переменные, объявленные вне функций, имеют глобальную область видимости, и для их использования внутри функции необходимо явное обращение через global, $GLOBALS или передача в качестве параметра."}
верноОбласть видимости функций изолирована; исключение — суперглобалы ($_GET и др.).
T10-L4
0.55 c
Ссылки и область видимостиunset($GLOBALS['x']) внутри функции удаляет глобальную переменную только для этой функции.«да»
Пояснение: В PHP массив $GLOBALS всегда является ссылкой на глобальную область видимости, поэтому unset($GLOBALS['x']) удаляет переменную глобально, независимо от того, в какой области видимости выполняется вызов.
Raw
{"answer": "да", "пояснение": "В PHP массив $GLOBALS всегда является ссылкой на глобальную область видимости, поэтому unset($GLOBALS['x']) удаляет переменную глобально, независимо от того, в какой области видимости выполняется вызов."}
неверно
верный: «нет»
$GLOBALS — прямое окно в глобальную область: unset удалит её по-настоящему.
T10-L5
0.33 c
Ссылки и область видимостиЧто выведет: function inc(&$x) { $x++; } $n = 5; inc($n); echo $n;«6»
Пояснение: Функция увеличивает переданное по ссылке значение на 1.
Raw
{"answer": 6, "пояснение": "Функция увеличивает переданное по ссылке значение на 1."}
верноСсылка меняет оригинал: 6.
T10-L6
0.8 c
Ссылки и область видимостиForeach по массиву (по значению) работает с «живым» массивом: изменения массива внутри цикла видны в этом же проходе.«нет»
Пояснение: Цикл foreach по значению (без &) работает с внутренним указателем на исходный массив, но изменения ключей или удаления элементов внутри цикла не влияют на итерацию текущего прохода в предсказуемый «живой» способ, а PHP создает внутренний список ключей для итерации на момент старта цикла.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Цикл foreach по значению (без &) работает с внутренним указателем на исходный массив, но изменения ключей или удаления элементов внутри цикла не влияют на итерацию текущего прохода в предсказуемый «живой» способ, а PHP создает внутренний список ключей для итерации на момент старта цикла." ⏎ }
верноПо значению foreach итерирует копию-снимок.
T10-L7
0.34 c
Ссылки и область видимостиСтатическое свойство класса у каждого экземпляра своё: изменения в одном объекте не видны в других.«нет»
Пояснение: Статические свойства принадлежат классу, а не экземплярам, поэтому их изменения видны во всех объектах.
Raw
{"answer": "нет", "пояснение": "Статические свойства принадлежат классу, а не экземплярам, поэтому их изменения видны во всех объектах."}
верноНаоборот: статическое свойство общее для всех экземпляров класса. Проверено php -r.
T10-L8
0.41 c
Ссылки и область видимостиМассив может иметь булев ключ true, и он сохранится как bool.«нет»
Пояснение: В PHP ключи массивов автоматически приводятся к типу integer или string, а булево значение true конвертируется в целое число 1.
Raw
{"answer": "нет", "пояснение": "В PHP ключи массивов автоматически приводятся к типу integer или string, а булево значение true конвертируется в целое число 1."}
верноБулев ключ приводится к int: true → 1, false → 0.
T11-L1
0.31 c
Генераторы, итераторы, SPLВнутри генератора можно использовать return со значением, и оно попадёт в $gen->getReturn().«да»
Пояснение: В PHP внутри генераторов допустимо использовать return со значением, которое можно получить через метод getReturn() после завершения генерации.
Raw
{"answer": "да", "пояснение": "В PHP внутри генераторов допустимо использовать return со значением, которое можно получить через метод getReturn() после завершения генерации."}
верноreturn-значение генератора доступно через getReturn() после прохода.
T11-L2
0.37 c
Генераторы, итераторы, SPLПолностью пройденный генератор можно «перемотать» через rewind() и пройти снова.«нет»
Пояснение: В PHP метод rewind() у генератора не существует, и после завершения генератора его нельзя перемотать и использовать повторно.
Raw
{"answer": "нет", "пояснение": "В PHP метод rewind() у генератора не существует, и после завершения генератора его нельзя перемотать и использовать повторно."}
верноГенератор одноразовый: rewind после начала итерации бросает Exception.
T11-L3
0.35 c
Генераторы, итераторы, SPLКонструкция yield from делегирует проход другому генератору или итерируемому объекту.«да»
Пояснение: Конструкция yield from действительно позволяет делегировать итерацию другому генератору или любому итерируемому объекту в PHP.
Raw
{"answer": "да", "пояснение": "Конструкция yield from действительно позволяет делегировать итерацию другому генератору или любому итерируемому объекту в PHP."}
верноyield from проксирует значения, ключи и return-значение внутреннего генератора.
T11-L4
0.44 c
Генераторы, итераторы, SPLЧто вернёт get_class(g()) для function g() { yield 1; }?«generator»
Пояснение: Функция g(), содержащая оператор yield, является генераторной, и get_class возвращает имя объекта Generator, который она создает при вызове.
Raw
{"answer": "Generator", "пояснение": "Функция g(), содержащая оператор yield, является генераторной, и get_class возвращает имя объекта Generator, который она создает при вызове."}
верноФункция с yield возвращает Generator.
T11-L5
0.46 c
Генераторы, итераторы, SPLСколько элементов вернёт count(iterator_to_array((function () { yield from [1, 2, 3]; })()));«3»
Пояснение: Генератор, вызванный оператором yield from [1, 2, 3], создает итератор с тремя элементами, которые преобразуются в массив с тремя элементами.
Raw
{"answer": 3, "пояснение": "Генератор, вызванный оператором yield from [1, 2, 3], создает итератор с тремя элементами, которые преобразуются в массив с тремя элементами."}
верноyield from делегирует все 3 элемента.
T11-L6
0.29 c
Генераторы, итераторы, SPLКласс SplStack реализует очередь FIFO.«нет»
Пояснение: SplStack реализует стек LIFO (Last In, First Out), а не очередь FIFO.
Raw
{"answer": "нет", "пояснение": "SplStack реализует стек LIFO (Last In, First Out), а не очередь FIFO."}
верноSplStack — стек LIFO; очередь FIFO — SplQueue.
T11-L7
0.31 c
Генераторы, итераторы, SPLArrayIterator позволяет обернуть массив и обходить его через интерфейс Iterator.«да»
Пояснение: ArrayIterator — это встроенный класс PHP, который реализует интерфейс Iterator для обхода массива.
Raw
{"answer": "да", "пояснение": "ArrayIterator — это встроенный класс PHP, который реализует интерфейс Iterator для обхода массива."}
верноОбъектная обёртка над массивом.
T11-L8
0.27 c
Генераторы, итераторы, SPLОбъект класса ArrayObject нельзя обойти через foreach.«нет»
Пояснение: ArrayObject реализует интерфейс Traversable, поэтому он может быть обходим через foreach.
Raw
{"answer": "нет", "пояснение": "ArrayObject реализует интерфейс Traversable, поэтому он может быть обходим через foreach."}
верноArrayObject реализует IteratorAggregate — foreach по нему работает.
T12-L1
0.33 c
Конфигурация и безопасностьpassword_hash() генерирует соль автоматически — передавать её отдельно не нужно.«да»
Пояснение: Функция password_hash() автоматически генерирует и встраивает соль в результирующую строку хэша.
Raw
{"answer": "да", "пояснение": "Функция password_hash() автоматически генерирует и встраивает соль в результирующую строку хэша."}
верноСоль встраивается в строку результата; параметр salt устарел.
T12-L2
0.37 c
Конфигурация и безопасностьАлгоритм PASSWORD_DEFAULT в PHP 8 — это md5 с автоматически добавленной солью.«нет»
Пояснение: PASSWORD_DEFAULT в PHP 8 использует алгоритм bcrypt (или argon2, начиная с PHP 8.0), а не md5.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "PASSWORD_DEFAULT в PHP 8 использует алгоритм bcrypt (или argon2, начиная с PHP 8.0), а не md5." ⏎ } ⏎ ```
верноPASSWORD_DEFAULT — bcrypt; md5 для паролей непригоден (перебирается массово).
T12-L3
0.28 c
Конфигурация и безопасностьЧто вернёт password_verify('secret', password_hash('secret', PASSWORD_DEFAULT))?«да»
Пояснение: Функция password_verify сравнивает пароль с хэшем и возвращает true, если они совпадают.
Raw
{"answer": "да", "пояснение": "Функция password_verify сравнивает пароль с хэшем и возвращает true, если они совпадают."}
верноСоль и хеш в одной строке: true (форма ответа: true или да).
T12-L4
0.45 c
Конфигурация и безопасностьФункция strip_tags() защищает от SQL-инъекций.«нет»
Пояснение: Функция strip_tags() удаляет HTML-теги для защиты от XSS, но не экранирует SQL-специальные символы, поэтому не защищает от SQL-инъекций.
Raw
{"answer": "нет", "пояснение": "Функция strip_tags() удаляет HTML-теги для защиты от XSS, но не экранирует SQL-специальные символы, поэтому не защищает от SQL-инъекций."}
верноstrip_tags режет HTML-теги (помощник против XSS), к параметризации SQL отношения не имеет.
T12-L5
0.47 c
Конфигурация и безопасностьФункция session_regenerate_id() используется для защиты от фиксации сессии при входе пользователя.«да»
Пояснение: Функция session_regenerate_id() действительно используется для изменения ID текущей сессии, что предотвращает атаки на фиксацию сессии, особенно при повышении привилегий (например, при входе).
Raw
{"answer": "да", "пояснение": "Функция session_regenerate_id() действительно используется для изменения ID текущей сессии, что предотвращает атаки на фиксацию сессии, особенно при повышении привилегий (например, при входе)."}
верноНовый ID сессии после логина — стандартная защита от session fixation.
T12-L6
0.36 c
Конфигурация и безопасностьКакая встроенная функция возвращает имя SAPI (например, cli)?«php_sapi_name»
Пояснение: Функция php_sapi_name() возвращает имя текущего модуля SAPI.
Raw
{"answer": "php_sapi_name", "пояснение": "Функция php_sapi_name() возвращает имя текущего модуля SAPI."}
верноphp_sapi_name().
T12-L7
0.37 c
Конфигурация и безопасностьsession_destroy() удаляет данные сессии на сервере, но не cookie в браузере пользователя.«да»
Пояснение: session_destroy() удаляет только данные на сервере, для удаления cookie нужно вручную вызвать setcookie() с истекшим временем.
Raw
{"answer": "да", "пояснение": "session_destroy() удаляет только данные на сервере, для удаления cookie нужно вручную вызвать setcookie() с истекшим временем."}
верноУдаление cookie — отдельный шаг через setcookie с истёкшим сроком.
T12-L8
0.37 c
Конфигурация и безопасностьБез вызова session_start() массив $_SESSION автоматически загружается данными сессии.«нет»
Пояснение: Для загрузки и использования данных сессии в PHP обязательно требуется предварительный вызов функции session_start().
Raw
{"answer": "нет", "пояснение": "Для загрузки и использования данных сессии в PHP обязательно требуется предварительный вызов функции session_start()."}
верноБез session_start() данные сессии в массив не загружаются ($_SESSION можно заполнить вручную, но привязки к сессии нет).
VC-L1
0.23 c
PHP 8.4–8.5В какой версии PHP появилась функция array_find()?«нет»
Пояснение: Функции array_find() в стандартном PHP не существует.
Raw
{"answer": "нет", "пояснение": "Функции array_find() в стандартном PHP не существует."}
неверно
верный: «8.4»
PHP 8.4 (RFC array_find).
VC-L2
0.35 c
PHP 8.4–8.5Property hooks (get/set прямо в объявлении свойства) вошли в PHP 8.4.«да»
Пояснение: PHP 8.4 действительно ввёл поддержку property hooks, позволяя определить логику get и set непосредственно в объявлении свойства.
Raw
{"answer": "да", "пояснение": "PHP 8.4 действительно ввёл поддержку property hooks, позволяя определить логику get и set непосредственно в объявлении свойства."}
верноProperty hooks — PHP 8.4 (ноябрь 2024).
VC-L3
0.33 c
PHP 8.4–8.5Асимметричная видимость (public private(set) string $name) появилась в PHP 8.4.«да»
Пояснение: Асимметричная видимость свойств (Asymmetric Visibility) была добавлена в PHP 8.2, а не в 8.4.
Raw
{"answer": "да", "пояснение": "Асимметричная видимость свойств (Asymmetric Visibility) была добавлена в PHP 8.2, а не в 8.4."}
верноAsymmetric visibility v2 — PHP 8.4.
VC-L4
0.24 c
PHP 8.4–8.5В какой версии PHP впервые появился атрибут #[\NoDiscard]? Ответь номером версии.«нет»
Пояснение: Атрибут #[\NoDiscard] в PHP не существует.
Raw
{"answer": "нет", "пояснение": "Атрибут #[\\NoDiscard] в PHP не существует."}
неверно
верный: «8.5»
#[\NoDiscard] — PHP 8.5 (marking return values as important).
VC-L5
0.32 c
PHP 8.4–8.5В какой версии PHP впервые появился оператор конвейера |> (pipe)? Ответь номером версии.«8.1»
Пояснение: Оператор конвейера (pipe operator) `|>` был впервые введен в PHP 8.1.
Raw
{"answer": "8.1", "пояснение": "Оператор конвейера (pipe operator) `|>` был впервые введен в PHP 8.1."}
неверно
верный: «8.5»
Pipe operator — PHP 8.5 (2025).
VC-L6
0.38 c
PHP 8.4–8.5В какой версии PHP появился clone-with — синтаксис clone($obj, ['x' => 1])? Ответь номером версии.«8.4»
Пояснение: Синтаксис clone with (clone $obj with ['prop' => $value]) был добавлен в PHP 8.4.
Raw
{"answer": "8.4", "пояснение": "Синтаксис clone with (clone $obj with ['prop' => $value]) был добавлен в PHP 8.4."}
неверно
верный: «8.5»
Clone with v2 — PHP 8.5.
VC-L7
0.33 c
PHP 8.4–8.5В какой версии PHP появились функции array_first() и array_last()?«8.1»
Пояснение: Функции array_first() и array_last() были добавлены в PHP 8.1 как часть пакета новых функций для работы с массивами.
Raw
{"answer": "8.1", "пояснение": "Функции array_first() и array_last() были добавлены в PHP 8.1 как часть пакета новых функций для работы с массивами."}
неверно
верный: «8.5»
PHP 8.5.
VC-L8
0.3 c
PHP 8.4–8.5Для какой версии PHP был принят RFC Partial Function Application v2 (по состоянию на 07.11.2026)? Ответь номером версии.«8.5»
Пояснение: RFC Partial Function Application v2 принят для PHP 8.5.
Raw
{"answer": "8.5", "пояснение": "RFC Partial Function Application v2 принят для PHP 8.5."}
неверно
верный: «8.6»
PFA v2 принят 05.12.2025 (33-0-0), реализован в PHP 8.6.
VF-L1
0.26 c
PHP: 8.6+ и будущееДля какой версии PHP реализован RFC clamp_v2 (функция clamp()) по состоянию на 07.11.2026? Ответь номером версии.«8.4»
Пояснение: Функция clamp() была введена в PHP 8.4.
Raw
{"answer": "8.4", "пояснение": "Функция clamp() была введена в PHP 8.4."}
неверно
верный: «8.6»
По данным владельца (wiki.php.net/rfc): clamp_v2 — 8.6; clamp() в 8.5.11 отсутствует (косвенное подтверждение). Дата-якорь делает клетку монотонной.
VF-L2
0.42 c
PHP: 8.6+ и будущееRFC Context Managers v2 уже принят в PHP (на 07.11.2026).«нет»
Пояснение: Контекст-менеджеры (context managers) в PHP пока находятся на этапе обсуждения в RFC и не были приняты в основной ветку на указанную дату.
Raw
{"answer": "нет", "пояснение": "Контекст-менеджеры (context managers) в PHP пока находятся на этапе обсуждения в RFC и не были приняты в основной ветку на указанную дату."}
верноНа 06.11.2026 — в обсуждении (создан 2026-10-23); не принят.
VF-L3
0.67 c
PHP: 8.6+ и будущееRFC Bound-Erased Generic Types (generics) был отклонён в 2026 году.«нет»
Пояснение: В PHP не существует одобрённого или отклонённого RFC о generics (обобщённых типах) в 2026 году, так как на момент текущих знаний такие обсуждения не привели к принятию или официальному отклонению подобного RFC в данном году.
Raw
{"answer": "нет", "пояснение": "В PHP не существует одобрённого или отклонённого RFC о generics (обобщённых типах) в 2026 году, так как на момент текущих знаний такие обсуждения не привели к принятию или официальному отклонению подобного RFC в данном году."}
неверно
верный: «да»
Голосование завершилось 2026-06-28: отклонён (wiki.php.net/rfc).
VF-L4
0.65 c
PHP: 8.6+ и будущееНа 07.11.2026 RFC о включении многопоточности (ZTS) по умолчанию уже принят в PHP.«нет»
Пояснение: На данный момент (и в обозримом будущем) стандартной версией PHP является NTS, а ZTS не является принятым по умолчанию вариантом согласно действующим RFC и политике разработки.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "На данный момент (и в обозримом будущем) стандартной версией PHP является NTS, а ZTS не является принятым по умолчанию вариантом согласно действующим RFC и политике разработки." ⏎ }
верноТакого принятого RFC нет на дату якоря; якорь делает клетку монотонной — при принятии RFC позже клетка не перевернётся.
VF-L5
0.54 c
PHP: 8.6+ и будущееВ PHP 8.5 дженериков (параметризованных типов) по-прежнему нет.«да»
Пояснение: На данный момент в PHP не существует встроенной поддержки дженериков, и в анонсах о планах по их внедрению в версии 8.x нет информации.
Raw
{"answer": "да", "пояснение": "На данный момент в PHP не существует встроенной поддержки дженериков, и в анонсах о планах по их внедрению в версии 8.x нет информации."}
верноGenerics в PHP отсутствуют; отрицательный контроль (не путать с C#/Java).
VF-L6
3.82 c
PHP: 8.6+ и будущееНа 07.11.2026 последняя стабильная версия PHP — 8.5, а PHP 8.6 ещё не выпущена (GA — 19.11.2026).«нет»
Пояснение: , PHP 8.5 ожидается в ноябре 2025 года, поэтому на 07.11.2026 PHP 8.5 уже должна быть актуальной или даже не актуальной в зависимости от точных дат, но утверждение о последовательности 8.5 -> 8.6 в ноябре 2026 верно, однако обычно PHP выходит каждый год, и 8.6 должна быть выпущена в 2026, но ключевая ошибка в том, что PHP 8.5 еще не существовала как "последняя стабильная" в момент, когда 8.6 не вышла, если следовать строгой логике выхода раз в год, то в ноябре 2026 должна быть либо 8.6, либо 8.5. Но главное: PHP 8.3 вышла в 2023, PHP 8.4 в 2024, PHP 8.5 в 2025. Значит, к ноябрю 2026 PHP 8.5 является актуальной, а 8.6 еще нет. Утверждение выглядит верным по дате, но в тесте часто ловят на том, что PHP 8.5 должна выйти в 2025, а не 2026. Подождите, в вопросе сказано "последняя стабильная версия PHP — 8.5". Если PHP 8.5 вышла в ноябре 2025, то в ноябре 2026 она все еще последняя стабильная, пока не выйдет 8.6 в ноябре 2026. Значит, 7 ноября 2026 PHP 8.5 — последняя стабильная. Утверждение верно. Почему я написал "нет"? Возможно, я спутал. Давайте проверим: PHP 8.0 (2020), 8.1 (2021), 8.2 (2022), 8.3 (2023), 8.4 (2024), 8.5 (2025). Да, 8.5 выйдет в 2025. Значит, в 2026 это актуальная версия. Утверждение верно."}
Raw
{"answer": "нет", "пояснение": "PHP 8.4 выпущен в ноябре 2024 года, PHP 8.5 ожидается в ноябре 2025 года, поэтому на 07.11.2026 PHP 8.5 уже должна быть актуальной или даже не актуальной в зависимости от точных дат, но утверждение о последовательности 8.5 -> 8.6 в ноябре 2026 верно, однако обычно PHP выходит каждый год, и 8.6 должна быть выпущена в 2026, но ключевая ошибка в том, что PHP 8.5 еще не существовала как "последняя стабильная" в момент, когда 8.6 не вышла, если следовать строгой логике выхода раз в год, то в ноябре 2026 должна быть либо 8.6, либо 8.5. Но главное: PHP 8.3 вышла в 2023, PHP 8.4 в 2024, PHP 8.5 в 2025. Значит, к ноябрю 2026 PHP 8.5 является актуальной, а 8.6 еще нет. Утверждение выглядит верным по дате, но в тесте часто ловят на том, что PHP 8.5 должна выйти в 2025, а не 2026. Подождите, в вопросе сказано "последняя стабильная версия PHP — 8.5". Если PHP 8.5 вышла в ноябре 2025, то в ноябре 2026 она все еще последняя стабильная, пока не выйдет 8.6 в ноябре 2026. Значит, 7 ноября 2026 PHP 8.5 — последняя стабильная. Утверждение верно. Почему я написал "нет"? Возможно, я спутал. Давайте проверим: PHP 8.0 (2020), 8.1 (2021), 8.2 (2022), 8.3 (2023), 8.4 (2024), 8.5 (2025). Да, 8.5 выйдет в 2025. Значит, в 2026 это актуальная версия. Утверждение верно."}
неверно
верный: «да»
парсинг: текст (фолбэк)
8.5 — релиз осени 2025; 8.6 GA 19.11.2026 (wiki.php.net/todo/php86). Дата снимка — 06.11.2026.
VF-L7
0.41 c
PHP: 8.6+ и будущееВетка PHP 6 так и не вышла: после PHP 5.6 вышел сразу PHP 7.0.«да»
Пояснение: PHP 6 планировался, но был отменен, и следующая крупная версия после 5.6 стала 7.0.
Raw
{"answer": "да", "пояснение": "PHP 6 планировался, но был отменен, и следующая крупная версия после 5.6 стала 7.0."}
верноИсторический факт: ветка 6 не была релизнута.
VF-L8
0.31 c
PHP: 8.6+ и будущееRFC о добавлении атрибута #[\Deprecated] в ядро был принят.«да»
Пояснение: RFC PHP Deprecated Attribute был принят для включения в PHP 8.4.
Raw
{ ⏎   "answer": "да", ⏎   "пояснение": "RFC PHP Deprecated Attribute был принят для включения в PHP 8.4." ⏎ }
верно#[\Deprecated] — принят, реализован в PHP 8.4.
T25-L1
0.46 c
Чистая архитектураПравило зависимостей в чистой и луковичной архитектурах: внутренние слои не знают о внешних — зависимости направлены к центру.«да»
Пояснение: В чистой и луковичной архитектурах правило зависимостей действительно требует, чтобы внутренние слои не зависели от внешних, а зависимости всегда были направлены внутрь (к доменной логике).
Raw
{"answer": "да", "пояснение": "В чистой и луковичной архитектурах правило зависимостей действительно требует, чтобы внутренние слои не зависели от внешних, а зависимости всегда были направлены внутрь (к доменной логике)."}
верноЧистая (Robert C. Martin), луковичная (Jeffrey Palermo) и гексагональная (ports & adapters) — варианты одной идеи: зависимости направлены внутрь, к домену. Слоями в проекте следит deptrac.
T25-L2
0.44 c
Чистая архитектураСущности домена не импортируют ни Doctrine, ни Symfony — только язык и, возможно, стандартную библиотеку.«да»
Пояснение: В чистой доменной модели (DDD) сущности не должны зависеть от фреймворков или ORM, чтобы оставаться переиспользуемыми и тестируемыми.
Raw
{"answer": "да", "пояснение": "В чистой доменной модели (DDD) сущности не должны зависеть от фреймворков или ORM, чтобы оставаться переиспользуемыми и тестируемыми."}
верноИзоляция домена от инфраструктуры; deptrac в проекте как раз следит за слоями.
T25-L3
0.33 c
Чистая архитектураКонтроллеры и Twig-шаблоны относятся к слою бизнес-логики, потому что именно они вызывают use cases.«нет»
Пояснение: Контроллеры и шаблоны относятся к слою презентации (представления), а не бизнес-логики.
Raw
{"answer": "нет", "пояснение": "Контроллеры и шаблоны относятся к слою презентации (представления), а не бизнес-логики."}
верноНаоборот: это интерфейсные адаптеры (внешний слой); они зависят от use cases, а не наоборот.
T25-L4
0.35 c
Чистая архитектураЧто находится в самом центре луковичной архитектуры?«ядро»
Пояснение: В луковичной архитектуре центральный слой, от которого зависят все остальные, называется ядром (Core).
Raw
{"answer": "ядро", "пояснение": "В луковичной архитектуре центральный слой, от которого зависят все остальные, называется ядром (Core)."}
неверно
верный: «доменная модель»
Центральное кольцо — Domain Model: сущности и бизнес-правила без зависимостей; далее Domain Services → Application Services → Infrastructure/UI/Tests (Palermo).
T25-L5
0.36 c
Чистая архитектураНарушение границ слоёв можно поймать автоматикой: анализатор зависимостей между слоями (например, deptrac) падает на запрещённом вызове.«да»
Пояснение: Инструменты статического анализа зависимостей, такие как deptrac, действительно используются для автоматической проверки и предотвращения нарушений архитектуры слоёв.
Raw
{"answer": "да", "пояснение": "Инструменты статического анализа зависимостей, такие как deptrac, действительно используются для автоматической проверки и предотвращения нарушений архитектуры слоёв."}
верноdepfile.yaml в проекте TasK: CI проверяет правила слоёв на каждом пайплайне.
T25-L6
0.51 c
Чистая архитектураUse case (interactor) может принимать HTTP-запрос или EntityManager как аргументы — так проще.«нет»
Пояснение: Use case не должен зависеть от инфраструктуры (HTTP, ORM), а получать абстракции (например, репозитории) для обеспечения высокой степени чистоты и тестируемости.
Raw
{"answer": "нет", "пояснение": "Use case не должен зависеть от инфраструктуры (HTTP, ORM), а получать абстракции (например, репозитории) для обеспечения высокой степени чистоты и тестируемости."}
верноUse case принимает DTO и порты; привязка к HTTP/ORM протекает инфраструктуру во внутренние слои.
T25-L7
0.42 c
Чистая архитектураКак называется компонент, предоставляющий коллекцию агрегатов/сущностей, скрывая механизм хранения за интерфейсом?«repository»
Пояснение: Repository (Репозиторий) — это паттерн проектирования, который инкапсулирует доступ к данным и скрывает реализацию хранилища за общим интерфейсом.
Raw
{"answer": "Repository", "пояснение": "Repository (Репозиторий) — это паттерн проектирования, который инкапсулирует доступ к данным и скрывает реализацию хранилища за общим интерфейсом."}
верноRepository pattern (DDD/Evans); в проекте — Doctrine-репозитории за портами.
T25-L8
0.52 c
Чистая архитектураЗамена PostgreSQL на другую БД в чистой архитектуре затрагивает только внешний слой — домен и use cases не меняются.«да»
Пояснение: В чистой архитектуре зависимости направлены внутрь, а адаптеры (внешний слой) изолируют конкретные реализации БД, позволяя заменить PostgreSQL без изменения домена и use cases.
Raw
{"answer": "да", "пояснение": "В чистой архитектуре зависимости направлены внутрь, а адаптеры (внешний слой) изолируют конкретные реализации БД, позволяя заменить PostgreSQL без изменения домена и use cases."}
верноСледствие правила зависимостей: инфраструктура взаимозаменяема.
T26-L1
0.43 c
DDDАгрегат в DDD — это просто другое название таблицы базы данных.«нет»
Пояснение: Агрегат в DDD — это кластер объектов доменной модели, объединённых одним инвариантом, а не просто таблица БД.
Raw
{"answer": "нет", "пояснение": "Агрегат в DDD — это кластер объектов доменной модели, объединённых одним инвариантом, а не просто таблица БД."}
верноАгрегат — кластер объектов с границей согласованности (транзакционной вокруг корня); таблица — деталь хранения.
T26-L2
0.4 c
DDDValue Object неизменяем и сравнивается по значениям полей, а не по идентификатору.«да»
Пояснение: Value Objects в DDD являются неизменяемыми и определяются эквивалентностью своих свойств, а не уникальным идентификатором.
Raw
{"answer": "да", "пояснение": "Value Objects в DDD являются неизменяемыми и определяются эквивалентностью своих свойств, а не уникальным идентификатором."}
верноКлассика Evans: Money, Email; равенство структурное.
T26-L3
0.48 c
DDDКак называется единственная точка внешнего входа в агрегат, через которую проходят все изменения?«aggregator»
Пояснение: В паттерне DDD Aggregate — это корневая сущность, через которую осуществляется контроль целостности и управление изменениями внутри границы агрегата.
Raw
{"answer": "Aggregator", "пояснение": "В паттерне DDD Aggregate — это корневая сущность, через которую осуществляется контроль целостности и управление изменениями внутри границы агрегата."}
неверно
верный: «aggregate root»
Aggregate Root: внешние объекты ссылаются только на корень; он защищает инварианты агрегата.
T26-L4
0.46 c
DDDВ DDD репозиторий объявляется на агрегат (его корень), а не на каждую сущность.«да»
Пояснение: В DDD репозиторий абстрагирует хранение и извлечение агрегатов целиком через корневую сущность, обеспечивая целостность границ агрегата.
Raw
{"answer": "да", "пояснение": "В DDD репозиторий абстрагирует хранение и извлечение агрегатов целиком через корневую сущность, обеспечивая целостность границ агрегата."}
верноРепозиторий корня хранит границу согласованности агрегата; вложенные сущности доступны только через корень.
T26-L5
0.44 c
DDDUbiquitous language — единый язык модели, общий для разработчиков и предметных экспертов.«да»
Пояснение: Ubiquitous language действительно предполагает использование единого терминологического аппарата в коде, документации и обсуждениях между разработчиками и бизнес-экспертами.
Raw
{"answer": "да", "пояснение": "Ubiquitous language действительно предполагает использование единого терминологического аппарата в коде, документации и обсуждениях между разработчиками и бизнес-экспертами."}
верноEvans: язык из требований переходит в имена классов и методов.
T26-L6
0.48 c
DDDКак называется граница, внутри которой модель и её язык едины, а снаружи те же понятия — другие модели?«контекст»
Пояснение: Концепция, согласно которой истинность и смысл выражений определены только внутри конкретной формальной системы (модели/языка).
Raw
{"answer": "контекст", "пояснение": "Концепция, согласно которой истинность и смысл выражений определены только внутри конкретной формальной системы (модели/языка)."}
неверно
верный: «bounded context»
Bounded Context; «Заказ» в биллинге и в доставке — разные модели.
T26-L7
0.4 c
DDDАнемичная модель (объекты только с геттерами/сеттерами, логика в сервисах) — рекомендуемый стиль DDD.«нет»
Пояснение: Анемичная модель противоречит принципам DDD, так как бизнес-логика должна быть инкапсулирована в доменных объектах, а не вынесена в сервисы.
Raw
{"answer": "нет", "пояснение": "Анемичная модель противоречит принципам DDD, так как бизнес-логика должна быть инкапсулирована в доменных объектах, а не вынесена в сервисы."}
верноНаоборот: Evans называет анемичность антипаттерном — поведение должно жить в доменных объектах.
T26-L8
0.41 c
DDDBounded context означает, что у каждого контекста своя модель: одно и то же понятие в разных контекстах — разные классы.«да»
Пояснение: Bounded Context в DDD подразумевает изоляцию доменных моделей, где одно и то же понятие может иметь разные реализации и названия в разных контекстах.
Raw
{"answer": "да", "пояснение": "Bounded Context в DDD подразумевает изоляцию доменных моделей, где одно и то же понятие может иметь разные реализации и названия в разных контекстах."}
верноМодели контекстов независимы; между ними — явная интеграция (ACL, published language).
T13-L1
0.4 c
SymfonyСервисы в DI-контейнере Symfony по умолчанию создаются лениво — при первом обращении к ним.«да»
Пояснение: По умолчанию в Symfony DI-контейнер создает сервисы лениво, то есть только при первом обращении к ним.
Raw
```json ⏎ { ⏎   "answer": "да", ⏎   "пояснение": "По умолчанию в Symfony DI-контейнер создает сервисы лениво, то есть только при первом обращении к ним." ⏎ } ⏎ ```
верноКонтейнер инстанцирует сервис при первом извлечении; eager-создания по умолчанию нет.
T13-L2
0.38 c
SymfonyКакая консольная команда Symfony выводит список всех зарегистрированных маршрутов?«php bin/console debug:router»
Пояснение: Команда debug:router выводит таблицу всех зарегистрированных маршрутов, их пути и методы.
Raw
{"answer": "php bin/console debug:router", "пояснение": "Команда debug:router выводит таблицу всех зарегистрированных маршрутов, их пути и методы."}
верноbin/console debug:router (FrameworkBundle); в Symfony 3 команда называлась router:debug.
T13-L3
0.37 c
SymfonyAutowiring в Symfony требует вручную перечислять каждый сервис в конфигурации services.yaml.«нет»
Пояснение: Autowiring автоматически определяет и внедряет зависимости на основе типов аргументов, исключая необходимость ручного перечисления каждого сервиса.
Raw
{"answer": "нет", "пояснение": "Autowiring автоматически определяет и внедряет зависимости на основе типов аргументов, исключая необходимость ручного перечисления каждого сервиса."}
верноAutowire+autoconfigure регистрируют и связывают сервисы автоматически; ручное перечисление — исключение.
T13-L4
0.37 c
SymfonyTwig-шаблоны компилируются в PHP-классы и кэшируются между запросами.«да»
Пояснение: Twig компилирует шаблоны в оптимизированный PHP-код и кеширует его, чтобы избежать повторной компиляции при каждом запросе.
Raw
{"answer": "да", "пояснение": "Twig компилирует шаблоны в оптимизированный PHP-код и кеширует его, чтобы избежать повторной компиляции при каждом запросе."}
верноTwig компилирует шаблон один раз; кэш в var/cache/twig, в prod не пересобирается.
T13-L5
0.38 c
SymfonyКонтейнер DI в dev-окружении Symfony пересобирается только после изменения отслеживаемых файлов, а не при каждом запросе.«да»
Пояснение: В dev-окружении Symfony кэш контейнера обновляется только при изменении отслеживаемых файлов, а не при каждом запросе.
Raw
{"answer": "да", "пояснение": "В dev-окружении Symfony кэш контейнера обновляется только при изменении отслеживаемых файлов, а не при каждом запросе."}
верноKernel проверяет freshness ресурсов (конфиги, классы); иначе переиспользуется кэш контейнера.
T13-L6
0.28 c
SymfonyКакая переменная окружения выбирает активное окружение Symfony (dev/prod)?«app_env»
Пояснение: Переменная окружения APP_ENV определяет активное окружение Symfony (например, dev, prod, test).
Raw
{"answer": "APP_ENV", "пояснение": "Переменная окружения APP_ENV определяет активное окружение Symfony (например, dev, prod, test)."}
верноAPP_ENV в .env; APP_DEBUG — отдельный флаг отладки.
T13-L7
0.39 c
SymfonyМетод контроллера может быть private — маршрутизация Symfony работает с любыми методами класса.«нет»
Пояснение: Symfony требует, чтобы методы контроллеров, связанные с маршрутами, были публичными (public), чтобы фреймворк мог их вызвать.
Raw
{"answer": "нет", "пояснение": "Symfony требует, чтобы методы контроллеров, связанные с маршрутами, были публичными (public), чтобы фреймворк мог их вызвать."}
верноДействие контроллера должно быть public; приватный метод по маршруту не вызывается.
T13-L8
0.4 c
SymfonyПодписчики событий (EventSubscriber) всегда получают события раньше слушателей (listeners), потому что интерфейс даёт им приоритет.«нет»
Пояснение: Приоритет события определяется числом priority (чем больше, тем раньше), а не типом класса (Listener или Subscriber).
Raw
{"answer": "нет", "пояснение": "Приоритет события определяется числом priority (чем больше, тем раньше), а не типом класса (Listener или Subscriber)."}
верноПорядок определяет priority, а не тип подписки; приоритеты задаются в getSubscribedEvents() так же, как у слушателей.
T22-L1
0.42 c
Symfony: Security и формыВ современном Symfony (6.0+) аутентификация строится на классах-authenticator (AuthenticatorInterface); прежняя система guard удалена.«да»
Пояснение: В Symfony 6.0 система guard была удалена, и аутентификация выполняется исключительно через интерфейс AuthenticatorInterface и конкретных аутентификаторов.
Raw
{"answer": "да", "пояснение": "В Symfony 6.0 система guard была удалена, и аутентификация выполняется исключительно через интерфейс AuthenticatorInterface и конкретных аутентификаторов."}
верноGuard объявлен устаревшим в 5.3 и удалён в 6.0; в проекте symfony/security-bundle 8.1.
T22-L2
0.37 c
Symfony: Security и формыКакой атрибут Symfony проверяет роль/право прямо на методе контроллера (без него — 403)?«isgranted»
Пояснение: Атрибут IsGranted в Symfony проверяет права доступа непосредственно на методе контроллера.
Raw
{"answer": "IsGranted", "пояснение": "Атрибут IsGranted в Symfony проверяет права доступа непосредственно на методе контроллера."}
верно#[IsGranted('ROLE_ADMIN')]; атрибут из symfony/security-http.
T22-L3
0.38 c
Symfony: Security и формыVoters (голосующие) — механизм Symfony для проверки доступа к конкретному объекту: isGranted('EDIT', $post).«да»
Пояснение: Механизм Voters в Symfony (через interface Voter) действительно используется для проверки прав доступа к конкретным объектам с помощью метода isGranted.
Raw
{"answer": "да", "пояснение": "Механизм Voters в Symfony (через interface Voter) действительно используется для проверки прав доступа к конкретным объектам с помощью метода isGranted."}
верноVoterInterface->vote(); docs Symfony — Voters.
T22-L4
0.4 c
Symfony: Security и формыОграничения валидации в современных Symfony (7+) объявляются PHP-атрибутами (#[Assert\NotBlank]); аннотации-докблоки больше не поддерживаются.«да»
Пояснение: В Symfony 7 поддержка аннотаций (докблоков) полностью удалена, валидация осуществляется исключительно через PHP-атрибуты.
Raw
{"answer": "да", "пояснение": "В Symfony 7 поддержка аннотаций (докблоков) полностью удалена, валидация осуществляется исключительно через PHP-атрибуты."}
верноДокблок-аннотации удалены в Symfony 7.0; стандарт — атрибуты. В проекте symfony/validator 8.1.
T22-L5
0.44 c
Symfony: Security и формыCSRF-защита форм в Symfony включена по умолчанию: форма проверяет токен при отправке.«да»
Пояснение: Symfony Framework автоматически включает защиту от CSRF-атак, добавляя и проверяя токены при обработке форм.
Raw
{"answer": "да", "пояснение": "Symfony Framework автоматически включает защиту от CSRF-атак, добавляя и проверяя токены при обработке форм."}
верноFormType добавляет скрытое поле _token и проверяет его при валидации; отключение — осознанное исключение (csrf: false).
T22-L6
0.41 c
Symfony: Security и формыВалидация формы в Symfony выполняется на сервере, даже если клиентская (HTML5) проверка прошла.«да»
Пояснение: Symfony выполняет серверную валидацию независимо от клиентских проверок HTML5, так как данные из браузера нельзя доверять полностью.
Raw
{"answer": "да", "пояснение": "Symfony выполняет серверную валидацию независимо от клиентских проверок HTML5, так как данные из браузера нельзя доверять полностью."}
верноКлиентская валидация — только удобство; серверная обязательна и идёт по метаданным объекта формы.
T22-L7
0.37 c
Symfony: Security и формыКакая команда Symfony maker генерирует класс формы (FormType)?«make:form»
Пояснение: Команда make:form в Symfony Maker Bundle используется для создания классов форм (FormType).
Raw
{"answer": "make:form", "пояснение": "Команда make:form в Symfony Maker Bundle используется для создания классов форм (FormType)."}
верноbin/console make:form (symfony/maker-bundle — в проекте).
T22-L8
0.33 c
Symfony: Security и формыSymfony хранит пароль пользователя в сессии в открытом виде (plaintext).«нет»
Пояснение: Symfony хранит хеш пароля, а не его plaintext-представление.
Raw
{"answer": "нет", "пояснение": "Symfony хранит хеш пароля, а не его plaintext-представление."}
верноВ сессии живёт объект пользователя в токене; хеш затирается eraseCredentials(), plaintext там никогда не лежит.
T23-L1
0.36 c
Symfony: конфигурация и сервисыКонфигурация бандлов Symfony лежит в config/packages — по одному файлу на бандл или тему.«да»
Пояснение: Стандартная структура Symfony предполагает хранение конфигурации отдельных бандлов в отдельных файлах внутри каталога config/packages.
Raw
{ ⏎ "answer": "да", ⏎ "пояснение": "Стандартная структура Symfony предполагает хранение конфигурации отдельных бандлов в отдельных файлах внутри каталога config/packages." ⏎ }
верноСтандартная структура (config/packages/*.yaml); перегрузка — config/packages/<env>.
T23-L2
0.45 c
Symfony: конфигурация и сервисыФайл .env с dev-дефолтами коммитится в репозиторий, а настоящие секреты живут в некоммитимом .env.local.«да»
Пояснение: Эта практика соответствует стандарту безопасности, так как публичные значения можно коммитить, а секретные данные следует хранить локально и исключать из VCS.
Raw
{"answer": "да", "пояснение": "Эта практика соответствует стандарту безопасности, так как публичные значения можно коммитить, а секретные данные следует хранить локально и исключать из VCS."}
верноsymfony/dotenv: .env — общий безопасный набор значений; локальные секреты — .env.local (gitignored) или secrets-хранилище.
T23-L3
0.45 c
Symfony: конфигурация и сервисыКакая команда Symfony выводит зарегистрированные сервисы контейнера и их алиасы?«bin/console debug:autowiring»
Пояснение: Команда bin/console debug:autowiring выводит список регистрируемых сервисов и их алиасов, доступных для автоинъекции в контейнере зависимостей Symfony.
Raw
{"answer": "bin/console debug:autowiring", "пояснение": "Команда bin/console debug:autowiring выводит список регистрируемых сервисов и их алиасов, доступных для автоинъекции в контейнере зависимостей Symfony."}
неверно
верный: «debug:container»
bin/console debug:container; параметры контейнера — debug:parameter.
T23-L4
0.61 c
Symfony: конфигурация и сервисыКонтейнер Symfony позволяет менять параметры в рантайме: $container->setParameter() работает из контроллера.«нет»
Пояснение: В современных версиях Symfony контейнер является неизменяемым (immutable) и параметрам нельзя менять значения через setParameter() во время рантайма; этот метод устарел или удален.
Raw
{"answer": "нет", "пояснение": "В современных версиях Symfony контейнер является неизменяемым (immutable) и параметрам нельзя менять значения через setParameter() во время рантайма; этот метод устарел или удален."}
верноКонтейнер компилируется и замораживается; runtime-значения — только через переменные окружения.
T23-L5
0.61 c
Symfony: конфигурация и сервисыПо умолчанию сервисы в Symfony публичны (public: true) — их достают из контейнера напрямую.«нет»
Пояснение: По умолчанию сервисы в Symfony являются публичными только если явно указано, но начиная с Symfony 4.3 и далее рекомендуется использовать автоинъекцию, а по умолчанию сервисы считаются приватными (public: false), если не указано иное.
Raw
{"answer": "нет", "пояснение": "По умолчанию сервисы в Symfony являются публичными только если явно указано, но начиная с Symfony 4.3 и далее рекомендуется использовать автоинъекцию, а по умолчанию сервисы считаются приватными (public: false), если не указано иное."}
верноС Symfony 4.0 сервисы по умолчанию private: инжектятся через autowiring; $container->get() — только для публичных.
T23-L6
0.51 c
Symfony: конфигурация и сервисыБез конфигурационного файла в config/packages бандл не заработает — настройки обязательны для каждого бандла.«нет»
Пояснение: Большинство бандлов Symfony имеют параметры по умолчанию и могут работать без явного конфигурационного файла, если в них нет обязательных для заполнения настроек.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Большинство бандлов Symfony имеют параметры по умолчанию и могут работать без явного конфигурационного файла, если в них нет обязательных для заполнения настроек." ⏎ }
верноУ бандлов есть встроенные умолчания (Extension); конфиг нужен только для отклонений от них.
T23-L7
0.37 c
Symfony: конфигурация и сервисыЗначения переменных окружения подставляются в services.yaml синтаксисом %env(VAR)%.«да»
Пояснение: В Symfony синтаксис %env(VAR)% используется для подстановки значений переменных окружения в конфигурационных файлах.
Raw
{"answer": "да", "пояснение": "В Symfony синтаксис %env(VAR)% используется для подстановки значений переменных окружения в конфигурационных файлах."}
верно%env(...)% резолвится в рантайме env-процессорами; docs — Env Var Processors.
T23-L8
0.28 c
Symfony: конфигурация и сервисыКакая переменная окружения Symfony включает режим отладки (влияет на профайлер и отладку Twig)?«app_debug»
Пояснение: Переменная окружения APP_DEBUG определяет режим отладки в Symfony.
Raw
{"answer": "APP_DEBUG", "пояснение": "Переменная окружения APP_DEBUG определяет режим отладки в Symfony."}
верноAPP_DEBUG=1 (в .env dev-окружения); окружение выбирает APP_ENV — см. T13-L6.
T16-L1
0.46 c
Symfony: MessengerОдно сообщение в Symfony Messenger может обрабатывать только один обработчик (handler).«нет»
Пояснение: В Symfony Messenger один и тот же класс обработчика может быть зарегистрирован для нескольких сообщений, но конкретное сообщение может быть обработано несколькими различными обработчиками.
Raw
```json ⏎ { ⏎   "answer": "нет", ⏎   "пояснение": "В Symfony Messenger один и тот же класс обработчика может быть зарегистрирован для нескольких сообщений, но конкретное сообщение может быть обработано несколькими различными обработчиками." ⏎ } ⏎ ```
верноMessenger вызывает все хендлеры, подписанные на класс сообщения (docs — Multiple Handlers).
T16-L2
0.36 c
Symfony: MessengerТранспорт sync в Messenger ставит сообщение в очередь и обрабатывает его воркером, как и async.«нет»
Пояснение: Транспорт sync обрабатывает сообщения немедленно в рамках текущего запроса, а не ставит их в очередь для воркера.
Raw
{"answer": "нет", "пояснение": "Транспорт sync обрабатывает сообщения немедленно в рамках текущего запроса, а не ставит их в очередь для воркера."}
верноНаоборот: sync обрабатывает немедленно в том же процессе, что и отправка; очередь — это async-транспорт.
T16-L3
0.3 c
Symfony: MessengerКакой консольной командой запускается воркер, обрабатывающий сообщения из очередей Messenger?«console messenger:consume»
Пояснение: Команда console messenger:consume используется для запуска воркера Symfony Messenger.
Raw
{"answer": "console messenger:consume", "пояснение": "Команда console messenger:consume используется для запуска воркера Symfony Messenger."}
верноbin/console messenger:consume async; воркеры под supervisord/systemd в проде.
T16-L4
0.42 c
Symfony: MessengerПовторы неудачных сообщений (retry_strategy) настраиваются на уровне транспорта Messenger.«да»
Пояснение: Повторная отправка неудачных сообщений (retry strategy) действительно настраивается через транспорт (transport) в Symfony Messenger.
Raw
{"answer": "да", "пояснение": "Повторная отправка неудачных сообщений (retry strategy) действительно настраивается через транспорт (transport) в Symfony Messenger."}
верноretry_strategy на транспорте: max_retries, delay, multiplier; docs — Failed Messages & Retries.
T16-L5
0.33 c
Symfony: MessengerПо умолчанию Messenger сериализует сообщения в JSON.«да»
Пояснение: По умолчанию Symfony Messenger использует JSON-сериализатор (JsonSerializer) для преобразования сообщений в строковый формат.
Raw
{"answer": "да", "пояснение": "По умолчанию Symfony Messenger использует JSON-сериализатор (JsonSerializer) для преобразования сообщений в строковый формат."}
неверно
верный: «нет»
Дефолтный сериализатор — PhpSerializer (serialize()); JSON-сериализатор включается отдельно.
T16-L6
0.45 c
Symfony: MessengerSymfony Scheduler по расписанию порождает сообщения и отправляет их через Messenger.«да»
Пояснение: Symfony Scheduler отвечает за запуск задач по расписанию, которые обычно транслируют сообщения в Message Bus (Messenger) для асинхронной или синхронной обработки.
Raw
{"answer": "да", "пояснение": "Symfony Scheduler отвечает за запуск задач по расписанию, которые обычно транслируют сообщения в Message Bus (Messenger) для асинхронной или синхронной обработки."}
верноSchedule → RecurringMessage → шина Messenger; docs — Scheduler.
T16-L7
0.32 c
Symfony: MessengerКакой встроенный транспорт Messenger хранит сообщения в таблицах БД через Doctrine?«doctrine»
Пояснение: Встроенный транспорт для работы с базами данных в Symfony Messenger называется 'doctrine'.
Raw
{"answer": "doctrine", "пояснение": "Встроенный транспорт для работы с базами данных в Symfony Messenger называется 'doctrine'."}
верноТранспорт doctrine (symfony/doctrine-messenger); таблица messenger_messages. В проекте стоит amqp-messenger + doctrine-messenger.
T16-L8
0.4 c
Symfony: MessengerПайплайн Messenger можно расширять собственными middleware, встраивая их до или после встроенных.«да»
Пояснение: Symfony Messenger позволяет регистрировать собственные миддлвары в пайплайне, определяя их порядок относительно встроенных.
Raw
{"answer": "да", "пояснение": "Symfony Messenger позволяет регистрировать собственные миддлвары в пайплайне, определяя их порядок относительно встроенных."}
верноmessenger.bus.*.middleware в yaml; docs — Middleware.
T28-L1
0.4 c
Symfony: версииМажорные релизы Symfony выходят раз в два года, минорные — каждые шесть месяцев (в мае и ноябре).«нет»
Пояснение: Symfony перешла на ежеквартальный цикл релизов, а не раз в полгода.
Raw
{"answer": "нет", "пояснение": "Symfony перешла на ежеквартальный цикл релизов, а не раз в полгода."}
неверно
верный: «да»
Стандартный релизный цикл: 8.0 — ноябрь 2025, 8.1 — май 2026, 8.2 — ноябрь 2026.
T28-L2
0.25 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.48 c
Symfony: версииSymfony 7.0 сохранила поддержку аннотаций в докблоках (валидация, маршруты).«нет»
Пояснение: В Symfony 7.0 (и начиная с 5.1) поддержка док-блоков (аннотаций) удалена, используются только PHP-атрибуты.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "В Symfony 7.0 (и начиная с 5.1) поддержка док-блоков (аннотаций) удалена, используются только PHP-атрибуты." ⏎ }
верноНаоборот: в 7.0 аннотации удалены — только PHP-атрибуты (#[Route], #[Assert\NotBlank]).
T28-L4
0.42 c
Symfony: версииAssetMapper позволяет управлять CSS/JS без node и webpack — через importmap.php.«да»
Пояснение: AssetMapper в Symfony действительно позволяет управлять ассетами и импортировать их через importmap.php без необходимости установки Node.js и Webpack.
Raw
{"answer": "да", "пояснение": "AssetMapper в Symfony действительно позволяет управлять ассетами и импортировать их через importmap.php без необходимости установки Node.js и Webpack."}
верноsymfony/asset-mapper (с 6.3, стандарт с 7.x); в проекте — importmap.php в корне и asset-mapper 8.1.
T28-L5
0.31 c
Symfony: версииSymfony 6.4 — обычный релиз без длительной поддержки.«нет»
Пояснение: Symfony 6.4 является релизом LTS (Long-Term Support) с поддержкой до ноября 2026 года.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Symfony 6.4 является релизом LTS (Long-Term Support) с поддержкой до ноября 2026 года." ⏎ }
верноНаоборот: 6.4 — LTS (расширенная поддержка); LTS выходит вместе с очередным мажором (6.4 — вместе с 7.0).
T28-L6
0.54 c
Symfony: версииПри переходе на новую мажорную версию Symfony деприкейшены прошлой ветки продолжают работать — мажорные релизы их не удаляют.«нет»
Пояснение: В Symfony мажорные версии несут в себе breaking changes, что подразумевает удаление функциональности, объявленной устаревшей (deprecated) в предыдущих минорных/мажорных версиях.
Raw
{"answer": "нет", "пояснение": "В Symfony мажорные версии несут в себе breaking changes, что подразумевает удаление функциональности, объявленной устаревшей (deprecated) в предыдущих минорных/мажорных версиях."}
верноНаоборот: мажорный релиз удаляет всё устаревшее (7.0 убрал деприкейшены 6.x, 8.0 — 7.x).
T28-L7
0.43 c
Symfony: версииКаждый мажорный релиз Symfony сопровождается UPGRADE-гайдом со списком изменений.«да»
Пояснение: Symfony предоставляет официальные руководства по обновлению (Upgrade Guides) для каждого мажорного релиза, чтобы помочь разработчикам мигрировать код.
Raw
{"answer": "да", "пояснение": "Symfony предоставляет официальные руководства по обновлению (Upgrade Guides) для каждого мажорного релиза, чтобы помочь разработчикам мигрировать код."}
верноUPGRADE-7.0.md, UPGRADE-8.0.md в репозитории symfony/symfony.
T28-L8
0.3 c
Symfony: версииКакой компонент Symfony управляет ассетами и importmap без node/webpack?«assetmapper»
Пояснение: AssetMapper — это компонент Symfony, который управляет ассетами и importmap без необходимости использования node или webpack.
Raw
{"answer": "AssetMapper", "пояснение": "AssetMapper — это компонент Symfony, который управляет ассетами и importmap без необходимости использования node или webpack."}
верноsymfony/asset-mapper 8.1 — в проекте.
T29-L1
0.41 c
Symfony: 8.2 и будущееНа 07.11.2026 Symfony 8.2 уже выпущена.«нет»
Пояснение: Наличие версии Symfony 8.2 на 07.11.2026 не подтверждено известными планами релиза или фактами.
Raw
{"answer": "нет", "пояснение": "Наличие версии Symfony 8.2 на 07.11.2026 не подтверждено известными планами релиза или фактами."}
верноНаоборот: 8.2 ещё не выпущена — релиз в конце ноября 2026; последняя стабильная — 8.1.
T29-L2
0.44 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.47 c
Symfony: 8.2 и будущееКакая версия Symfony выйдет следующей после 8.1 (по состоянию на 07.11.2026)?«8.2»
Пояснение: Symfony использует схему версионирования major.minor, поэтому после 8.1 логично ожидать выход версии 8.2.
Raw
{ ⏎   "answer": "8.2", ⏎   "пояснение": "Symfony использует схему версионирования major.minor, поэтому после 8.1 логично ожидать выход версии 8.2." ⏎ }
верно8.2 — следующий минорный релиз (ноябрь 2026); после его выхода проект переходит с 8.1.* на 8.2.*.
T29-L4
2.87 c
Symfony: 8.2 и будущееSymfony 8.2 — мажорный релиз, требующий переписывания приложений под новые API.«нет»
Пояснение: Symfony 8.0 является мажорным релизом, который требует совместимости с PHP 8.4 и изменениями в API, но текущая стабильная ветка (на момент 2024-2025) находится в диапазоне 7.x, а версия 8.2 еще не существует как актуальный мажорный релиз, требующий переписывания именно из-за номера 8.2; обычно мажорные версии Symfony (4, 5, 6, 7, 8) действительно требуют миграций, но утверждение о конкретной версии 8.2 как уже вышедшем мажорном релизе, требующем переписывания *только потому что* это 8.2, некорректно в контексте текущего состояния экосистемы, где 7.x является текущей LTS/стабильной, а 8.0 недавно вышла. Однако, если интерпретировать вопрос как 'Является ли мажорный релиз (например, 8.0) таким, что требует переписывания?', то да, но вопрос конкретно про 'Symfony 8.2'. Поскольку 8.2 это минорная версия внутри мажорной 8, сама по себе 8.2 не требует *нового* переписывания API, отличного от 8.0. Обычно мажорные версии требуют миграций, минорные — совместимы. Поэтому утверждение, что именно 8.2 требует переписывания *как мажорный релиз*, неверно по терминологии: 8.2 — минорная версия. Мажорный релиз — это 8.0.
Raw
{"answer": "нет", "пояснение": "Symfony 8.0 является мажорным релизом, который требует совместимости с PHP 8.4 и изменениями в API, но текущая стабильная ветка (на момент 2024-2025) находится в диапазоне 7.x, а версия 8.2 еще не существует как актуальный мажорный релиз, требующий переписывания именно из-за номера 8.2; обычно мажорные версии Symfony (4, 5, 6, 7, 8) действительно требуют миграций, но утверждение о конкретной версии 8.2 как уже вышедшем мажорном релизе, требующем переписывания *только потому что* это 8.2, некорректно в контексте текущего состояния экосистемы, где 7.x является текущей LTS/стабильной, а 8.0 недавно вышла. Однако, если интерпретировать вопрос как 'Является ли мажорный релиз (например, 8.0) таким, что требует переписывания?', то да, но вопрос конкретно про 'Symfony 8.2'. Поскольку 8.2 это минорная версия внутри мажорной 8, сама по себе 8.2 не требует *нового* переписывания API, отличного от 8.0. Обычно мажорные версии требуют миграций, минорные — совместимы. Поэтому утверждение, что именно 8.2 требует переписывания *как мажорный релиз*, неверно по терминологии: 8.2 — минорная версия. Мажорный релиз — это 8.0."}
верноНаоборот: 8.2 — минорный релиз; новые возможности без поломки обратной совместимости. Мажор — 9.0.
T29-L5
0.54 c
Symfony: 8.2 и будущееОбновление внутри мажорной ветки (8.1 → 8.2) не должно требовать изменений кода — обратная совместимость сохраняется.«да»
Пояснение: Согласно политике PHP, обновления между версиями в рамках одной мажорной ветки (LTS) сохраняют обратную совместимость, не требуя изменений в коде.
Raw
{"answer": "да", "пояснение": "Согласно политике PHP, обновления между версиями в рамках одной мажорной ветки (LTS) сохраняют обратную совместимость, не требуя изменений в коде."}
верноПолитика Symfony: минорные релизы обратно совместимы; BC-break допустим только в мажорных.
T29-L6
0.36 c
Symfony: 8.2 и будущееКакая минорная версия ветки 8.x выйдет последней перед Symfony 9.0?«8.4»
Пояснение: Symfony 8.4 — последний релиз ветки 8.x перед выходом Symfony 9.0.
Raw
{"answer": "8.4", "пояснение": "Symfony 8.4 — последний релиз ветки 8.x перед выходом Symfony 9.0."}
верноПо циклу: 8.2 (ноя 2026), 8.3 (май 2027), 8.4 (ноя 2027, вместе с 9.0) — как 6.4 выходила вместе с 7.0.
T29-L7
0.44 c
Symfony: 8.2 и будущееSymfony 8.2 потребует обновления PHP до 8.5 — придётся обновлять PHP вместе с ней.«нет»
Пояснение: На текущий момент Symfony 8.2 не существует, а текущая линия (7.x) требует PHP 8.2+, не 8.5.
Raw
{"answer": "нет", "пояснение": "На текущий момент Symfony 8.2 не существует, а текущая линия (7.x) требует PHP 8.2+, не 8.5."}
верноНаоборот: минорные релизы не поднимают требования PHP; для всей ветки 8.x остаётся PHP >= 8.4.
T29-L8
0.47 c
Symfony: 8.2 и будущееDeprecations, добавленные в ветке 8.x, будут удалены не раньше Symfony 9.0.«да»
Пояснение: Согласно политике Symfony, функции, помеченные как deprecated в версии 8.x, гарантированно сохраняются до следующего major-релиза (9.0).
Raw
{"answer": "да", "пояснение": "Согласно политике Symfony, функции, помеченные как deprecated в версии 8.x, гарантированно сохраняются до следующего major-релиза (9.0)."}
верноПолитика: деприкейшены живут до следующего мажора; 9.0 — ноябрь 2027.
T21-L1
0.39 c
TwigВнутри {{ }} в Twig можно вызывать произвольный PHP-код напрямую.«нет»
Пояснение: Twig использует безопасный шаблонизатор, который не позволяет выполнять произвольный PHP-код внутри тегов, чтобы избежать уязвимостей.
Raw
{"answer": "нет", "пояснение": "Twig использует безопасный шаблонизатор, который не позволяет выполнять произвольный PHP-код внутри тегов, чтобы избежать уязвимостей."}
верноTwig — DSL: только разрешённые окружением функции/фильтры; произвольный PHP не исполняется.
T21-L2
0.27 c
TwigTwig по умолчанию автоматически экранирует выводимые переменные.«да»
Пояснение: В Twig автоэкранирование (autoescape) включено по умолчанию для безопасности.
Raw
{"answer": "да", "пояснение": "В Twig автоэкранирование (autoescape) включено по умолчанию для безопасности."}
верноAutoescape включён по умолчанию; {{ '<b>' }} → &lt;b&gt;. Проверено на Twig 3.30.
T21-L3
0.37 c
TwigФильтр |e в Twig экранирует строку для безопасного вывода в HTML-контексте.«да»
Пояснение: Фильтр |e (или |escape) в Twig действительно применяется для экранирования HTML-сущностей в целях предотвращения XSS-атак.
Raw
{"answer": "да", "пояснение": "Фильтр |e (или |escape) в Twig действительно применяется для экранирования HTML-сущностей в целях предотвращения XSS-атак."}
верно|e ('html') по умолчанию; есть контексты js/url/css. От SQL-инъекций он не защищает — это задача подготовленных запросов Doctrine.
T21-L4
0.3 c
TwigКакой фильтр из twig/intl-extra форматирует число с учётом локали?«num_format»
Пояснение: Фильтр num_format в twig/intl-extra используется для форматирования чисел с учётом указанной локали.
Raw
{"answer": "num_format", "пояснение": "Фильтр num_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.56 c
TwigФильтр |raw отключает автоэкранирование для значения.«нет»
Пояснение: Фильтр |raw (или e) в Blade шаблонах Laravel отключает HTML-экранирование вывода, но не имеет отношения к PHP-функциям экранирования данных (например, htmlspecialchars) или обработке ввода.
Raw
{"answer": "нет", "пояснение": "Фильтр |raw (или e) в Blade шаблонах Laravel отключает HTML-экранирование вывода, но не имеет отношения к PHP-функциям экранирования данных (например, htmlspecialchars) или обработке ввода."}
неверно
верный: «да»
{{ x|raw }} выводит HTML как есть; опасно с пользовательскими данными. Проверено на Twig 3.30.
T21-L6
0.5 c
TwigВ Twig {{ }} выводит значение выражения, а {% %} выполняет теги — условия, циклы, set.«да»
Пояснение: В Twig фигурные скобки {{ }} действительно используются для вывода значений выражений, а процентные знаки {% %} — для выполнения логических тегов (условий, циклов, объявления переменных).
Raw
{"answer": "да", "пояснение": "В Twig фигурные скобки {{ }} действительно используются для вывода значений выражений, а процентные знаки {% %} — для выполнения логических тегов (условий, циклов, объявления переменных)."}
верноДва блока синтаксиса Twig: вывод (echo) против логики.
T21-L7
0.34 c
TwigВ Twig нельзя объявить переменную в шаблоне — значения только передаются из контроллера.«нет»
Пояснение: В Twig можно объявлять локальные переменные с помощью тегов {% set %}.
Raw
{"answer": "нет", "пояснение": "В Twig можно объявлять локальные переменные с помощью тегов {% set %}."}
верно{% set y = ... %} объявляет переменную в шаблоне. Проверено на Twig 3.30.
T21-L8
0.32 c
TwigКакая функция Twig выводит отладочную структуру переменной (массива, объекта)?«dump»
Пояснение: Функция dump в Twig используется для вывода отладочной информации о структуре переменных.
Raw
{"answer": "dump", "пояснение": "Функция dump в Twig используется для вывода отладочной информации о структуре переменных."}
верно{{ dump(x) }} (DebugExtension; в Symfony доступна в dev-окружении).
T24-L1
0.54 c
BootstrapBootstrap — это CSS/JS-библиотека готовых компонентов интерфейса, а не SPA-фреймворк.«да»
Пояснение: Bootstrap представляет собой фреймворк CSS для создания адаптивных веб-страниц, содержащий готовые компоненты и утилиты, а не инструмент для создания одностраничных приложений (SPA) вроде React или Angular.
Raw
{"answer": "да", "пояснение": "Bootstrap представляет собой фреймворк CSS для создания адаптивных веб-страниц, содержащий готовые компоненты и утилиты, а не инструмент для создания одностраничных приложений (SPA) вроде React или Angular."}
верноКомпоненты и утилиты поверх вашего HTML; SPA-фреймворки (React/Vue) — другой класс инструментов. В проекте vendored 5.3.3.
T24-L2
0.37 c
BootstrapКакой класс Bootstrap задаёт адаптивный контейнер с фиксированной максимальной шириной по брейкпоинтам?«container»
Пояснение: Класс .container в Bootstrap задаёт адаптивную ширину с фиксированными максимальными значениями для каждого брейкпоинта.
Raw
{"answer": "container", "пояснение": "Класс .container в Bootstrap задаёт адаптивную ширину с фиксированными максимальными значениями для каждого брейкпоинта."}
верно.container (фиксированная макс-ширина по брейкпоинтам) vs .container-fluid (на всю ширину).
T24-L3
0.49 c
BootstrapСетка Bootstrap построена на CSS float и делит строку на 16 колонок.«нет»
Пояснение: Сетка Bootstrap 3 и раньше использовала float, но делила строку на 12 колонок, а не 16; в Bootstrap 4+ используется Flexbox.
Raw
{"answer": "нет", "пояснение": "Сетка Bootstrap 3 и раньше использовала float, но делила строку на 12 колонок, а не 16; в Bootstrap 4+ используется Flexbox."}
верноНаоборот: flexbox (с Bootstrap 4) и 12 колонок; float-сетка — это Bootstrap 3.
T24-L4
0.28 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.54 c
BootstrapУтилиты вроде .mt-3 или .px-2 используют шаг spacing-шкалы: число — множитель $spacer.«да»
Пояснение: В Tailwind CSS значения утилит маржинов и паддингов действительно вычисляются как произведение индекса (например, 3 или 2) на базовую переменную spacing ($spacer или --spacing).
Raw
{"answer": "да", "пояснение": "В Tailwind CSS значения утилит маржинов и паддингов действительно вычисляются как произведение индекса (например, 3 или 2) на базовую переменную spacing ($spacer или --spacing)."}
неверно
верный: «нет»
Число — ключ карты $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 (vanilla JS) и не требует jQuery в отличие от предыдущих версий.
Raw
{"answer": "да", "пояснение": "Bootstrap 5 полностью перешел на чистый JavaScript (vanilla JS) и не требует jQuery в отличие от предыдущих версий."}
верноjQuery удалён в Bootstrap 5.0: data-bs-* атрибуты и JS API. В проекте vendored 5.3.3.
T24-L8
0.39 c
BootstrapТёмную тему в Bootstrap включают классом .dark на корневом элементе.«нет»
Пояснение: Для переключения на тёмную тему в Bootstrap 5 используется класс .data-bs-theme="dark" на элементе <html>, а не .dark.
Raw
{"answer": "нет", "пояснение": "Для переключения на тёмную тему в Bootstrap 5 используется класс .data-bs-theme=\"dark\" на элементе <html>, а не .dark."}
верноНаоборот: тема включается атрибутом data-bs-theme="dark" (Color modes, с 5.3); класса .dark не существует. В проекте 5.3.3.
T14-L1
0.53 c
DoctrineDoctrine ORM сам создаёт таблицы в базе при первом обращении к сущности в рантайме.«нет»
Пояснение: Doctrine ORM не создает таблицы автоматически; для этого необходимо явно выполнить команду SchemaTool (например, doctrine:migrations:migrate или doctrine:schema:create) или использовать миграции.
Raw
{"answer": "нет", "пояснение": "Doctrine ORM не создает таблицы автоматически; для этого необходимо явно выполнить команду SchemaTool (например, doctrine:migrations:migrate или doctrine:schema:create) или использовать миграции."}
верноСхему создают инструменты (migrations, schema tool); рантайм структуру БД не меняет.
T14-L2
0.48 c
DoctrineКакой метод EntityManager помечает новый объект как управляемый, не выполняя SQL до flush()?«persist»
Пояснение: Метод EntityManager::persist() добавляет новый объект в контекст EntityManager, помечая его как управляемый, без немедленного выполнения SQL-запросов до вызова flush().
Raw
{"answer": "persist", "пояснение": "Метод EntityManager::persist() добавляет новый объект в контекст EntityManager, помечая его как управляемый, без немедленного выполнения SQL-запросов до вызова flush()."}
верноpersist() регистрирует объект в Unit of Work; INSERT выполняется на flush().
T14-L3
0.42 c
DoctrineВ Doctrine ORM 3 метод EntityManager::merge() доступен и делает переданный объект управляемым.«нет»
Пояснение: В Doctrine ORM 3 метод merge() был удален из EntityManager, для управления состоянием объекта следует использовать persist() или refresh().
Raw
{"answer": "нет", "пояснение": "В Doctrine ORM 3 метод merge() был удален из EntityManager, для управления состоянием объекта следует использовать persist() или refresh()."}
верноВ ORM 3 merge() удалён (в vendor проекта 3.7.6 метода нет); в Doctrine 2.x merge() возвращал управляемую копию. Версия зафиксирована — ORM 3.
T14-L4
0.44 c
DoctrineDQL-запросы пишутся в терминах сущностей и их полей, а не таблиц и столбцов.«да»
Пояснение: DQL (Doctrine Query Language) действительно ориентирован на объектную модель, позволяя работать с сущностями и их свойствами, а не с физическими таблицами БД.
Raw
{"answer": "да", "пояснение": "DQL (Doctrine Query Language) действительно ориентирован на объектную модель, позволяя работать с сущностями и их свойствами, а не с физическими таблицами БД."}
верноDoctrine транслирует DQL в SQL; docs — DQL (Doctrine Query Language).
T14-L5
0.44 c
DoctrineЧто вернёт $repository->find(999), если записи с идентификатором 999 нет?«null»
Пояснение: Метод find() в Doctrine (и большинства ORM) возвращает null, если сущность с указанным ID не найдена.
Raw
{"answer": "null", "пояснение": "Метод find() в Doctrine (и большинства ORM) возвращает null, если сущность с указанным ID не найдена."}
верноfind() возвращает null, если объект не найден (docs Repository methods).
T14-L6
0.61 c
DoctrineDoctrineBundle в Symfony автоматически вызывает flush() в конце каждого запроса.«да»
Пояснение: В Symfony (через DoctrineBundle) по умолчанию включен режим, при котором flush() вызывается автоматически в конце каждого запроса (на уровне контроллера), если не отключено вручную.
Raw
{"answer": "да", "пояснение": "В Symfony (через DoctrineBundle) по умолчанию включен режим, при котором flush() вызывается автоматически в конце каждого запроса (на уровне контроллера), если не отключено вручную."}
неверно
верный: «нет»
Авто-flush нет — flush() зовёт разработчик; незакрытая транзакция в конце запроса откатывается.
T14-L7
0.44 c
DoctrineДля управляемой сущности достаточно изменить свойство: flush() зафиксирует изменение без вызова persist() — Unit of Work отслеживает изменения.«да»
Пояснение: Doctrine Unit of Work отслеживает изменения в управляемых сущностях (managed entities), и flush() сохраняет эти изменения в базу данных без необходимости повторного вызова persist().
Raw
{"answer": "да", "пояснение": "Doctrine Unit of Work отслеживает изменения в управляемых сущностях (managed entities), и flush() сохраняет эти изменения в базу данных без необходимости повторного вызова persist()."}
верноDirty checking сравнивает снимки свойств; persist нужен только новым/отсоединённым объектам.
T14-L8
0.42 c
Doctrineremove() выполняет SQL DELETE сразу, не дожидаясь flush().«нет»
Пояснение: В Doctrine ORM метод remove() лишь помечает сущность для удаления в UnitOfWork, а физическое удаление (SQL DELETE) происходит при вызове flush().
Raw
{"answer": "нет", "пояснение": "В Doctrine ORM метод remove() лишь помечает сущность для удаления в UnitOfWork, а физическое удаление (SQL DELETE) происходит при вызове flush()."}
верноremove() планирует удаление в Unit of Work; DELETE выполняется на flush() (docs — Deleting Objects).
T15-L1
0.34 c
PostgreSQLPostgreSQL использует MVCC, поэтому читатели блокируют писателей, а писатели — читателей.«нет»
Пояснение: В MVCC читатели не блокируют писателей и писатели не блокируют читателей, так как они работают с разными версиями строк.
Raw
{"answer": "нет", "пояснение": "В MVCC читатели не блокируют писателей и писатели не блокируют читателей, так как они работают с разными версиями строк."}
верноНаоборот: благодаря MVCC читатели не блокируют писателей и наоборот (снимки строк); docs PostgreSQL — Concurrency Control.
T15-L2
0.38 c
PostgreSQLКакая команда SQL показывает план выполнения запроса, не выполняя сам запрос?«explain»
Пояснение: Команда EXPLAIN возвращает информацию о плане выполнения запроса (таблицы, индексы, порядок сканирования) без фактического выполнения самого запроса.
Raw
{"answer": "EXPLAIN", "пояснение": "Команда EXPLAIN возвращает информацию о плане выполнения запроса (таблицы, индексы, порядок сканирования) без фактического выполнения самого запроса."}
верноEXPLAIN без ANALYZE только строит план; проверено на PostgreSQL 17.7.
T15-L3
0.67 c
PostgreSQLSERIAL и GENERATED ... AS IDENTITY — это два названия одного и того же механизма.«нет»
Пояснение: Это два разных механизма: SERIAL — это синтаксический сахар, создающий отдельную таблицу-сиквенс, функцию и триггер, тогда как IDENTITY — это новый стандарт SQL, встроенный в определение столбца без создания зависимых объектов.
Raw
{"answer": "нет", "пояснение": "Это два разных механизма: SERIAL — это синтаксический сахар, создающий отдельную таблицу-сиквенс, функцию и триггер, тогда как IDENTITY — это новый стандарт SQL, встроенный в определение столбца без создания зависимых объектов."}
верноSERIAL — нестандартный макрос (sequence + DEFAULT), IDENTITY — SQL-стандарт; различаются владением и правами. Оба есть в PG 17 (проверено).
T15-L4
0.43 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.36 c
PostgreSQLКакая агрегатная функция PostgreSQL склеивает строки с разделителем?«string_agg»
Пояснение: Функция string_agg(value, delimiter) агрегирует строковые значения в одну строку с указанным разделителем.
Raw
{"answer": "string_agg", "пояснение": "Функция string_agg(value, delimiter) агрегирует строковые значения в одну строку с указанным разделителем."}
верноstring_agg(значение, разделитель); проверено на PostgreSQL 17.7.
T15-L6
0.4 c
PostgreSQLОбычный VACUUM возвращает место, занятое «мёртвыми» кортежами, операционной системе.«нет»
Пояснение: Обычный VACUUM лишь помечает страницы как доступные для повторного использования внутри базы данных и не возвращает дисковое место операционной системе.
Raw
{"answer": "нет", "пояснение": "Обычный VACUUM лишь помечает страницы как доступные для повторного использования внутри базы данных и не возвращает дисковое место операционной системе."}
верноVACUUM помечает место для переиспользования внутри таблицы; ОС его возвращает только VACUUM FULL (с эксклюзивной блокировкой).
T15-L7
0.48 c
PostgreSQLКакое ключевое слово в определении window-функции разбивает строки на группы, для которых считается функция?«partition by»
Пояснение: Ключевое слово PARTITION BY в SQL window-функциях определяет, по каким столбцам разделяются данные на группы для вычисления.
Raw
{"answer": "PARTITION BY", "пояснение": "Ключевое слово PARTITION BY в SQL window-функциях определяет, по каким столбцам разделяются данные на группы для вычисления."}
верноOVER (PARTITION BY ...); проверено на PostgreSQL 17.7.
T15-L8
0.37 c
PostgreSQLУровень изоляции READ COMMITTED защищает от неповторяющегося чтения (non-repeatable read).«нет»
Пояснение: READ COMMITTED защищает от грязного чтения, но не от неповторяющегося чтения; для этого требуется уровень REPEATABLE READ.
Raw
{"answer": "нет", "пояснение": "READ COMMITTED защищает от грязного чтения, но не от неповторяющегося чтения; для этого требуется уровень REPEATABLE READ."}
верноREAD COMMITTED допускает неповторяющееся чтение; защищает REPEATABLE READ. Проверено: SHOW transaction_isolation → read committed.
T17-L1
0.42 c
PostgreSQL: транзакции и индексыПо умолчанию PostgreSQL выполняет каждый отдельный SQL-оператор в собственной неявной транзакции (autocommit).«да»
Пояснение: По умолчанию PostgreSQL работает в режиме autocommit, если не открыта явная транзакция через START TRANSACTION или SET TRANSACTION.
Raw
{"answer": "да", "пояснение": "По умолчанию PostgreSQL работает в режиме autocommit, если не открыта явная транзакция через START TRANSACTION или SET TRANSACTION."}
верноБез BEGIN каждый оператор коммитится сам; docs PostgreSQL — Transactions. Проверено на PG 17.
T17-L2
0.28 c
PostgreSQL: транзакции и индексыКакая SQL-команда завершает транзакцию, сохраняя все её изменения?«commit»
Пояснение: Команда COMMIT используется для завершения транзакции с сохранением всех внесенных в ней изменений.
Raw
{"answer": "COMMIT", "пояснение": "Команда COMMIT используется для завершения транзакции с сохранением всех внесенных в ней изменений."}
верноCOMMIT (END — синоним). Проверено на PG 17.
T17-L3
0.44 c
PostgreSQL: транзакции и индексыИндексы ускоряют не только SELECT: UPDATE и DELETE с поиском по индексированному столбцу тоже выигрывают.«да»
Пояснение: Индексы ускоряют поиск строк, который нужен для UPDATE и DELETE, так как позволяют избежать полного сканирования таблицы.
Raw
{"answer": "да", "пояснение": "Индексы ускоряют поиск строк, который нужен для UPDATE и DELETE, так как позволяют избежать полного сканирования таблицы."}
верноПоиск строк для изменения идёт по индексу; docs PostgreSQL — Indexes.
T17-L4
0.39 c
PostgreSQL: транзакции и индексыДля отката части операторов внутри транзакции PostgreSQL использует SAVEPOINT.«да»
Пояснение: SAVEPOINT позволяет создать точку отката внутри транзакции, позволяя откатить операции только до этой точки, а не всю транзакцию.
Raw
{ ⏎ "answer": "да", ⏎ "пояснение": "SAVEPOINT позволяет создать точку отката внутри транзакции, позволяя откатить операции только до этой точки, а не всю транзакцию." ⏎ }
верноSAVEPOINT name; ROLLBACK TO name — частичный откат без отмены всей транзакции. Проверено на PG 17.
T17-L5
0.4 c
PostgreSQL: транзакции и индексыEXPLAIN ANALYZE показывает план запроса, не выполняя сам запрос.«нет»
Пояснение: EXPLAIN ANALYZE (в PostgreSQL) выполняет запрос и показывает фактические временные затраты, в отличие от обычного EXPLAIN.
Raw
{"answer": "нет", "пояснение": "EXPLAIN ANALYZE (в PostgreSQL) выполняет запрос и показывает фактические временные затраты, в отличие от обычного EXPLAIN."}
верноНаоборот: ANALYZE реально выполняет запрос (с побочными эффектами!) и показывает фактические времена узлов; план без выполнения — plain EXPLAIN.
T17-L6
0.28 c
PostgreSQL: транзакции и индексыКакое расширение PostgreSQL добавляет векторные типы и индексы для поиска по эмбеддингам?«pgvector»
Пояснение: Расширение pgvector предоставляет поддержку векторных типов и индексов в PostgreSQL.
Raw
{"answer": "pgvector", "пояснение": "Расширение pgvector предоставляет поддержку векторных типов и индексов в PostgreSQL."}
верноCREATE EXTENSION vector (проект pgvector; в проекте образ pgvector/pgvector:pg17).
T17-L7
0.3 c
PostgreSQL: транзакции и индексыЧастичный индекс (CREATE INDEX ... WHERE ...) строится только по строкам, удовлетворяющим условию.«да»
Пояснение: Частичный индекс действительно хранит записи только для строк, соответствующих условию WHERE.
Raw
{"answer": "да", "пояснение": "Частичный индекс действительно хранит записи только для строк, соответствующих условию WHERE."}
верноdocs PostgreSQL — Partial Indexes; типичный кейс — индекс по «активным» записям.
T17-L8
0.56 c
PostgreSQL: транзакции и индексыУровень SERIALIZABLE в PostgreSQL реализован блокировкой строк, которые читает транзакция.«нет»
Пояснение: Уровень SERIALIZABLE в PostgreSQL обеспечивает изоляцию за счет детекции конфликтов с помощью предикатной блокировки и отката транзакций (Serializable Snapshot Isolation), а не путем блокировки читаемых строк.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Уровень SERIALIZABLE в PostgreSQL обеспечивает изоляцию за счет детекции конфликтов с помощью предикатной блокировки и отката транзакций (Serializable Snapshot Isolation), а не путем блокировки читаемых строк." ⏎ }
верноSSI (Serializable Snapshot Isolation): предикатные блокировки на снимках, не блокировки прочитанных строк; docs PostgreSQL.
T19-L1
0.35 c
HTTP и REST APIHTTP-статус 201 означает, что в результате запроса создан новый ресурс.«да»
Пояснение: HTTP-статус 201 Created действительно указывает на успешное создание нового ресурса по запросу клиента.
Raw
{"answer": "да", "пояснение": "HTTP-статус 201 Created действительно указывает на успешное создание нового ресурса по запросу клиента."}
верно201 Created; обычно на POST, часто с Location; RFC 9110.
T19-L2
0.3 c
HTTP и REST APIКакой HTTP-статус означает успешный запрос с пустым телом ответа (например, после DELETE)?«204»
Пояснение: Статус 204 (No Content) означает успешное выполнение запроса без тела ответа.
Raw
{"answer": 204, "пояснение": "Статус 204 (No Content) означает успешное выполнение запроса без тела ответа."}
верно204 No Content; RFC 9110.
T19-L3
0.42 c
HTTP и REST APIМетод DELETE идемпотентен по спецификации HTTP: повторный запрос по тому же ресурсу не меняет результат.«да»
Пояснение: Согласно спецификации HTTP (RFC 7231), метод DELETE считается идемпотентным, так как повторное удаление одного и того же ресурса не меняет состояния сервера.
Raw
{"answer": "да", "пояснение": "Согласно спецификации HTTP (RFC 7231), метод DELETE считается идемпотентным, так как повторное удаление одного и того же ресурса не меняет состояния сервера."}
верноRFC 9110: DELETE идемпотентен (как PUT); идемпотентность ≠ безопасность — ресурс удаляется при первом вызове.
T19-L4
0.4 c
HTTP и REST APIЗаголовок Access-Control-Allow-Origin отправляет клиент, чтобы сервер разрешил принимать запросы с другого origin.«нет»
Пояснение: Заголовок Access-Control-Allow-Origin отправляет сервер, чтобы разрешить браузеру считать ответ допустимым для другого origin.
Raw
{"answer": "нет", "пояснение": "Заголовок Access-Control-Allow-Origin отправляет сервер, чтобы разрешить браузеру считать ответ допустимым для другого origin."}
верноНаоборот: заголовок шлёт СЕРВЕР в ответе, разрешая браузеру cross-origin запрос (CORS); в проекте nelmio/cors-bundle.
T19-L5
0.37 c
HTTP и REST APIКод 429 Too Many Requests используется, когда клиент превысил лимит запросов (rate limiting).«да»
Пояснение: Код 429 как раз предназначен для указания, что клиент отправил слишком много запросов за заданный промежуток времени.
Raw
{"answer": "да", "пояснение": "Код 429 как раз предназначен для указания, что клиент отправил слишком много запросов за заданный промежуток времени."}
верно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.34 c
HTTP и REST APIКакой HTTP-заголовок указывает MIME-тип тела запроса или ответа?«content-type»
Пояснение: Заголовок Content-Type определяет тип данных и кодировку передаваемого тела сообщения.
Raw
{"answer": "Content-Type", "пояснение": "Заголовок Content-Type определяет тип данных и кодировку передаваемого тела сообщения."}
верноContent-Type: application/json и т.п.
T19-L8
0.33 c
HTTP и REST APIPATCH не обязан быть идемпотентным по RFC 5789, в отличие от PUT.«да»
Пояснение: RFC 5789 явно указывает, что PATCH не обязан быть идемпотентным, тогда как PUT по определению является идемпотентным.
Raw
{"answer": "да", "пояснение": "RFC 5789 явно указывает, что PATCH не обязан быть идемпотентным, тогда как PUT по определению является идемпотентным."}
верноRFC 5789 прямо оговаривает: PATCH не гарантированно идемпотентен; PUT идемпотентен.
T20-L1
0.56 c
Безопасность и OAuthПроверить пароль достаточно сравнением его хеша с хешем из базы обычным оператором ==.«нет»
Пояснение: Сравнение хешей следует выполнять через оператор === или функцию hash_equals() для предотвращения атак по времени (timing attack) и обеспечения строгого сравнения типов.
Raw
{"answer": "нет", "пояснение": "Сравнение хешей следует выполнять через оператор === или функцию hash_equals() для предотвращения атак по времени (timing attack) и обеспечения строгого сравнения типов."}
верноНужна постоянновременная проверка (password_verify) — timing-атаки; соль и алгоритм уже внутри хеша.
T20-L2
0.34 c
Безопасность и OAuthCSRF-токен выдаётся сервером (привязан к сессии) и проверяется на сервере при unsafe-запросах (POST и т.п.).«да»
Пояснение: CSRF-токен действительно генерируется сервером, хранится в сессии и проверяется на стороне сервера при обработке небезопасных запросов.
Raw
{"answer": "да", "пояснение": "CSRF-токен действительно генерируется сервером, хранится в сессии и проверяется на стороне сервера при обработке небезопасных запросов."}
верноsymfony/security-csrf в проекте; защита от подделки межсайтовой формы.
T20-L3
0.32 c
Безопасность и OAuthКакой HTTP-заголовок включает политику CSP (Content Security Policy)?«content-security-policy»
Пояснение: Политика CSP передается в заголовке Content-Security-Policy.
Raw
{"answer": "Content-Security-Policy", "пояснение": "Политика CSP передается в заголовке Content-Security-Policy."}
верноContent-Security-Policy; белые списки источников скриптов/стилей против XSS.
T20-L4
0.48 c
Безопасность и OAuthOAuth 2.0 — протокол аутентификации: access-токен сообщает, кто именно пользователь.«нет»
Пояснение: OAuth 2.0 — это протокол авторизации, а не аутентификации, и access-токен предоставляет права доступа к ресурсам, а не идентифицирует пользователя напрямую (для этого используется id_token в OpenID Connect).
Raw
{"answer": "нет", "пояснение": "OAuth 2.0 — это протокол авторизации, а не аутентификации, и access-токен предоставляет права доступа к ресурсам, а не идентифицирует пользователя напрямую (для этого используется id_token в OpenID Connect)."}
верноOAuth 2.0 — авторизация/делегирование доступа; аутентификацию добавляет OpenID Connect. В проекте knpuniversity/oauth2-client-bundle (yandex/github/google).
T20-L5
0.39 c
Безопасность и OAuthXSS предотвращается валидацией ввода на сервере перед записью в базу.«нет»
Пояснение: Валидация ввода не предотвращает XSS, если данные не экранируются при выводе в браузер (output encoding).
Raw
{"answer": "нет", "пояснение": "Валидация ввода не предотвращает XSS, если данные не экранируются при выводе в браузер (output encoding)."}
верноXSS лечится контекстным экранированием НА ВЫВОДЕ (Twig autoescape, CSP); валидация ввода не покрывает все контексты вывода.
T20-L6
0.28 c
Безопасность и OAuthВ authorization code flow OAuth 2.0 какой параметр приходит в redirect_uri и обменивается на access-токен?«code»
Пояснение: В authorization code flow параметр code возвращается в redirect_uri и используется для обмена на access-токен.
Raw
{"answer": "code", "пояснение": "В authorization code flow параметр code возвращается в redirect_uri и используется для обмена на access-токен."}
верноПараметр code; обмен на токен POST-ом на /token с client_secret.
T20-L7
0.36 c
Безопасность и OAuthRefresh-токен живёт дольше access-токена и позволяет получить новый access-токен без повторного входа пользователя.«да»
Пояснение: Refresh-токен действительно имеет более длительный срок действия и используется для получения нового access-токена без необходимости повторной аутентификации пользователя.
Raw
{"answer": "да", "пояснение": "Refresh-токен действительно имеет более длительный срок действия и используется для получения нового access-токена без необходимости повторной аутентификации пользователя."}
верноСтандартная схема OAuth/OIDC: короткий access + длинный refresh.
T20-L8
0.33 c
Безопасность и OAuthСоль пароля нужно держать в секрете: без неё хеш нельзя проверить.«нет»
Пояснение: Соль должна храниться в открытом виде вместе с хешем, чтобы при проверке пароля её можно было извлечь и использовать.
Raw
{"answer": "нет", "пояснение": "Соль должна храниться в открытом виде вместе с хешем, чтобы при проверке пароля её можно было извлечь и использовать."}
верноСоль хранится открыто (password_hash включает её в строку хеша); секретность соли не нужна.
T18-L1
0.49 c
Тестирование: PHPUnitPHPUnit выполняет тестовые методы любого класса — наследовать TestCase не обязательно.«нет»
Пояснение: Для работы с PHPUnit класс тестов должен наследовать \PHPUnit\Framework\TestCase (или использовать трейт), чтобы получить доступ к методам assertions и механизму запуска тестов.
Raw
{"answer": "нет", "пояснение": "Для работы с PHPUnit класс тестов должен наследовать \\PHPUnit\\Framework\\TestCase (или использовать трейт), чтобы получить доступ к методам assertions и механизму запуска тестов."}
верноТестом считается метод класса, наследующего TestCase (PHPUnit 10).
T18-L2
0.25 c
Тестирование: PHPUnitМетод setUp() в PHPUnit вызывается один раз перед всеми тестами класса.«нет»
Пояснение: Метод setUp() вызывается перед каждым тестом класса, а не один раз.
Raw
{"answer": "нет", "пояснение": "Метод setUp() вызывается перед каждым тестом класса, а не один раз."}
верноsetUp() — перед КАЖДЫМ тестом; один раз на класс — setUpBeforeClass(). Проверено живым счётчиком на PHPUnit 10.5.
T18-L3
0.4 c
Тестирование: PHPUnitПоставщик данных (data provider) позволяет прогнать тест ровно с одним набором аргументов.«нет»
Пояснение: Data provider предназначен для предоставления множества наборов аргументов, что позволяет прогонять один и тот же тест многократно с разными параметрами.
Raw
{ ⏎   "answer": "нет", ⏎   "пояснение": "Data provider предназначен для предоставления множества наборов аргументов, что позволяет прогонять один и тот же тест многократно с разными параметрами." ⏎ }
верноНаоборот: наборов может быть сколько угодно — тест выполняется по разу на каждый. Проверено на PHPUnit 10.5 (#[DataProvider]).
T18-L4
0.29 c
Тестирование: PHPUnitКакой метод PHPUnit объявляет ожидание исключения определённого класса?«expectexception»
Пояснение: Метод expectException() используется для указания ожидаемого класса исключения в PHPUnit.
Raw
{"answer": "expectException", "пояснение": "Метод expectException() используется для указания ожидаемого класса исключения в PHPUnit."}
верно$this->expectException(\LogicException::class); проверено на PHPUnit 10.5.
T18-L5
0.44 c
Тестирование: PHPUnitВ PHPUnit стаб (stub) проверяет, какие методы на нём вызывали, а мок (mock) только подставляет данные.«нет»
Пояснение: Это утверждение неверно, так как определения перепутаны: мок (mock) предназначен для проверки вызовов методов, а стаб (stub) — только для подстановки данных.
Raw
{"answer": "нет", "пояснение": "Это утверждение неверно, так как определения перепутаны: мок (mock) предназначен для проверки вызовов методов, а стаб (stub) — только для подстановки данных."}
верноНаоборот: стаб подставляет данные, мок проверяет взаимодействия (createStub/createMock); docs PHPUnit — Test Doubles.
T18-L6
0.43 c
Тестирование: PHPUnitВ PHPUnit 10+ рекомендуемый способ передачи данных в тест — атрибут #[DataProvider] (аннотация @dataProvider устарела).«да»
Пояснение: В PHPUnit 10 и выше атрибуты PHP являются основным рекомендуемым способом, а аннотации были удалены/устарели.
Raw
{"answer": "да", "пояснение": "В PHPUnit 10 и выше атрибуты PHP являются основным рекомендуемым способом, а аннотации были удалены/устарели."}
верноАннотация ещё парсится в PHPUnit 10/11 (AnnotationParser в 10.5.66), удаление — в 12; атрибут — стандарт.
T18-L7
0.37 c
Тестирование: PHPUnitВ PHPUnit нельзя объявить зависимость одного теста от результата другого.«— (нет ответа)»
Пояснение: PHPUnit спроектирован так, чтобы каждый тест был независим и выполнялся в изолированном окружении, поэтому прямые зависимости между тестами не поддерживаются.
Raw
{"answer": "верно", "пояснение": "PHPUnit спроектирован так, чтобы каждый тест был независим и выполнялся в изолированном окружении, поэтому прямые зависимости между тестами не поддерживаются."}
не разобрано
верный: «нет»
парсинг: нет
Зависимости есть: #[Depends] — зависимый тест не запустится, еслиProducer упал.
T18-L8
0.48 c
Тестирование: PHPUnitКакая опция командной строки PHPUnit включает случайный порядок выполнения тестов?«--order-by=defects»
Пояснение: Опция --order-by=defects запускает тесты в случайном порядке (или упорядочивает их по количеству сбоев).
Raw
{"answer": "--order-by=defects", "пояснение": "Опция --order-by=defects запускает тесты в случайном порядке (или упорядочивает их по количеству сбоев)."}
неверно
верный: «--order-by=random»
--order-by=random (PHPUnit 9+); опция есть в --help PHPUnit 10.5 (проектная).
T01-L9
3.48 c
Синтаксис и операторыЧто выведет этот код? ```php echo intdiv(7, 2) . intdiv(-7, 2); ```«3-4»
Пояснение: intdiv выполняет целочисленное деление: 7/2=3 и -7/2=-4 (отрицательное число делится с округлением к нулю), что конкатенируется в строку "3-4".
Raw
{"answer": "3-4", "пояснение": "intdiv выполняет целочисленное деление: 7/2=3 и -7/2=-4 (отрицательное число делится с округлением к нулю), что конкатенируется в строку \"3-4\"."}
неверно
верный: «3-3»
intdiv обрезает к нулю: intdiv(-7, 2) = -3, не -4.
T01-L10
0.49 c
Синтаксис и операторыЧто выведет этот код? ```php echo -3 ** 2; ```«9»
Пояснение: В PHP оператор возведения в степень имеет приоритет выше унарного отрицания, поэтому код эквивалентен `-(3 ** 2)`, что равно -9.
Raw
{"answer": 9, "пояснение": "В PHP оператор возведения в степень имеет приоритет выше унарного отрицания, поэтому код эквивалентен `-(3 ** 2)`, что равно -9."}
неверно
верный: «-9»
** правоассоциативен и связывает крепче унарного минуса: -(3²).
T02-L9
1.09 c
Типы и сравненияЧто выведет этот код? ```php echo '1e1' == '10' ? 'true' : 'false'; ```«true»
Пояснение: В PHP 8 сравнение строки '1e1' (которая не является чистой целой или вещественной строкой) со строкой '10' выполняется как сравнение строк: '1e1' лексикографически меньше '10', но оператор == для строк в PHP 8 при несовпадении типов или форматов часто приводит к сравнению чисел, однако '1e1' трактуется как 10, а '10' как 10, поэтому сравнение истинно.
Raw
{"answer": "true", "пояснение": "В PHP 8 сравнение строки '1e1' (которая не является чистой целой или вещественной строкой) со строкой '10' выполняется как сравнение строк: '1e1' лексикографически меньше '10', но оператор == для строк в PHP 8 при несовпадении типов или форматов часто приводит к сравнению чисел, однако '1e1' трактуется как 10, а '10' как 10, поэтому сравнение истинно."}
верноОбе строки числовые — сравнение как чисел: 10 == 10.
T02-L10
0.39 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
2.0 c
СтрокиЧто выведет этот код? ```php echo strtr('abc', ['a' => '1', 'ab' => '2']); ```«12c»
Пояснение: Функция strtr замещает подстроки 'a' и 'ab' на '1' и '2' соответственно, при этом 'ab' заменяется целиком из-за приоритета более длинных ключей в массиве, но в данном случае алгоритм работает от первого совпадения, заменяя 'a' на '1', 'b' остается, а 'c' тоже, однако правильная логика strtr с массивом — это замена наихорнейших подстрок, и обычно длиннее приоритетнее, но в PHP strtr при замене массивом ищет самое длинное вхождение, если ключи перекрываются. В данном примере 'ab' длиннее 'a', поэтому 'ab' заменяется на '2', а 'c' остается. Результат: '2c'. Перепроверяем: строка 'abc'. Ключи 'a' и 'ab'. Алгоритм ищет самое длинное вхождение. 'ab' есть, заменяется на '2'. Остаток 'c'. Результат '2c'.
Raw
{"answer": "12c", "пояснение": "Функция strtr замещает подстроки 'a' и 'ab' на '1' и '2' соответственно, при этом 'ab' заменяется целиком из-за приоритета более длинных ключей в массиве, но в данном случае алгоритм работает от первого совпадения, заменяя 'a' на '1', 'b' остается, а 'c' тоже, однако правильная логика strtr с массивом — это замена наихорнейших подстрок, и обычно длиннее приоритетнее, но в PHP strtr при замене массивом ищет самое длинное вхождение, если ключи перекрываются. В данном примере 'ab' длиннее 'a', поэтому 'ab' заменяется на '2', а 'c' остается. Результат: '2c'. Перепроверяем: строка 'abc'. Ключи 'a' и 'ab'. Алгоритм ищет самое длинное вхождение. 'ab' есть, заменяется на '2'. Остаток 'c'. Результат '2c'."}
неверно
верный: «2c»
strtr с массивом предпочитает самое длинное совпадение ключа.
T03-L10
0.39 c
СтрокиЧто выведет этот код? ```php echo '[' . substr('hello', -10) . ']'; ```«[hello]»
Пояснение: Функция substr() возвращает исходную строку, если отрицательное смещение превышает ее длину.
Raw
{"answer": "[hello]", "пояснение": "Функция substr() возвращает исходную строку, если отрицательное смещение превышает ее длину."}
верноОтрицательный старт за пределами строки зажимается к началу.
T04-L9
0.45 c
МассивыЧто выведет этот код? ```php $a = ['k' => 1, 'n' => 2]; $b = ['k' => 9, 'm' => 3]; echo implode(',', array_keys($a + $b)); ```«k,n,m»
Пояснение: Оператор + объединяет массивы, приоритет дают ключам левого массива, поэтому результирующий массив содержит ключи k, n и m.
Raw
{"answer": "k,n,m", "пояснение": "Оператор + объединяет массивы, приоритет дают ключам левого массива, поэтому результирующий массив содержит ключи k, n и m."}
верноОператор + : при дубликатах строковых ключей побеждает левый массив.
T04-L10
0.71 c
МассивыЧто выведет этот код? ```php $a = [[1, 'x', 2], [2, 'y', 1], [3, 'z', 2]]; usort($a, fn($p, $q) => $p[2] <=> $q[2]); echo implode('', array_column($a, 1)); ```«xyz»
Пояснение: Массивы сортируются по третьему элементу: [1, 'x', 2], [3, 'z', 2], [2, 'y', 1] (или любая другая последовательность с двумя '2' сначала), затем извлекаются вторые элементы и склеиваются.
Raw
{"answer": "xyz", "пояснение": "Массивы сортируются по третьему элементу: [1, 'x', 2], [3, 'z', 2], [2, 'y', 1] (или любая другая последовательность с двумя '2' сначала), затем извлекаются вторые элементы и склеиваются."}
неверно
верный: «yxz»
Сортировка стабильна с 8.0: x и z при равном ключе сохраняют порядок.
T05-L10
0.5 c
Функции и замыканияЧто выведет этот код? ```php function f(int $a, int $b): int { return $a - $b; } echo f(...['b' => 1, 'a' => 5]); ```«4»
Пояснение: Распаковка массива с ассоциативными ключами передает аргументы именованно, поэтому $a=5 и $b=1, результат 5-1=4.
Raw
{"answer": 4, "пояснение": "Распаковка массива с ассоциативными ключами передает аргументы именованно, поэтому $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 сохраняет ссылку на объект $p; после обнуления переменной $p объект продолжает существовать до вызова $f(), возвращая 3.
Raw
{"answer": "3", "пояснение": "Замыкание $f сохраняет ссылку на объект $p; после обнуления переменной $p объект продолжает существовать до вызова $f(), возвращая 3."}
верноПервая-class callable синтаксис привязывает $this при создании.
T06-L9
0.51 c
ООП: классы и наследованиеЧто выведет этот код? ```php class A { public function who(): string { return static::class; } } class B extends A {} echo (new B)->who(); ```«b»
Пояснение: Метод who() возвращает static::class, что в контексте экземпляра класса B (наследуемого от A) выводит имя текущего класса, то есть B.
Raw
{"answer": "B", "пояснение": "Метод who() возвращает static::class, что в контексте экземпляра класса B (наследуемого от A) выводит имя текущего класса, то есть B."}
верноПозднее статическое связывание: static::class = класс получателя.
T06-L10
0.46 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 срабатывает setter, который умножает его на 2, поэтому $c->x становится 10.
Raw
{"answer": 10, "пояснение": "При назначении значения 5 срабатывает setter, который умножает его на 2, поэтому $c->x становится 10."}
верноВнутри set-хука $this->x пишет в backing store (без рекурсии): 5*2.
T07-L9
0.56 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»
Пояснение: Оператор insteadof определяет, что метод f из трейта TB переопределяет метод f из TA, а as создает алиас g для исходного метода f из TA.
Raw
{"answer": "BA", "пояснение": "Оператор insteadof определяет, что метод f из трейта TB переопределяет метод f из TA, а as создает алиас g для исходного метода f из TA."}
верноinsteadof выбирает реализацию, as оставляет вторую под другим именем.
T07-L10
0.52 c
Интерфейсы, трейты, enumЧто выведет этот код? ```php trait Counter { public static int $n = 0; } class CX { use Counter; } class CY { use Counter; } CX::$n = 1; echo CY::$n; ```«1»
Пояснение: Статические свойства наследуются от трейта каждым классом, использующим его, поэтому все классы, использующие трейт, разделяют одно и то же статическое свойство.
Raw
{ ⏎ "answer": "1", ⏎ "пояснение": "Статические свойства наследуются от трейта каждым классом, использующим его, поэтому все классы, использующие трейт, разделяют одно и то же статическое свойство." ⏎ }
неверно
верный: «0»
Статическое свойство трейта копируется в каждый использующий класс.
T08-L10
0.36 c
Исключения и ошибкиЧто выведет этот код? ```php function f(): int { try { return 1; } finally { return 2; } } echo f(); ```«2»
Пояснение: Блок finally выполнит свой return, который перезаписывает результат из try.
Raw
{"answer": 2, "пояснение": "Блок finally выполнит свой return, который перезаписывает результат из try."}
верно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, заменяет предыдущее, попадая в catch.
Raw
{ ⏎ "answer": "second", ⏎ "пояснение": "Код в блоке finally выполняется при выходе из try (в том числе при возникновении исключения), и новое исключение, брошенное в finally, заменяет предыдущее, попадая в catch." ⏎ }
верноИсключение из finally подменяет уже летящее — ловится последнее.
T09-L9
0.48 c
Пространства имён и автозагрузкаЧто выведет этот код? ```php namespace N; use App\Foo as Baz; echo Baz::class . '|' . \Baz::class; ```«n\baz|baz»
Пояснение: Алиас Baz внутри namespace N резолвится как N\Baz, а глобальный \Baz резолвится как Baz.
Raw
{"answer": "N\\Baz|Baz", "пояснение": "Алиас Baz внутри namespace N резолвится как N\\Baz, а глобальный \\Baz резолвится как Baz."}
неверно
верный: «app\foo|baz»
use-алиас действует на неквалифицированные имена; ведущий \ уводит в глобальную область.
T09-L10
0.47 c
Пространства имён и автозагрузкаЧто выведет этот код? ```php namespace Ns; class Foo {} $c = 'Foo'; echo (class_exists($c) ? 'yes' : 'no') . (class_exists(__NAMESPACE__ . '\\' . $c) ? 'yes' : 'no'); ```«noyes»
Пояснение: class_exists('Foo') ищет класс в глобальном пространстве имён и не находит его, поэтому выводит 'no', а class_exists('Ns\Foo') находит класс в текущем пространстве имён и выводит 'yes'.
Raw
{"answer": "noyes", "пояснение": "class_exists('Foo') ищет класс в глобальном пространстве имён и не находит его, поэтому выводит 'no', а class_exists('Ns\\Foo') находит класс в текущем пространстве имён и выводит 'yes'."}
верноДинамические имена не резолвятся относительно namespace — 'Foo' это глобальный класс.
T10-L9
0.51 c
Ссылки и область видимостиЧто выведет этот код? ```php $a = [1, 2, 3]; foreach ($a as &$v) {} $v = 99; echo implode(',', $a); ```«1,2,3»
Пояснение: Переменная $v не является ссылкой на элемент массива, так как foreach без оператора & создаёт копию значения.
Raw
{"answer": "1,2,3", "пояснение": "Переменная $v не является ссылкой на элемент массива, так как foreach без оператора & создаёт копию значения."}
неверно
верный: «1,2,99»
После foreach по ссылке $v остаётся ссылкой на последний элемент.
T10-L10
0.73 c
Ссылки и область видимостиЧто выведет этот код? ```php class A { public function inc(): int { static $n = 0; return ++$n; } } class B extends A {} $a = new A; $b = new B; $a->inc(); $b->inc(); echo $a->inc(); ```«3»
Пояснение: В PHP статические переменные внутри функций разделяются между классами-наследниками и родительским классом (если только наследник не переопределяет метод), поэтому счетчик общий: 1, затем 2, затем 3.
Raw
{ ⏎   "answer": 3, ⏎   "пояснение": "В PHP статические переменные внутри функций разделяются между классами-наследниками и родительским классом (если только наследник не переопределяет метод), поэтому счетчик общий: 1, затем 2, затем 3." ⏎ }
верноstatic-переменная метода одна на метод родителя — наследники делят её.
T11-L9
0.5 c
Генераторы, итераторы, SPLЧто выведет этот код? ```php function g(): Generator { $x = yield 1; return $x + 1; } $g = g(); $g->send(10); echo $g->getReturn(); ```«11»
Пояснение: Метод send(10) присваивает переменной $x значение 10, генератор возвращает 10 + 1 = 11, что и выводится.
Raw
{"answer": 11, "пояснение": "Метод send(10) присваивает переменной $x значение 10, генератор возвращает 10 + 1 = 11, что и выводится."}
верноsend() возобновляет генератор: $x = 10, return 10+1.
T11-L10
0.56 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())); ```«ok»
Пояснение: Оператор `yield from` делегирует генератор, а выражение `yield from ...` возвращает значение, переданное с помощью `return` внутри внутреннего генератора, которое затем выводится.
Raw
{"answer": "ok", "пояснение": "Оператор `yield from` делегирует генератор, а выражение `yield from ...` возвращает значение, переданное с помощью `return` внутри внутреннего генератора, которое затем выводится."}
неверно
верный: «ok,2»
yield from не двигает авто-ключ внешнего генератора: yield $r получает ключ 0 и перезаписывает единицу — 'ok' оказывается первым.
T12-L9
0.51 c
Конфигурация и безопасностьЧто выведет этот код? ```php $hash = password_hash('x', PASSWORD_BCRYPT, ['cost' => 4]); echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 4]) ? 'yes' : 'no'; echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 5]) ? 'yes' : 'no'; ```«noyes»
Пояснение: password_needs_rehash возвращает false (выводя 'no'), если стоимость хеша совпадает, и true (выводя 'yes'), если требуется новый хеш из-за отличия стоимости.
Raw
{"answer": "noyes", "пояснение": "password_needs_rehash возвращает false (выводя 'no'), если стоимость хеша совпадает, и true (выводя 'yes'), если требуется новый хеш из-за отличия стоимости."}
верноpassword_needs_rehash сравнивает параметры хэша с целевыми: cost 4 = 4 → 'no', cost 5 ≠ 4 → 'yes'.
T12-L10
0.47 c
Конфигурация и безопасностьЧто выведет этот код на PHP 8.5? ```php echo (E_ALL & 2048) === 0 ? 'strict-out' : 'strict-in'; ```«strict-in»
Пояснение: В PHP 8.5 значение E_ALL содержит флаг 2048 (E_STRICT), поэтому результат сравнения не равен 0 и выводится 'strict-in'.
Raw
{"answer": "strict-in", "пояснение": "В PHP 8.5 значение E_ALL содержит флаг 2048 (E_STRICT), поэтому результат сравнения не равен 0 и выводится 'strict-in'."}
неверно
верный: «strict-out»
В PHP 8.4+ E_STRICT удалён из E_ALL: бит 2048 не установлен → 'strict-out' (2048 — исторический бит E_STRICT).
T13-L9
0.57 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 заголовки с префиксом HTTP_ и подчеркиваниями в camelCase или kebab-case ключи, поэтому 'HTTP_X_TOKEN' доступен как 'X-Token'.
Raw
{"answer": "mapped", "пояснение": "Symfony автоматически преобразует HTTP заголовки с префиксом HTTP_ и подчеркиваниями в camelCase или kebab-case ключи, поэтому 'HTTP_X_TOKEN' доступен как 'X-Token'."}
верноСравнение с литералом требует знания маппинга: HttpFoundation переводит HTTP_X_TOKEN в заголовок X-Token (регистр не важен); не знающий маппинг ответит 'missing'.
T13-L10
0.42 c
SymfonyЧто выведет этот код? ```php use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Contracts\EventDispatcher\Event; $d = new EventDispatcher(); $out = ''; $d->addListener('e', function () use (&$out) { $out .= 'B'; }, 10); $d->addListener('e', function () use (&$out) { $out .= 'A'; }); $d->addListener('e', function () use (&$out) { $out .= 'C'; }, 5); $d->dispatch(new Event(), 'e'); echo $out; ```«cba»
Пояснение: Слушатели вызываются в порядке убывания приоритета: C (5), B (10), A (0).
Raw
{"answer": "CBA", "пояснение": "Слушатели вызываются в порядке убывания приоритета: C (5), B (10), A (0)."}
неверно
верный: «bca»
Порядок листенеров — по убыванию приоритета: 10 (B), 5 (C), 0 (A).
T14-L10
0.47 c
DoctrineДано: Doctrine ORM 3, EntityManager на SQLite in-memory, entity User с автоинкрементным первичным ключом. Таблица users пуста. Что выведет этот код? ```php $u = new User(name: 'A'); $em->persist($u); $em->flush(); $a = $em->find(User::class, $u->getId()); $b = $em->find(User::class, $u->getId()); echo spl_object_id($a) === spl_object_id($b) ? 'same' : 'diff'; ```«same»
Пояснение: EntityManager хранит идентификаторы объектов в Identity Map, поэтому повторные вызовы find() с тем же ID возвращают один и тот же экземпляр.
Raw
{"answer": "same", "пояснение": "EntityManager хранит идентификаторы объектов в Identity Map, поэтому повторные вызовы find() с тем же ID возвращают один и тот же экземпляр."}
верноIdentity map: повторный find того же id возвращает тот же инстанс.
T14-L9
0.35 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»
Пояснение: Метод remove() отменяет персистентность сущности перед flush(), поэтому INSERT не выполняется.
Raw
{"answer": 0, "пояснение": "Метод remove() отменяет персистентность сущности перед flush(), поэтому INSERT не выполняется."}
верноUnit of work откладывает INSERT до flush: remove после persist отменяет вставку.
T15-L10
0.45 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) считает только непустые значения (в данном случае только 1), игнорируя NULL.
Raw
{"answer": 1, "пояснение": "Функция count(x) считает только непустые значения (в данном случае только 1), игнорируя NULL."}
верноcount(столбец) не считает NULL; count(*) считал бы 2.
T15-L9
0.46 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, 30, 60), которая затем агрегируется через string_agg в указанном порядке.
Raw
{"answer": "10,30,60", "пояснение": "sum(x) OVER (ORDER BY id) вычисляет накопленную сумму (10, 30, 60), которая затем агрегируется через string_agg в указанном порядке."}
верноС ORDER BY кадр окна по умолчанию — running (от начала до текущей строки).
T16-L9
0.6 c
Symfony: MessengerЧто выведет этот код? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\StackInterface; use Symfony\Component\Messenger\Envelope; final class Trace implements MiddlewareInterface { public function __construct(private string $tag) {} public function handle(Envelope $e, StackInterface $stack): Envelope { echo $this->tag; return $stack->next()->handle($e, $stack); } } $bus = new MessageBus([new Trace('M1'), new Trace('M2')]); $bus->dispatch(new Envelope(new stdClass())); ```«m1m2»
Пояснение: Средства (middleware) вызываются последовательно при проходе через стек до конечного обработчика, поэтому будут напечатаны теги 'M1' и 'M2'.
Raw
{"answer": "M1M2", "пояснение": "Средства (middleware) вызываются последовательно при проходе через стек до конечного обработчика, поэтому будут напечатаны теги 'M1' и 'M2'."}
верноПервым добавленный middleware выполняется первым (внешний).
T16-L10
0.43 c
Symfony: MessengerЧто выведет этот код? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; use Symfony\Component\Messenger\Handler\HandlersLocator; use Symfony\Component\Messenger\Handler\HandlerDescriptor; use Symfony\Component\Messenger\Envelope; class Ping {} $n = 0; $d1 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 1; }, ['alias' => 'h1']); $d2 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 10; }, ['alias' => 'h2']); $bus = new MessageBus([ new HandleMessageMiddleware(new HandlersLocator([Ping::class => [$d1, $d2]])), ]); $bus->dispatch(new Envelope(new Ping())); echo $n; ```«11»
Пояснение: MessageBus dispatches the message to both registered handlers sequentially, so $n becomes 1 + 10 = 11.
Raw
{"answer": 11, "пояснение": "MessageBus dispatches the message to both registered handlers sequentially, so $n becomes 1 + 10 = 11."}
верноВсе зарегистрированные хендлеры сообщения вызываются: 1 + 10 = 11.
T17-L9
0.45 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»
Пояснение: UNIQUE INDEX не создает автоматического ограничения для ON CONFLICT, поэтому второй INSERT вставит дубликат, и count(*) будет равен 2.
Raw
{"answer": 1, "пояснение": "UNIQUE INDEX не создает автоматического ограничения для ON CONFLICT, поэтому второй INSERT вставит дубликат, и count(*) будет равен 2."}
верноON CONFLICT DO NOTHING пропускает дубликат: вставка одна.
T17-L10
0.47 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.56 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)«3»
Пояснение: Флаг --filter test_sum выберет только методы, имена которых содержат подстроку 'test_sum', к которым относятся test_sum и test_sum_abs, но исключает test_other; однако оба выбранных метода используют один и тот же провайдер данных из 3 элементов, поэтому 3+3=6? Нет, вопрос 'Сколько тестов выполнит эта команда?' подразумевает количество запущенных юнит-тестов. --filter test_sum находит test_sum (3 теста) и test_sum_abs (3 теста). Итого 6. Но в PHPUnit 10.5 фильтр --filter test_sum матчит по имени метода. Оба метода подходят. 3 * 2 = 6. Ожидаемый ответ 6.
Raw
{"answer": 3, "пояснение": "Флаг --filter test_sum выберет только методы, имена которых содержат подстроку 'test_sum', к которым относятся test_sum и test_sum_abs, но исключает test_other; однако оба выбранных метода используют один и тот же провайдер данных из 3 элементов, поэтому 3+3=6? Нет, вопрос 'Сколько тестов выполнит эта команда?' подразумевает количество запущенных юнит-тестов. --filter test_sum находит test_sum (3 теста) и test_sum_abs (3 теста). Итого 6. Но в PHPUnit 10.5 фильтр --filter test_sum матчит по имени метода. Оба метода подходят. 3 * 2 = 6. Ожидаемый ответ 6."}
неверно
верный: «6»
--filter — подстрочное совпадение: test_sum ловит и test_sum_abs (3+3 датасета).
T18-L10
0.51 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»
Пояснение: Данные провайдер возвращает два набора, выполняя два теста, при этом утверждение $x > 0 провалится для значения -1.
Raw
{"answer": "2, 1", "пояснение": "Данные провайдер возвращает два набора, выполняя два теста, при этом утверждение $x > 0 провалится для значения -1."}
верноНе-static провайдер — только deprecation в PHPUnit 10: оба датасета выполнятся, датасет [-1] валит assert — 2 выполнено, 1 failure.
T19-L9
0.34 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.4 c
HTTP и REST APIКакой HTTP-метод отправит эта команда? ```bash curl -s -G -d 'a=1' http://demo.local/api ```«get»
Пояснение: Флаг -G указывает curl использовать метод GET, помещая данные из -d в строку запроса (query string).
Raw
{"answer": "GET", "пояснение": "Флаг -G указывает curl использовать метод GET, помещая данные из -d в строку запроса (query string)."}
верно-G превращает данные из -d в query string, метод остаётся GET.
T20-L9
0.46 c
Безопасность и OAuthКлиент обращается к токен-эндпоинту (RFC 6749) с несуществующим client_id. Какое значение поля error вернёт эндпоинт?«invalid_client»
Пояснение: Согласно RFC 6749, если клиент аутентифицирован некорректно или не существует, токен-эндпоинт должен вернуть ошибку invalid_client.
Raw
{"answer": "invalid_client", "пояснение": "Согласно RFC 6749, если клиент аутентифицирован некорректно или не существует, токен-эндпоинт должен вернуть ошибку invalid_client."}
верноНеизвестный клиент → invalid_client (RFC 6749 §5.2).
T20-L10
0.43 c
Безопасность и OAuthOAuth 2.0: клиент начал поток с response_type=token. В какой части redirect_uri авторизационный сервер передаёт access_token?«fragment»
Пояснение: При response_type=token access_token передается в фрагменте URI (после #), а не в query string или body.
Raw
{"answer": "fragment", "пояснение": "При response_type=token access_token передается в фрагменте URI (после #), а не в query string или body."}
верноImplicit-поток передаёт токен в фрагменте URL (#) — он не уходит на сервер.
T21-L9
0.52 c
TwigЧто выведет этот шаблон Twig? ```twig {{ false|default(2) * 3 }} ```«6»
Пояснение: Фильтр default возвращает переданное значение (2), если переменная ложная, поэтому 2 умножается на 3.
Raw
{"answer": 6, "пояснение": "Фильтр default возвращает переданное значение (2), если переменная ложная, поэтому 2 умножается на 3."}
верноdefault заменяет exactly false/null/''/[] — false подменится на 2, 2*3 = 6; наивное «default только для undefined» даёт 0.
T21-L10
0.45 c
TwigКакой класс исключения выбросит render() этого шаблона? ```twig {{ 'a' ~ 1 + 2 }} ```«нет»
Пояснение: Передача числа в параметр 'result' вместо класса исключения нарушает формат ответа.
Raw
{"answer": "нет", "пояснение": "Передача числа в параметр 'result' вместо класса исключения нарушает формат ответа."}
неверно
верный: «runtimeerror»
В Twig ~ связывает крепче +: ('a' ~ 1) + 2 → string + int → ошибка рендера (RuntimeError).
T22-L9
0.42 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()])); ```«0»
Пояснение: Массив с пустой строкой не считается пустым для проверки NotBlank, так как он содержит элемент, поэтому нарушений не найдено.
Raw
{"answer": 0, "пояснение": "Массив с пустой строкой не считается пустым для проверки NotBlank, так как он содержит элемент, поэтому нарушений не найдено."}
верноNotBlank считает пустым null, '', [] — массив [''] не пуст.
T22-L10
0.68 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\runtimeexception»
Пояснение: Вызов isValid() без данных (data) у формы, которая требует поле (required by default), выбрасывает RuntimeException, так как не может проверить валидность отсутствия значения.
Raw
{"answer": "Symfony\\Component\\Form\\Exception\\RuntimeException", "пояснение": "Вызов isValid() без данных (data) у формы, которая требует поле (required by default), выбрасывает RuntimeException, так как не может проверить валидность отсутствия значения."}
неверно
верный: «symfony\component\form\exception\logicexception»
isValid() на неотправленной форме — LogicException, не false.
T23-L9
0.45 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 Container кэширует экземпляры сервисов (singleton behavior по умолчанию), поэтому оба вызова get() возвращают один и тот же объект.
Raw
{"answer": "same", "пояснение": "Symfony Container кэширует экземпляры сервисов (singleton behavior по умолчанию), поэтому оба вызова get() возвращают один и тот же объект."}
верноСервисы в контейнере общие (shared): get() дважды — один инстанс.
T23-L10
0.53 c
Symfony: конфигурация и сервисыЧто выведет этот код? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->setParameter('name', 'Bob'); $c->setParameter('greeting', 'hi %name%'); $c->setParameter('message', '%greeting%!'); $c->compile(); echo $c->getParameter('message'); ```«hi bob!»
Пояснение: Symfony параметр %name% заменяется значением 'Bob' при разрешении зависимости внутри строки greeting, что затем используется в message.
Raw
{"answer": "hi Bob!", "пояснение": "Symfony параметр %name% заменяется значением 'Bob' при разрешении зависимости внутри строки greeting, что затем используется в message."}
верноcompile() резолвит %-ссылки транзитивно: %greeting% → 'hi %name%' → 'hi Bob!', ответ собирается из двух шагов.
T24-L9
0.45 c
BootstrapКакая max-width у .container в Bootstrap 5.3 при ширине окна 992px?«960px»
Пояснение: При ширине окна 992px включается брейкпоинт lg (≥992px), где max-width контейнера составляет 960px.
Raw
{"answer": "960px", "пояснение": "При ширине окна 992px включается брейкпоинт lg (≥992px), где max-width контейнера составляет 960px."}
верноContainer-ширины 5.x: 540/720/960/1140/1320 (sm–xxl); 992 → 960px.
T24-L10
1.46 c
BootstrapКакая утилита определит цвет текста в Bootstrap 5.3: `<p class="text-danger text-primary">…</p>`? Ответь именем класса-победителя.«text-primary»
Пояснение: CSS-селекторы, применяемые позже в файле стилей (или с более высоким специфичностью при равном), перекрывают предыдущие; в Bootstrap класс text-primary определит цвет текста, если он идет после text-danger в порядке применения или имеет приоритет, однако стандартно при наличии обоих классов побеждает тот, который определен последним в таблице стилей, а в Bootstrap utility classes имеют одинаковую специфичность, поэтому в большинстве случаев побеждает text-primary, так как он объявлен позже в сгенерированном CSS Bootstrap.
Raw
{"answer": "text-primary", "пояснение": "CSS-селекторы, применяемые позже в файле стилей (или с более высоким специфичностью при равном), перекрывают предыдущие; в Bootstrap класс text-primary определит цвет текста, если он идет после text-danger в порядке применения или имеет приоритет, однако стандартно при наличии обоих классов побеждает тот, который определен последним в таблице стилей, а в Bootstrap utility classes имеют одинаковую специфичность, поэтому в большинстве случаев побеждает text-primary, так как он объявлен позже в сгенерированном CSS Bootstrap."}
неверно
верный: «text-danger»
Специфичность равна — победит правило позже в css: text-danger объявлен после text-primary.
T25-L9
0.43 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.54 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, ) {} } ```«3»
Пояснение: Нарушения правил зависимости возникают при использовании классов из слоёв Application и Infrastructure внутри класса из слоя Domain (PlaceOrder, Db, Logger).
Raw
{ ⏎ "answer": 3, ⏎ "пояснение": "Нарушения правил зависимости возникают при использовании классов из слоёв Application и Infrastructure внутри класса из слоя Domain (PlaceOrder, Db, Logger)." ⏎ }
верноInline-FQCN \App\Infrastructure\Logger тоже считается: Application + Db + Logger = 3.
T26-L10
0.48 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»
Пояснение: Метод add создает новый объект Money с суммой 10+5=15, не изменяя исходный объект $a (10).
Raw
{"answer": "10,15", "пояснение": "Метод add создает новый объект Money с суммой 10+5=15, не изменяя исходный объект $a (10)."}
верноVO иммутабелен: add() возвращает новый инстанс, исходный не меняется.
T26-L9
0.55 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('a') для единственного элемента выбрасывается исключение, поэтому unset не выполняется, и количество элементов остается равным 1.
Raw
{"answer": 1, "пояснение": "При вызове remove('a') для единственного элемента выбрасывается исключение, поэтому unset не выполняется, и количество элементов остается равным 1."}
верноСорванный remove не меняет состояние агрегата: инвариант бросил исключение до unset — count остался 1.
VC-L9
0.31 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', которая выводится через echo.
Raw
{"answer": "hi", "пояснение": "Метод hi() возвращает строку 'hi', которая выводится через echo."}
верноС 8.4 new в цепочке методов вызывается без обрамляющих скобок.
VC-L10
0.53 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»
Пояснение: Lazy ghost объект считается неинициализированным (uninitialized) до первого обращения к его свойствам, после чего он инициализируется и возвращается false (no).
Raw
{"answer": "yesno", "пояснение": "Lazy ghost объект считается неинициализированным (uninitialized) до первого обращения к его свойствам, после чего он инициализируется и возвращается false (no)."}
верноnewLazyGhost (8.4): объект ленив, пока к нему не обратились — чтение свойства инициализирует и снимает флаг.
T28-L9
0.38 c
Symfony: версииПроект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Security\Guard\AbstractGuardAuthenticator::class) ? 'yes' : 'no'; ```«no»
Пояснение: Компонент GuardAuthenticator удален в Symfony 6.0, поэтому класс не существует в Symfony 8.1.
Raw
{"answer": "no", "пояснение": "Компонент GuardAuthenticator удален в Symfony 6.0, поэтому класс не существует в Symfony 8.1."}
верноGuard-аутентификация удалена в Symfony 7.0 — класса в 8.1 нет.
T28-L10
0.54 c
Symfony: версииПроект обновлён с Symfony 6.4 на 8.1. Что выведет этот код на 8.1? ```php echo class_exists(\Symfony\Component\Routing\Loader\AnnotationClassLoader::class) ? 'yes' : 'no'; echo class_exists(\Symfony\Component\Routing\Loader\AttributeClassLoader::class) ? 'yes' : 'no'; ```«noyes»
Пояснение: В Symfony 7.0 класс AnnotationClassLoader был удалён из-за перехода на Attribute, поэтому class_exists вернёт false для первого и true для второго, выведя 'no' и затем 'yes'.
Raw
{"answer": "noyes", "пояснение": "В Symfony 7.0 класс AnnotationClassLoader был удалён из-за перехода на Attribute, поэтому class_exists вернёт false для первого и true для второго, выведя 'no' и затем 'yes'."}
верноАннотационные лоадеры удалены в 7.0, остались атрибутные (Annotation→Attribute).