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

Оценка: PHP 92.7% · PHP+версии 85.7% · Symfony 81.2% · Symfony+версии 77.1% · БД и ORM 83.3% · Архитектура 81.2% · Фронтенд 87.5% · HTTP 100.0% · Безопасность 100.0% · Тесты 87.5% · Глубина 73.2% · Всего 84.6%
Разобрано JSON: 99.0% (293 из 296)
По зонам: База 88.9% · PHP 8.4–8.5 56.2% · Будущее 56.2% · Глубина 73.2%
Точность: 203 / 240 (+ глубина 41 / 56)
Разобрано ответов: 296 / 240 (не по JSON-формату: 3 · без вердикта: -56)
Ответов «да»: 50.3% (баланс вопросника 50/50, базлайн константного ответа — 50%)
Время: 1.9 мин (0.34 c на клетку — медиана)
Цена: $0.014
Токены: 40560 вх / 12135 вых (кэш: 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 · 语法与运算符
如果左侧操作数为假,?: 运算符(Elvis 运算符)返回左侧操作数。
Модель: «否»
Верный ответ: 否
T01-L6 · 语法与运算符
在 PHP 8 中,连接运算符(.)的优先级低于加法和减法。
Модель: «否»
Верный ответ: 是
T01-L7 · 语法与运算符
表达式 2 ** 3 ** 2 在 PHP 中按 (2 ** 3) ** 2 计算,即等于 64。
Модель: «否»
Верный ответ: 否
T01-L8 · 语法与运算符
下面代码输出什么字符串:echo '总和: ' . 2 + 3;(PHP 8)?
Модель: «总和: 23»
Верный ответ: 总和: 5
T01-L9 · 语法与运算符
这段代码会输出什么? ```php echo intdiv(7, 2) . intdiv(-7, 2); ```
Модель: «{"answer": 3-4, "解释": "intdiv(7,2) 为 3,intdiv(-7,2) 为 -4,拼接得到 '3-4'"}»
Верный ответ: 3-3
T01-L10 · 语法与运算符
这段代码会输出什么? ```php echo -3 ** 2; ```
Модель: «9»
Верный ответ: -9
6/10
类型与比较
T02-L1 · 类型与比较
在严格比较(===)下,数组被视为相等,与元素顺序无关。
Модель: «否»
Верный ответ: 否
T02-L2 · 类型与比较
表达式 0 == false 返回 false,因为这是严格比较。
Модель: «否»
Верный ответ: 否
T02-L3 · 类型与比较
在 PHP 8 中,表达式 "abc" == 0 的结果是 true。
Модель: «否»
Верный ответ: 否
T02-L4 · 类型与比较
在宽松比较下,null 同时等于 0、空字符串和 false。
Модель: «是»
Верный ответ: 是
T02-L5 · 类型与比较
表达式 (int) '42abc' 返回什么?
Модель: «42»
Верный ответ: 42
T02-L6 · 类型与比较
表达式 '5' + 5 返回什么?
Модель: «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 · 字符串
对 UTF-8 字符串,strlen('你好') 返回多少个字节(BYTES)?
Модель: «6»
Верный ответ: 6
T03-L6 · 字符串
表达式 substr('abcdef', -3) 返回什么?
Модель: «def»
Верный ответ: def
T03-L7 · 字符串
ucfirst() 会原地修改传入的字符串。
Модель: «否»
Верный ответ: 否
T03-L8 · 字符串
heredoc 支持变量插值,而 nowdoc 不支持。
Модель: «是»
Верный ответ: 是
T03-L9 · 字符串
这段代码会输出什么? ```php echo strtr('abc', ['a' => '1', 'ab' => '2']); ```
Модель: «c1»
Верный ответ: 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 · 数组
从 PHP 8.1 起,展开运算符 [...$a, ...$b] 支持带字符串键的数组。
Модель: «是»
Верный ответ: 是
T04-L9 · 数组
这段代码会输出什么? ```php $a = ['k' => 1, 'n' => 2]; $b = ['k' => 9, 'm' => 3]; echo implode(',', array_keys($a + $b)); ```
Модель: «k,n,m»
Верный ответ: k,n,m
T04-L10 · 数组
这段代码会输出什么? ```php $a = [[1, 'x', 2], [2, 'y', 1], [3, 'z', 2]]; usort($a, fn($p, $q) => $p[2] <=> $q[2]); echo implode('', array_column($a, 1)); ```
Модель: «xzy»
Верный ответ: yxz
7/10
函数与闭包
T05-L1 · 函数与闭包
在同一个调用中,命名参数不能与数组展开 ...$args 组合使用。
Модель: «是»
Верный ответ: 否
T05-L2 · 函数与闭包
不使用 use 的匿名函数能看到外部作用域的变量。
Модель: «否»
Верный ответ: 否
T05-L3 · 函数与闭包
调用 f(1, 2, 3) 时,function f($a) { return func_num_args(); } 内部的 func_num_args() 返回什么?
Модель: «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
9/10
OOP:类与继承
T06-L1 · OOP:类与继承
PHP 支持构造函数属性提升(promotion):public function __construct(private int $x) {}。
Модель: «是»
Верный ответ: 是
T06-L2 · OOP:类与继承
哪个关键字禁止在子类中重写方法?
Модель: «final»
Верный ответ: final
T06-L3 · OOP:类与继承
声明为 final 的方法不能在子类中重写。
Модель: «是»
Верный ответ: 是
T06-L4 · OOP:类与继承
父类中 private 可见性的属性在子类中可以访问。
Модель: «否»
Верный ответ: 否
T06-L5 · OOP:类与继承
get_class(new class {}) 返回什么?请回答 NUL 字节之前的部分(不含文件路径)。
Модель: «class@anonymous»
Верный ответ: class@anonymous
T06-L6 · OOP:类与继承
父类的 private 方法不属于继承契约:子类可以用任意可见性声明同名方法。
Модель: «是»
Верный ответ: 是
T06-L7 · OOP:类与继承
魔术方法 __get() 只会在访问不存在的属性时被调用。
Модель: «否»
Верный ответ: 否
T06-L8 · OOP:类与继承
对 readonly 属性重复赋值会抛出什么——Exception 还是 Error?
Модель: «error»
Верный ответ: error
T06-L9 · OOP:类与继承
这段代码会输出什么? ```php class A { public function who(): string { return static::class; } } class B extends A {} echo (new B)->who(); ```
Модель: «b»
Верный ответ: b
T06-L10 · OOP:类与继承
这段代码在 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
接口、trait 与 enum
T07-L1 · 接口、trait 与 enum
接口可以声明常量。
Модель: «是»
Верный ответ: 是
T07-L2 · 接口、trait 与 enum
哪个运算符用于检查对象是否为某个类或接口的实例?
Модель: «instanceof»
Верный ответ: instanceof
T07-L3 · 接口、trait 与 enum
接口可以声明静态方法。
Модель: «是»
Верный ответ: 是
T07-L4 · 接口、trait 与 enum
instanceof 运算符只检查类的继承:它不考虑接口。
Модель: «否»
Верный ответ: 否
T07-L5 · 接口、trait 与 enum
接口方法可以像 trait 方法一样带有默认实现。
Модель: «是»
Верный ответ: 否
T07-L6 · 接口、trait 与 enum
抽象类中抽象方法的可见性可以是 protected。
Модель: «是»
Верный ответ: 是
T07-L7 · 接口、trait 与 enum
对于 enum Foo { case A; case B; case C; },Foo::cases() 返回多少个元素?
Модель: «3»
Верный ответ: 3
T07-L8 · 接口、trait 与 enum
trait 可以声明常量。
Модель: «是»
Верный ответ: 是
T07-L9 · 接口、trait 与 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 · 接口、trait 与 enum
这段代码会输出什么? ```php trait Counter { public static int $n = 0; } class CX { use Counter; } class CY { use Counter; } CX::$n = 1; echo CY::$n; ```
Модель: «0»
Верный ответ: 0
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 · 异常与错误
只有当异常被 catch 块捕获时,finally 块才会执行。
Модель: «否»
Верный ответ: 否
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
10/10
命名空间与自动加载
T09-L1 · 命名空间与自动加载
use App\Service\Mailer; 这条语句本身就会加载包含该类的文件。
Модель: «否»
Верный ответ: 否
T09-L2 · 命名空间与自动加载
要导入函数(而不是类),use 后面写哪个词:function 还是 const?
Модель: «function»
Верный ответ: function
T09-L3 · 命名空间与自动加载
在 PSR-4 映射 «App\ → src/» 下,类 App\Controller\Api\UserController 会放进哪个文件(相对 src/ 的路径)?
Модель: «controller/api/usercontroller.php»
Верный ответ: src/controller/api/usercontroller.php
T09-L4 · 命名空间与自动加载
引入 vendor/autoload.php 会通过 spl_autoload_register() 注册自动加载器。
Модель: «是»
Верный ответ: 是
T09-L5 · 命名空间与自动加载
魔术常量 __NAMESPACE__ 包含当前命名空间的名称。
Модель: «是»
Верный ответ: 是
T09-L6 · 命名空间与自动加载
在 new 中,非限定类名(不带前导 \)会从全局根开始解析。
Модель: «否»
Верный ответ: 否
T09-L7 · 命名空间与自动加载
在 PSR-4 映射 «App\ → src/» 下,类 App\Model\User 位于文件 src/Model/User.php。
Модель: «是»
Верный ответ: 是
T09-L8 · 命名空间与自动加载
use 语句可以写在函数体内——该导入只对这个函数生效。
Модель: «否»
Верный ответ: 否
T09-L9 · 命名空间与自动加载
这段代码会输出什么? ```php namespace N; use App\Foo as Baz; echo Baz::class . '|' . \Baz::class; ```
Модель: «app\foo|n\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
9/10
引用与作用域
T10-L1 · 引用与作用域
数组在赋值时是复制,而不是按引用传递。
Модель: «是»
Верный ответ: 是
T10-L2 · 引用与作用域
下面代码输出什么:$a = [1, 2]; $b = $a; $b[] = 3; echo count($a);
Модель: «2»
Верный ответ: 2
T10-L3 · 引用与作用域
在函数内部,不通过 global、$GLOBALS 或参数传递,就无法访问全局作用域的用户变量。
Модель: «否»
Верный ответ: 是
T10-L4 · 引用与作用域
在函数内 unset($GLOBALS['x']) 只对该函数删除这个全局变量。
Модель: «否»
Верный ответ: 否
T10-L5 · 引用与作用域
下面代码输出什么:function inc(&$x) { $x++; } $n = 5; inc($n); echo $n;
Модель: «6»
Верный ответ: 6
T10-L6 · 引用与作用域
按值遍历数组的 foreach 操作的是“活”数组:循环内对数组的修改在同一个遍历过程中可见。
Модель: «否»
Верный ответ: 否
T10-L7 · 引用与作用域
静态属性在每个实例中各自独立:一个对象中的修改对其他对象不可见。
Модель: «否»
Верный ответ: 否
T10-L8 · 引用与作用域
数组可以用布尔值 true 作为键,并且它会以 bool 类型保存。
Модель: «否»
Верный ответ: 否
T10-L9 · 引用与作用域
这段代码会输出什么? ```php $a = [1, 2, 3]; foreach ($a as &$v) {} $v = 99; echo implode(',', $a); ```
Модель: «1,2,99»
Верный ответ: 1,2,99
T10-L10 · 引用与作用域
这段代码会输出什么? ```php class A { public function inc(): int { static $n = 0; return ++$n; } } class B extends A {} $a = new A; $b = new B; $a->inc(); $b->inc(); echo $a->inc(); ```
Модель: «2»
Верный ответ: 3
8/10
生成器、迭代器与 SPL
T11-L1 · 生成器、迭代器与 SPL
生成器内部可以使用带值的 return,该值可以通过 $gen->getReturn() 取到。
Модель: «是»
Верный ответ: 是
T11-L2 · 生成器、迭代器与 SPL
已经遍历完的生成器可以通过 rewind() 倒回并重新遍历。
Модель: «否»
Верный ответ: 否
T11-L3 · 生成器、迭代器与 SPL
yield from 语法会把遍历委托给另一个生成器或可迭代对象。
Модель: «是»
Верный ответ: 是
T11-L4 · 生成器、迭代器与 SPL
对于 function g() { yield 1; },get_class(g()) 返回什么?
Модель: «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() 会自动生成盐(salt)——不需要单独传盐。
Модель: «是»
Верный ответ: 是
T12-L2 · 配置与安全
在 PHP 8 中,PASSWORD_DEFAULT 算法是自动加盐的 md5。
Модель: «否»
Верный ответ: 否
T12-L3 · 配置与安全
password_verify('secret', password_hash('secret', PASSWORD_DEFAULT)) 返回什么?
Модель: «是»
Верный ответ: true
T12-L4 · 配置与安全
strip_tags() 函数能防 SQL 注入。
Модель: «否»
Верный ответ: 否
T12-L5 · 配置与安全
session_regenerate_id() 函数用于在用户登录时防范会话固定(session fixation)。
Модель: «是»
Верный ответ: 是
T12-L6 · 配置与安全
哪个内置函数返回 SAPI 的名称(例如 cli)?
Модель: «php_sapi_name»
Верный ответ: php_sapi_name
T12-L7 · 配置与安全
session_destroy() 删除服务器端的会话数据,但不会删除用户浏览器中的 cookie。
Модель: «是»
Верный ответ: 是
T12-L8 · 配置与安全
不调用 session_start(),$_SESSION 数组也会自动加载会话数据。
Модель: «否»
Верный ответ: 否
T12-L9 · 配置与安全
这段代码会输出什么? ```php $hash = password_hash('x', PASSWORD_BCRYPT, ['cost' => 4]); echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 4]) ? 'yes' : 'no'; echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 5]) ? 'yes' : 'no'; ```
Модель: «nono»
Верный ответ: noyes
T12-L10 · 配置与安全
这段代码在 PHP 8.5 上会输出什么? ```php echo (E_ALL & 2048) === 0 ? 'strict-out' : 'strict-in'; ```
Модель: «strict-in»
Верный ответ: strict-out
8/10
PHP 8.4–8.5
VC-L1 · PHP 8.4–8.5
函数 array_find() 是在哪个 PHP 版本中引入的?
Модель: «8.0»
Верный ответ: 8.4
VC-L2 · PHP 8.4–8.5
属性钩子(property hooks,直接在属性声明里写 get/set)进入了 PHP 8.4。
Модель: «是»
Верный ответ: 是
VC-L3 · PHP 8.4–8.5
非对称可见性(public private(set) string $name)出现在 PHP 8.4。
Модель: «是»
Верный ответ: 是
VC-L4 · PHP 8.4–8.5
属性 #[\NoDiscard] 最早出现在哪个 PHP 版本?请回答版本号。
Модель: «8.2»
Верный ответ: 8.5
VC-L5 · PHP 8.4–8.5
管道运算符 |> 最早出现在哪个 PHP 版本?请回答版本号。
Модель: «8.1»
Верный ответ: 8.5
VC-L6 · PHP 8.4–8.5
clone-with 语法 clone($obj, ['x' => 1]) 是在哪个 PHP 版本中出现的?请回答版本号。
Модель: «8.4»
Верный ответ: 8.5
VC-L7 · PHP 8.4–8.5
函数 array_first() 和 array_last() 是在哪个 PHP 版本中引入的?
Модель: «php 8.4»
Верный ответ: 8.5
VC-L8 · PHP 8.4–8.5
截至 2026-11-07,RFC Partial Function Application v2 被接受进入哪个 PHP 版本?请回答版本号。
Модель: «php 8.4»
Верный ответ: 8.6
VC-L9 · PHP 8.4–8.5
这段代码在 PHP 8.5 上会输出什么? ```php class C { public function hi(): string { return 'hi'; } } echo new C()->hi(); ```
Модель: «hi»
Верный ответ: hi
VC-L10 · PHP 8.4–8.5
这段代码在 PHP 8.5 上会输出什么? ```php class Heavy { public int $v = 0; } $r = new ReflectionClass(Heavy::class); $o = $r->newLazyGhost(function (Heavy $obj) { $obj->v = 21; }); echo $r->isUninitializedLazyObject($o) ? 'yes' : 'no'; $o->v; echo $r->isUninitializedLazyObject($o) ? 'yes' : 'no'; ```
Модель: «nono»
Верный ответ: yesno
3/10
PHP:8.6+ 与未来
VF-L1 · PHP:8.6+ 与未来
截至 2026-11-07,RFC clamp_v2(函数 clamp())在哪个 PHP 版本中实现?请回答版本号。
Модель: «8.4»
Верный ответ: 8.6
VF-L2 · PHP:8.6+ 与未来
截至 2026-11-07,RFC Context Managers v2 已被 PHP 接受。
Модель: «否»
Верный ответ: 否
VF-L3 · PHP:8.6+ 与未来
RFC Bound-Erased Generic Types(泛型)已于 2026 年被拒绝。
Модель: «是»
Верный ответ: 是
VF-L4 · PHP:8.6+ 与未来
截至 2026-11-07,默认启用多线程(ZTS)的 RFC 已在 PHP 中被接受。
Модель: «是»
Верный ответ: 否
VF-L5 · PHP:8.6+ 与未来
PHP 8.5 仍然没有泛型(参数化类型)。
Модель: «是»
Верный ответ: 是
VF-L6 · PHP:8.6+ 与未来
截至 2026-11-07,PHP 的最新稳定版本是 8.5,PHP 8.6 尚未发布(GA 为 2026-11-19)。
Модель: «否»
Верный ответ: 是
VF-L7 · PHP:8.6+ 与未来
PHP 6 分支从未发布:PHP 5.6 之后直接就是 PHP 7.0。
Модель: «是»
Верный ответ: 是
VF-L8 · PHP:8.6+ 与未来
向核心添加 #[\Deprecated] 属性的 RFC 已被接受。
Модель: «是»
Верный ответ: 是
5/8
整洁架构
T25-L1 · 整洁架构
整洁架构与洋葱架构的依赖规则:内层对外层一无所知——依赖指向中心。
Модель: «是»
Верный ответ: 是
T25-L2 · 整洁架构
领域实体既不导入 Doctrine 也不导入 Symfony——只用语言本身(最多加标准库)。
Модель: «是»
Верный ответ: 是
T25-L3 · 整洁架构
控制器和 Twig 模板属于业务逻辑层,因为是它们调用用例。
Модель: «否»
Верный ответ: 否
T25-L4 · 整洁架构
洋葱架构的最中心是什么?
Модель: «实体»
Верный ответ: domain model
T25-L5 · 整洁架构
层边界的破坏可以自动捕获:层间依赖分析器(如 deptrac)会在出现禁止的调用时报错。
Модель: «是»
Верный ответ: 是
T25-L6 · 整洁架构
用例(interactor)可以接受 HTTP 请求或 EntityManager 作为参数——这样更简单。
Модель: «否»
Верный ответ: 否
T25-L7 · 整洁架构
在接口背后隐藏存储机制、并提供聚合/实体集合的组件叫什么?
Модель: «仓储(repository)»
Верный ответ: repository
T25-L8 · 整洁架构
在整洁架构中,把 PostgreSQL 换成其他数据库只会影响外层——领域和用例保持不变。
Модель: «是»
Верный ответ: 是
T25-L9 · 整洁架构
层:Domain、Application、Infrastructure。deptrac 规则:Application → Domain;Infrastructure → Domain、Application;Domain → 仅 Domain。 对于这个类,deptrac 会报告多少个违规(Violations)? ```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。 对于这个类,deptrac 会报告多少个违规(Violations)? ```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 中,聚合(aggregate)只是数据库表的另一个名字。
Модель: «否»
Верный ответ: 否
T26-L2 · DDD
值对象(Value Object)不可变,按字段值比较,而不是按标识符。
Модель: «是»
Верный ответ: 是
T26-L3 · DDD
聚合的唯一外部入口——所有变更必须经过它——叫什么?
Модель: «command handler»
Верный ответ: aggregate root
T26-L4 · DDD
在 DDD 中,仓储是针对聚合(其根)声明的,而不是针对每个实体。
Модель: «是»
Верный ответ: 是
T26-L5 · DDD
统一语言(ubiquitous language)是开发者和领域专家共享的模型语言。
Модель: «是»
Верный ответ: 是
T26-L6 · DDD
哪种边界内部模型和语言一致,而边界外同样的词对应别的模型?
Модель: «词»
Верный ответ: bounded context
T26-L7 · DDD
贫血模型(只有 getter/setter,逻辑全在服务里)是 DDD 推荐的风格。
Модель: «否»
Верный ответ: 否
T26-L8 · DDD
限界上下文意味着每个上下文都有自己的模型:同一个概念在不同上下文中是不同的类。
Модель: «是»
Верный ответ: 是
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
Symfony 的 DI 容器中的服务默认是惰性创建的——在首次使用时才实例化。
Модель: «否»
Верный ответ: 是
T13-L2 · Symfony
Symfony 的哪条控制台命令会列出所有已注册的路由?
Модель: «bin/console debug:router»
Верный ответ: debug:router
T13-L3 · Symfony
Symfony 的自动装配(autowiring)需要在 services.yaml 中手动声明每一个服务。
Модель: «否»
Верный ответ: 否
T13-L4 · Symfony
Twig 模板会编译成 PHP 类并在请求之间缓存。
Модель: «是»
Верный ответ: 是
T13-L5 · Symfony
在 Symfony 的 dev 环境中,DI 容器只在被跟踪的文件变化后重建,而不是每个请求都重建。
Модель: «否»
Верный ответ: 是
T13-L6 · Symfony
哪个环境变量决定 Symfony 的活动环境(dev/prod)?
Модель: «app_env»
Верный ответ: app_env
T13-L7 · Symfony
控制器方法可以是 private——Symfony 的路由对类中的任何方法都有效。
Модель: «否»
Верный ответ: 否
T13-L8 · Symfony
事件订阅者(EventSubscriber)总是比监听器(listener)更早收到事件,因为接口赋予它们优先级。
Модель: «否»
Верный ответ: 否
T13-L9 · Symfony
这段代码会输出什么? ```php use Symfony\Component\HttpFoundation\Request; $r = Request::create('/demo', 'GET', [], [], [], ['HTTP_X_TOKEN' => 'abc']); echo $r->headers->get('X-Token') === 'abc' ? 'mapped' : 'missing'; ```
Модель: «mapped»
Верный ответ: mapped
T13-L10 · Symfony
这段代码会输出什么? ```php use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Contracts\EventDispatcher\Event; $d = new EventDispatcher(); $out = ''; $d->addListener('e', function () use (&$out) { $out .= 'B'; }, 10); $d->addListener('e', function () use (&$out) { $out .= 'A'; }); $d->addListener('e', function () use (&$out) { $out .= 'C'; }, 5); $d->dispatch(new Event(), 'e'); echo $out; ```
Модель: «abc»
Верный ответ: bca
7/10
Symfony:安全与表单
T22-L1 · Symfony:安全与表单
在现代 Symfony(6.0+)中,认证基于 authenticator 类(AuthenticatorInterface);旧的 guard 体系已被移除。
Модель: «是»
Верный ответ: 是
T22-L2 · Symfony:安全与表单
Symfony 的哪个属性直接在控制器方法上检查角色/权限(没有它就返回 403)?
Модель: «isgranted»
Верный ответ: isgranted
T22-L3 · Symfony:安全与表单
Voter(投票者)是 Symfony 检查对具体对象访问权的机制:isGranted('EDIT', $post)。
Модель: «是»
Верный ответ: 是
T22-L4 · Symfony:安全与表单
在现代 Symfony(7+)中,验证约束用 PHP 属性声明(#[Assert\NotBlank]);不再支持 doctrine 注解。
Модель: «是»
Верный ответ: 是
T22-L5 · Symfony:安全与表单
Symfony 表单的 CSRF 保护默认开启:表单在提交时会校验令牌。
Модель: «是»
Верный ответ: 是
T22-L6 · Symfony:安全与表单
Symfony 的表单验证在服务器端执行,即使客户端(HTML5)检查已经通过。
Модель: «是»
Верный ответ: 是
T22-L7 · Symfony:安全与表单
Symfony maker 的哪条命令会生成表单类(FormType)?
Модель: «make:form»
Верный ответ: make:form
T22-L8 · Symfony:安全与表单
Symfony 以明文形式把用户密码存在会话中。
Модель: «否»
Верный ответ: 否
T22-L9 · Symfony:安全与表单
这段代码会输出什么? ```php use Symfony\Component\Validator\Validation; use Symfony\Component\Validator\Constraints as Assert; $v = Validation::createValidator(); echo count($v->validate([''], [new Assert\NotBlank()])); ```
Модель: «1»
Верный ответ: 0
T22-L10 · Symfony:安全与表单
这段代码会输出什么? ```php use Symfony\Component\Form\Forms; use Symfony\Component\Form\Extension\Core\Type\TextType; $factory = Forms::createFormFactoryBuilder()->getFormFactory(); $form = $factory->create(TextType::class); try { echo $form->isValid() ? 'valid' : 'invalid'; } catch (Throwable $e) { echo get_class($e); } ```
Модель: «valid»
Верный ответ: symfony\component\form\exception\logicexception
8/10
Symfony:配置与服务
T23-L1 · Symfony:配置与服务
Symfony 的 bundle 配置放在 config/packages 中——每个 bundle 或主题一个文件。
Модель: «是»
Верный ответ: 是
T23-L2 · Symfony:配置与服务
包含开发默认值的 .env 文件会提交到仓库,而真正的机密放在不提交的 .env.local 中。
Модель: «是»
Верный ответ: 是
T23-L3 · Symfony:配置与服务
Symfony 的哪条命令会列出容器中注册的服务及其别名?
Модель: «debug:container»
Верный ответ: debug:container
T23-L4 · Symfony:配置与服务
Symfony 容器允许在运行时修改参数:$container->setParameter() 可以在控制器中使用。
Модель: «是»
Верный ответ: 否
T23-L5 · Symfony:配置与服务
默认情况下,Symfony 的服务是公开的(public: true)——可以直接从容器中获取。
Модель: «否»
Верный ответ: 否
T23-L6 · Symfony:配置与服务
如果 config/packages 里没有配置文件,bundle 就无法工作——每个 bundle 都必须有配置。
Модель: «否»
Верный ответ: 否
T23-L7 · Symfony:配置与服务
环境变量的值可以通过 %env(VAR)% 语法注入 services.yaml。
Модель: «是»
Верный ответ: 是
T23-L8 · Symfony:配置与服务
Symfony 的哪个环境变量会开启调试模式(影响 profiler 和 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'); ```
Модель: «{"answer": "hi bob!", "解释": "symfony 参数替换支持嵌套引用,%greeting% 展开为 'hi %name%',再替换 %name% 为 'bob',最后加上 '!' 得到 'hi bob!»
Верный ответ: hi bob!
9/10
Symfony:Messenger
T16-L1 · Symfony:Messenger
在 Symfony Messenger 中,一条消息只能有一个处理者(handler)。
Модель: «否»
Верный ответ: 否
T16-L2 · Symfony:Messenger
Messenger 的 sync 传输会把消息放进队列交给 worker 处理,和 async 一样。
Модель: «是»
Верный ответ: 否
T16-L3 · Symfony:Messenger
哪条控制台命令会启动处理 Messenger 队列消息的 worker?
Модель: «bin/console messenger:consume»
Верный ответ: messenger:consume
T16-L4 · Symfony:Messenger
失败消息的重试策略(retry_strategy)在 Messenger 传输层面配置。
Модель: «否»
Верный ответ: 是
T16-L5 · Symfony:Messenger
默认情况下,Messenger 会把消息序列化为 JSON。
Модель: «是»
Верный ответ: 否
T16-L6 · Symfony:Messenger
Symfony Scheduler 按计划产生消息,并通过 Messenger 发送。
Модель: «是»
Верный ответ: 是
T16-L7 · Symfony:Messenger
哪个内置的 Messenger 传输通过 Doctrine 把消息存到数据库表中?
Модель: «doctrine»
Верный ответ: doctrine
T16-L8 · Symfony:Messenger
Messenger 的管道可以用自定义 middleware 扩展,放在内置中间件之前或之后。
Модель: «是»
Верный ответ: 是
T16-L9 · Symfony:Messenger
这段代码会输出什么? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\StackInterface; use Symfony\Component\Messenger\Envelope; final class Trace implements MiddlewareInterface { public function __construct(private string $tag) {} public function handle(Envelope $e, StackInterface $stack): Envelope { echo $this->tag; return $stack->next()->handle($e, $stack); } } $bus = new MessageBus([new Trace('M1'), new Trace('M2')]); $bus->dispatch(new Envelope(new stdClass())); ```
Модель: «m1m2»
Верный ответ: m1m2
T16-L10 · Symfony:Messenger
这段代码会输出什么? ```php use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; use Symfony\Component\Messenger\Handler\HandlersLocator; use Symfony\Component\Messenger\Handler\HandlerDescriptor; use Symfony\Component\Messenger\Envelope; class Ping {} $n = 0; $d1 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 1; }, ['alias' => 'h1']); $d2 = new HandlerDescriptor(function (Ping $m) use (&$n) { $n += 10; }, ['alias' => 'h2']); $bus = new MessageBus([ new HandleMessageMiddleware(new HandlersLocator([Ping::class => [$d1, $d2]])), ]); $bus->dispatch(new Envelope(new Ping())); echo $n; ```
Модель: «11»
Верный ответ: 11
7/10
Symfony:版本
T28-L1 · Symfony:版本
Symfony 的主版本每两年发布一次,次版本每六个月一次(5 月和 11 月)。
Модель: «是»
Верный ответ: 是
T28-L2 · Symfony:版本
Symfony 8 要求的最低 PHP 版本是多少?
Модель: «8.2»
Верный ответ: 8.4
T28-L3 · Symfony:版本
Symfony 7.0 保留了对文档块注解(验证、路由)的支持。
Модель: «否»
Верный ответ: 否
T28-L4 · Symfony:版本
AssetMapper 无需 node 和 webpack 即可管理 CSS/JS——通过 importmap.php。
Модель: «是»
Верный ответ: 是
T28-L5 · Symfony:版本
Symfony 6.4 是没有长期支持的普通版本。
Модель: «否»
Верный ответ: 否
T28-L6 · Symfony:版本
升级到新的 Symfony 主版本时,上一分支的弃用功能仍然可用——主版本不会移除它们。
Модель: «否»
Верный ответ: 否
T28-L7 · Symfony:版本
Symfony 的每个主版本都附带列出变更的 UPGRADE 指南。
Модель: «是»
Верный ответ: 是
T28-L8 · Symfony:版本
Symfony 的哪个组件在没有 node/webpack 的情况下管理资源和 importmap?
Модель: «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 与未来
截至 2026-11-07,Symfony 8.2 已经发布。
Модель: «否»
Верный ответ: 否
T29-L2 · Symfony:8.2 与未来
截至 2026-11-07,Symfony 8.2 计划于 2026 年 11 月发布,遵循通常的六个月周期。
Модель: «否»
Верный ответ: 是
T29-L3 · Symfony:8.2 与未来
在 8.1 之后(截至 2026-11-07)会发布哪个 Symfony 版本?
Модель: «否»
Верный ответ: 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 与未来
在 Symfony 9.0 之前,8.x 分支的最后一个次版本是什么?
Модель: «8.4»
Верный ответ: 8.4
T29-L7 · Symfony:8.2 与未来
Symfony 8.2 将要求 PHP 8.5——必须随之升级 PHP。
Модель: «否»
Верный ответ: 否
T29-L8 · Symfony:8.2 与未来
在 8.x 分支中添加的弃用功能,最早也要到 Symfony 9.0 才会移除。
Модель: «是»
Верный ответ: 是
4/8
Twig
T21-L1 · Twig
在 Twig 中,{{ }} 里面可以直接调用任意的 PHP 代码。
Модель: «否»
Верный ответ: 否
T21-L2 · Twig
默认情况下,Twig 会自动转义输出的变量。
Модель: «是»
Верный ответ: 是
T21-L3 · Twig
Twig 的 |e 过滤器会对字符串进行转义,以便在 HTML 上下文中安全输出。
Модель: «是»
Верный ответ: 是
T21-L4 · Twig
twig/intl-extra 中哪个过滤器按本地化设置格式化数字?
Модель: «number_format»
Верный ответ: format_number
T21-L5 · Twig
|raw 过滤器会对值关闭自动转义。
Модель: «是»
Верный ответ: 是
T21-L6 · Twig
在 Twig 中,{{ }} 输出表达式的值,而 {% %} 执行标签——条件、循环、set。
Модель: «是»
Верный ответ: 是
T21-L7 · Twig
Twig 模板中不能声明变量——值只能由控制器传入。
Модель: «否»
Верный ответ: 否
T21-L8 · Twig
Twig 的哪个函数会输出变量的调试结构(数组、对象)?
Модель: «dump»
Верный ответ: dump
T21-L9 · Twig
这个 Twig 模板会输出什么? ```twig {{ false|default(2) * 3 }} ```
Модель: «0»
Верный ответ: 6
T21-L10 · Twig
渲染这个模板时 render() 会抛出哪个异常类? ```twig {{ 'a' ~ 1 + 2 }} ```
Модель: «twig\exception\runtimeerror»
Верный ответ: runtimeerror
8/10
Bootstrap
T24-L1 · Bootstrap
Bootstrap 是一套现成 UI 组件的 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 这样的工具类使用间距刻度:数字是 $spacer 的倍数。
Модель: «否»
Верный ответ: 否
T24-L6 · Bootstrap
Bootstrap 5 的哪个 data 属性可以在元素上启用交互组件(例如 dropdown)?
Модель: «data-bs-toggle»
Верный ответ: data-bs-toggle
T24-L7 · Bootstrap
Bootstrap 5 的组件不依赖 jQuery——使用原生 JS。
Модель: «是»
Верный ответ: 是
T24-L8 · Bootstrap
Bootstrap 的深色模式是通过在根元素上添加 .dark 类开启的。
Модель: «是»
Верный ответ: 否
T24-L9 · Bootstrap
在 Bootstrap 5.3 中,视口宽度 992px 时 .container 的 max-width 是多少?
Модель: «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 的哪个方法把新对象标记为受管理(managed),而 SQL 延迟到 flush() 才执行?
Модель: «persist»
Верный ответ: persist
T14-L3 · Doctrine
在 Doctrine ORM 3 中,EntityManager::merge() 方法存在,并把传入的对象变成受管理的。
Модель: «否»
Верный ответ: 否
T14-L4 · Doctrine
DQL 查询以实体及其字段为单位编写,而不是表和列。
Модель: «是»
Верный ответ: 是
T14-L5 · Doctrine
如果不存在 id 为 999 的记录,$repository->find(999) 返回什么?
Модель: «null»
Верный ответ: null
T14-L6 · Doctrine
Symfony 的 DoctrineBundle 会在每个请求结束时自动调用 flush()。
Модель: «是»
Верный ответ: 否
T14-L7 · Doctrine
对于受管理的实体,只需修改属性即可:flush() 会在没有显式 persist() 的情况下提交更改——Unit of Work 会追踪变更。
Модель: «是»
Верный ответ: 是
T14-L8 · Doctrine
remove() 会立即执行 SQL DELETE,不会等到 flush()。
Модель: «是»
Верный ответ: 否
T14-L9 · Doctrine
给定:Doctrine ORM 3,EntityManager 使用内存 SQLite,实体 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,实体 User 带自增主键。users 表为空。这段代码会输出什么? ```php $u = new User(name: 'A'); $em->persist($u); $em->flush(); $a = $em->find(User::class, $u->getId()); $b = $em->find(User::class, $u->getId()); echo spl_object_id($a) === spl_object_id($b) ? 'same' : 'diff'; ```
Модель: «same»
Верный ответ: same
8/10
PostgreSQL
T15-L1 · PostgreSQL
PostgreSQL 使用 MVCC,因此读会阻塞写,写也会阻塞读。
Модель: «否»
Верный ответ: 否
T15-L2 · PostgreSQL
哪条 SQL 命令会显示查询的执行计划,而不实际执行查询?
Модель: «explain»
Верный ответ: explain
T15-L3 · PostgreSQL
SERIAL 和 GENERATED ... AS IDENTITY 只是同一机制的两个名称。
Модель: «否»
Верный ответ: 否
T15-L4 · PostgreSQL
默认情况下,PostgreSQL 的 UNIQUE 约束在列中只允许一行 NULL。
Модель: «否»
Верный ответ: 否
T15-L5 · PostgreSQL
PostgreSQL 的哪个聚合函数用分隔符拼接字符串?
Модель: «string_agg»
Верный ответ: string_agg
T15-L6 · PostgreSQL
普通 VACUUM 会把死元组占用的空间归还给操作系统。
Модель: «否»
Верный ответ: 否
T15-L7 · PostgreSQL
在窗口函数的定义中,哪个关键字把行分成若干组,函数按组计算?
Модель: «over»
Верный ответ: partition by
T15-L8 · PostgreSQL
READ COMMITTED 隔离级别能防止不可重复读(non-repeatable read)。
Модель: «否»
Верный ответ: 否
T15-L9 · PostgreSQL
这个 SQL 查询返回什么(PostgreSQL 17)? ```sql CREATE TEMP TABLE t (id int, x int); INSERT INTO t VALUES (1, 10), (2, 20), (3, 30); SELECT string_agg(s::text, ',' ORDER BY id) FROM ( SELECT id, sum(x) OVER (ORDER BY id) AS s FROM t ) q; ```
Модель: «10,30,60»
Верный ответ: 10,30,60
T15-L10 · PostgreSQL
这个 SQL 查询返回什么(PostgreSQL 17)? ```sql CREATE TEMP TABLE t (x int); INSERT INTO t VALUES (1), (NULL); SELECT count(x) FROM t; ```
Модель: «1»
Верный ответ: 1
9/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 扩展为向量(embedding)搜索添加了向量类型和索引?
Модель: «pgvector»
Верный ответ: vector
T17-L7 · PostgreSQL:事务与索引
部分索引(CREATE INDEX ... WHERE ...)只为满足条件的行构建。
Модель: «否»
Верный ответ: 是
T17-L8 · PostgreSQL:事务与索引
PostgreSQL 的 SERIALIZABLE 隔离级别是通过锁定事务读取的行来实现的。
Модель: «否»
Верный ответ: 否
T17-L9 · PostgreSQL:事务与索引
这个 SQL 查询返回什么(PostgreSQL 17)? ```sql CREATE TEMP TABLE t (a int); CREATE UNIQUE INDEX ON t (a); INSERT INTO t VALUES (1) ON CONFLICT DO NOTHING; INSERT INTO t VALUES (1) ON CONFLICT DO NOTHING; SELECT count(*) FROM t; ```
Модель: «1»
Верный ответ: 1
T17-L10 · PostgreSQL:事务与索引
这组 psql 命令会输出什么? ```sql BEGIN; CREATE TEMP TABLE t (a int, UNIQUE (a) DEFERRABLE INITIALLY DEFERRED); INSERT INTO t VALUES (1); INSERT INTO t VALUES (1); SELECT count(*) FROM t; ```
Модель: «2»
Верный ответ: 2
9/10
HTTP 与 REST API
T19-L1 · HTTP 与 REST API
HTTP 状态 201 表示请求成功创建了新资源。
Модель: «是»
Верный ответ: 是
T19-L2 · HTTP 与 REST API
哪个 HTTP 状态表示请求成功且响应体为空(例如 DELETE 之后)?
Модель: «204»
Верный ответ: 204
T19-L3 · HTTP 与 REST API
按 HTTP 规范,DELETE 方法是幂等的:对同一资源重复请求不会改变结果。
Модель: «是»
Верный ответ: 是
T19-L4 · HTTP 与 REST API
Access-Control-Allow-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
与 PUT 不同,按照 RFC 5789,PATCH 不要求幂等。
Модель: «是»
Верный ответ: 是
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
在 OAuth 2.0 授权码流程中,哪个参数会回到 redirect_uri 并用于换取 access 令牌?
Модель: «code»
Верный ответ: code
T20-L7 · 安全与 OAuth
Refresh 令牌的生命周期比 access 令牌长,可在用户不重新登录的情况下换取新的 access 令牌。
Модель: «是»
Верный ответ: 是
T20-L8 · 安全与 OAuth
密码盐必须保密:没有盐就无法校验哈希。
Модель: «否»
Верный ответ: 否
T20-L9 · 安全与 OAuth
客户端用不存在的 client_id 请求令牌端点(RFC 6749)。端点的 error 字段返回什么值?
Модель: «invalid_client»
Верный ответ: invalid_client
T20-L10 · 安全与 OAuth
OAuth 2.0:客户端以 response_type=token 开始流程。授权服务器把 access_token 放在 redirect_uri 的哪个部分?
Модель: «片段(#fragment)»
Верный ответ: fragment
10/10
测试:PHPUnit
T18-L1 · 测试:PHPUnit
PHPUnit 会执行任何类的测试方法——不必继承 TestCase。
Модель: «否»
Верный ответ: 否
T18-L2 · 测试:PHPUnit
PHPUnit 的 setUp() 在类的所有测试之前只执行一次。
Модель: «否»
Верный ответ: 否
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 的哪个命令行选项会让测试以随机顺序执行?
Модель: «--random»
Верный ответ: --order-by=random
T18-L9 · 测试:PHPUnit
这条命令会执行多少个测试? ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class CalcTest extends TestCase { public static function prov(): array { return [[1], [2], [3]]; } #[DataProvider('prov')] public function test_sum(int $x): void { $this->assertTrue($x > 0); } #[DataProvider('prov')] public function test_sum_abs(int $x): void { $this->assertTrue($x > 0); } public function test_other(): void { $this->assertTrue(true); } } ``` 命令:`phpunit CalcTest.php --filter test_sum`(PHPUnit 10.5)
Модель: «6»
Верный ответ: 6
T18-L10 · 测试:PHPUnit
这条命令会执行多少个测试,其中多少个失败(failure)?用逗号分隔的两个数字回答(执行数, 失败数)。 ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class Calc2Test extends TestCase { public function prov(): array { return [[1], [-1]]; } #[DataProvider('prov')] public function test_x(int $x): void { $this->assertTrue($x > 0); } } ``` 命令:`phpunit Calc2Test.php`(PHPUnit 10.5)
Модель: «2,1»
Верный ответ: 2,1
9/10

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

КлеткаТемаУтверждениеОтвет РезультатОбоснование
T01-L1
3.25 c
语法与运算符双引号字符串和单引号字符串的处理方式完全相同,区别只在速度。«否»
Пояснение: 双引号字符串支持变量插值和转义序列,而单引号字符串不进行解析,性能差异主要源于此。
Raw
{"answer": "否", "解释": "双引号字符串支持变量插值和转义序列,而单引号字符串不进行解析,性能差异主要源于此。"}
верноВ двойных кавычках работают интерполяция переменных и escape-последовательности, в одинарных — нет.
T01-L2
0.34 c
语法与运算符?? 运算符按 isset 的语义工作,对未定义的变量不会产生任何警告。«是»
Пояснение: ?? 运算符在左侧变量未定义或为 null 时返回右侧值,且不会抛出“未定义变量”的警告或通知。
Raw
{"answer": "是", "解释": "?? 运算符在左侧变量未定义或为 null 时返回右侧值,且不会抛出“未定义变量”的警告或通知。"}
верно?? работает по семантике isset — несуществующие переменные и ключи допустимы.
T01-L3
0.29 c
语法与运算符下面代码输出什么:echo 'a', 'b';«ab»
Пояснение: echo 语句可以接收多个用逗号分隔的参数,依次输出连接后的结果。
Raw
{"answer": "ab", "解释": "echo 语句可以接收多个用逗号分隔的参数,依次输出连接后的结果。"}
верноecho принимает список аргументов: ab.
T01-L4
0.33 c
语法与运算符print 返回值 1,可以用在表达式内部。«是»
Пояснение: print 在 PHP 中是一个语言结构,而非函数,其返回值恒为 1,且可以作为表达式的一部分使用。
Raw
{"answer": "是", "解释": "print 在 PHP 中是一个语言结构,而非函数,其返回值恒为 1,且可以作为表达式的一部分使用。"}
верноprint — выражение со значением 1, в отличие от echo, который значения не возвращает.
T01-L5
0.98 c
语法与运算符如果左侧操作数为假,?: 运算符(Elvis 运算符)返回左侧操作数。«否»
Пояснение: PHP 中没有独立的 Elvis 运算符(?: 是空合并运算符 ?? 的误称或指代三元运算符的简写),若指三元运算符 `cond ? a : b`,当左侧操作数为假时,返回的是第三个操作数(右侧操作数);若指空合并运算符 `??`,它检查左值是否存在且非 null,不存在或为 null 时返回右侧操作数。题目描述混淆了概念且表述不准确。
Raw
{"answer": "否", "解释": "PHP 中没有独立的 Elvis 运算符(?: 是空合并运算符 ?? 的误称或指代三元运算符的简写),若指三元运算符 `cond ? a : b`,当左侧操作数为假时,返回的是第三个操作数(右侧操作数);若指空合并运算符 `??`,它检查左值是否存在且非 null,不存在或为 null 时返回右侧操作数。题目描述混淆了概念且表述不准确。"}
верноНаоборот: $a ?: $b возвращает $a, если он истинный, иначе $b.
T01-L6
0.31 c
语法与运算符在 PHP 8 中,连接运算符(.)的优先级低于加法和减法。«否»
Пояснение: 在 PHP 中,连接运算符(.)的优先级高于加法和减法。
Raw
```json ⏎ { ⏎   "answer": "否", ⏎   "解释": "在 PHP 中,连接运算符(.)的优先级高于加法和减法。" ⏎ } ⏎ ```
неверно
верный: «是»
С PHP 8 (RFC concat precedence) '.' имеет приоритет ниже арифметики: 'сумма: ' . 2 + 3 → 'сумма: 5' (в PHP 7 было иначе).
T01-L7
0.36 c
语法与运算符表达式 2 ** 3 ** 2 在 PHP 中按 (2 ** 3) ** 2 计算,即等于 64。«否»
Пояснение: PHP 中 ** 运算符是右结合的,因此 2 ** 3 ** 2 等价于 2 ** (3 ** 2) = 2 ** 9 = 512。
Raw
{"answer": "否", "解释": "PHP 中 ** 运算符是右结合的,因此 2 ** 3 ** 2 等价于 2 ** (3 ** 2) = 2 ** 9 = 512。"}
верно** право-ассоциативен: 2 ** (3 ** 2) = 2 ** 9 = 512.
T01-L8
0.69 c
语法与运算符下面代码输出什么字符串:echo '总和: ' . 2 + 3;(PHP 8)?«总和: 23»
Пояснение: 字符串与数字相加,字符串会被转为数字,但此处是字符串和数字相加,实际上是字符串拼接,'总和: ' . 2 是 '总和: 2',再 + 3,由于左边是字符串,结果仍是字符串 '总和: 23'。
Raw
{"answer": "总和: 23", "解释": "字符串与数字相加,字符串会被转为数字,但此处是字符串和数字相加,实际上是字符串拼接,'总和: ' . 2 是 '总和: 2',再 + 3,由于左边是字符串,结果仍是字符串 '总和: 23'。"}
неверно
верный: «总和: 5»
Парная к verify-клетке про приоритет: 'сумма: 5'.
T02-L1
0.37 c
类型与比较在严格比较(===)下,数组被视为相等,与元素顺序无关。«否»
Пояснение: 在 PHP 中,使用严格比较(===)比较数组时,不仅要求数组的元素相同,还要求元素的顺序完全一致。
Raw
{"answer": "否", "解释": "在 PHP 中,使用严格比较(===)比较数组时,不仅要求数组的元素相同,还要求元素的顺序完全一致。"}
верно=== для массивов требует совпадения и значений, и их порядка.
T02-L2
0.33 c
类型与比较表达式 0 == false 返回 false,因为这是严格比较。«否»
Пояснение: 0 == false 返回 true,因为 == 是宽松比较,0 和 false 类型不强制且值相等。
Raw
{"answer": "否", "解释": "0 == false 返回 true,因为 == 是宽松比较,0 和 false 类型不强制且值相等。"}
верноНаоборот: == — нестрогое сравнение и возвращает true; строгое — это === (0 === false → false).
T02-L3
0.49 c
类型与比较在 PHP 8 中,表达式 "abc" == 0 的结果是 true。«否»
Пояснение: 在PHP 8中,字符串与数字比较时,如果字符串不是数字格式,PHP会先将字符串转换为整数,因此'abc' == 0会返回false。
Raw
```json ⏎ { ⏎   "answer": "否", ⏎   "解释": "在PHP 8中,字符串与数字比较时,如果字符串不是数字格式,PHP会先将字符串转换为整数,因此'abc' == 0会返回false。" ⏎ } ⏎ ```
верноС PHP 8 нечисловая строка сравнивается как строка: "abc" == "0" → false (в PHP 7 было true).
T02-L4
0.27 c
类型与比较在宽松比较下,null 同时等于 0、空字符串和 false。«是»
Пояснение: 在PHP的宽松比较中,null被视为0、空字符串和false。
Raw
{"answer": "是", "解释": "在PHP的宽松比较中,null被视为0、空字符串和false。"}
верноnull == 0, null == "" и null == false — все true.
T02-L5
0.3 c
类型与比较表达式 (int) '42abc' 返回什么?«42»
Пояснение: PHP 将字符串开头的有效数字部分转换为整数,忽略后续的字母。
Raw
{"answer": 42, "解释": "PHP 将字符串开头的有效数字部分转换为整数,忽略后续的字母。"}
верноВедущая числовая часть: 42, без ошибок и warning.
T02-L6
0.29 c
类型与比较表达式 '5' + 5 返回什么?«10»
Пояснение: 字符串 '5' 被自动转换为整数 5,然后与 5 相加得到 10。
Raw
{"answer": 10, "解释": "字符串 '5' 被自动转换为整数 5,然后与 5 相加得到 10。"}
верноЧисловая строка приводится: int 10.
T02-L7
0.25 c
类型与比较转换为字符串时,false 会变成 "0"。«否»
Пояснение: 在 PHP 中,false 转换为字符串是 ""(空字符串),而不是 "0"。
Raw
{"answer": "否", "解释": "在 PHP 中,false 转换为字符串是 \"\"(空字符串),而不是 \"0\"。"}
верноfalse → "", true → "1".
T02-L8
0.31 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.31 c
字符串strrev() 能正确反转 UTF-8 字符串。«否»
Пояснение: strrev() 按字节反转,会导致 UTF-8 多字节字符结构被破坏。
Raw
{ ⏎ "answer": "否", ⏎ "解释": "strrev() 按字节反转,会导致 UTF-8 多字节字符结构被破坏。" ⏎ }
верноstrrev переворачивает байты и ломает многобайтовые последовательности.
T03-L2
0.32 c
字符串str_contains('Hello world', 'world') 返回 true。«是»
Пояснение: str_contains 检查字符串中是否包含子串,'Hello world' 确实包含 'world',因此返回 true。
Raw
{"answer": "是", "解释": "str_contains 检查字符串中是否包含子串,'Hello world' 确实包含 'world',因此返回 true。"}
верноstr_contains с PHP 8.0 проверяет вхождение подстроки.
T03-L3
0.33 c
字符串str_pad() 只能在字符串右侧补齐。«否»
Пояснение: str_pad() 可以通过第三个参数 $pad_type 指定 LEFT、RIGHT 或 BOTH 来在左侧、右侧或两侧补齐。
Raw
{"answer": "否", "解释": "str_pad() 可以通过第三个参数 $pad_type 指定 LEFT、RIGHT 或 BOTH 来在左侧、右侧或两侧补齐。"}
верноSTR_PAD_LEFT / STR_PAD_BOTH меняют сторону дополнения.
T03-L4
0.47 c
字符串默认情况下 trim() 只去掉空格,不会处理制表符和换行符。«否»
Пояснение: PHP 的 trim() 函数默认会去除字符串首尾的空格、制表符(\t)、换行符(\n)、回车符(\r)、NULL 字符(\0)和垂直制表符(\v)。
Raw
{"answer": "否", "解释": "PHP 的 trim() 函数默认会去除字符串首尾的空格、制表符(\\t)、换行符(\\n)、回车符(\\r)、NULL 字符(\\0)和垂直制表符(\\v)。"}
верноСписок символов по умолчанию: « \t\n\r\0\x0B» — пробелы, табы, переводы строк, возврат каретки, null-байт, вертикальный таб. Проверено php -r.
T03-L5
0.31 c
字符串对 UTF-8 字符串,strlen('你好') 返回多少个字节(BYTES)?«6»
Пояснение: UTF-8 中每个中文字符占 3 字节,2 个字符共 6 字节。
Raw
{"answer": 6, "解释": "UTF-8 中每个中文字符占 3 字节,2 个字符共 6 字节。"}
верно6 букв по 2 байта: 12.
T03-L6
0.25 c
字符串表达式 substr('abcdef', -3) 返回什么?«def»
Пояснение: substr 从倒数第3个字符开始截取到末尾
Raw
{"answer": "def", "解释": "substr 从倒数第3个字符开始截取到末尾"}
верноОтрицательное смещение — с конца: def.
T03-L7
0.23 c
字符串ucfirst() 会原地修改传入的字符串。«否»
Пояснение: ucfirst() 返回一个新字符串,不会修改原字符串。
Raw
{"answer": "否", "解释": "ucfirst() 返回一个新字符串,不会修改原字符串。"}
верноСтроки неизменяемы; ucfirst возвращает новую строку.
T03-L8
0.29 c
字符串heredoc 支持变量插值,而 nowdoc 不支持。«是»
Пояснение: Heredoc 语法支持变量插值,而 Nowdoc 语法将内容视为纯字符串,不支持插值。
Raw
{"answer": "是", "解释": "Heredoc 语法支持变量插值,而 Nowdoc 语法将内容视为纯字符串,不支持插值。"}
верноNowdoc — «одинарные кавычки» в тройном синтаксисе: текст как есть.
T04-L1
0.25 c
数组sort() 函数会保持数组键与值之间的对应关系。«否»
Пояснение: sort() 函数在排序后会重新索引数组键,不保持原有的键值对应关系。
Raw
{"answer": "否", "解释": "sort() 函数在排序后会重新索引数组键,不保持原有的键值对应关系。"}
верноsort перенумеровывает ключи; связь сохраняет asort.
T04-L2
0.52 c
数组数组中的字符串键 '5' 会存成整数 5。«否»
Пояснение: PHP 中字符串键 '5' 会转换为整数键 5,但前提是 '5' 是合法的整数字符串;而像 '05' 或 '5.0' 则仍为字符串键。
Raw
{"answer": "否", "解释": "PHP 中字符串键 '5' 会转换为整数键 5,但前提是 '5' 是合法的整数字符串;而像 '05' 或 '5.0' 则仍为字符串键。"}
неверно
верный: «是»
Каноничные десятичные строковые ключи приводятся к int.
T04-L3
0.28 c
数组in_array() 函数默认使用严格比较(===)。«否»
Пояснение: in_array() 函数默认使用非严格比较(==),除非第三个参数设置为 true。
Raw
{"answer": "否", "解释": "in_array() 函数默认使用非严格比较(==),除非第三个参数设置为 true。"}
верноПо умолчанию сравнение нестрогое; строгое — третий аргумент true.
T04-L4
0.37 c
数组不带回调时,array_filter() 会删除数组中所有“空”(falsy)元素。«是»
Пояснение: array_filter() 在没有提供回调函数时,默认会移除数组中所有 falsy 值(如 0、空字符串、null、false 等)的元素。
Raw
```json ⏎ {"answer": "是", "解释": "array_filter() 在没有提供回调函数时,默认会移除数组中所有 falsy 值(如 0、空字符串、null、false 等)的元素。"} ⏎ ```
верноУбирает 0, "", null, false и пустые массивы.
T04-L5
1.18 c
数组默认情况下,array_slice() 会保留数组原有的数字键。«是»
Пояснение: array_slice() 默认情况下保留原始数组的数字键,除非设置 preserve_keys 参数为 true(实际上该参数默认是 false,但问题表述有歧义,需澄清:默认不保留,若问题意指默认行为则答案应为否,但根据 PHP 官方文档,preserve_keys 默认为 false,即不保留,故此处答案应为否,请确认题意。根据标准知识,默认不保留,故答案为否。)
Raw
{"answer": "是", "解释": "array_slice() 默认情况下保留原始数组的数字键,除非设置 preserve_keys 参数为 true(实际上该参数默认是 false,但问题表述有歧义,需澄清:默认不保留,若问题意指默认行为则答案应为否,但根据 PHP 官方文档,preserve_keys 默认为 false,即不保留,故此处答案应为否,请确认题意。根据标准知识,默认不保留,故答案为否。)", "注意": "根据 PHP 文档,array_slice() 的 preserve_keys 参数默认为 false,意味着默认不保留原始键。因此正确答案应为“否”。"}
неверно
верный: «否»
По умолчанию ключи перенумеровываются; сохранение — preserve_keys = true.
T04-L6
0.31 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.45 c
数组count(['a' => 1] + ['a' => 9, 'b' => 2]) 的元素个数是多少?«2»
Пояснение: PHP 数组合并运算符 + 会保留左边的键,['a' => 1] + ['a' => 9, 'b' => 2] 结果为 ['a' => 1, 'b' => 2],共2个元素。
Raw
{"answer": "2", "解释": "PHP 数组合并运算符 + 会保留左边的键,['a' => 1] + ['a' => 9, 'b' => 2] 结果为 ['a' => 1, 'b' => 2],共2个元素。"}
верноОператор + : по ключу 'a' побеждает левый; итого 2.
T04-L8
0.35 c
数组从 PHP 8.1 起,展开运算符 [...$a, ...$b] 支持带字符串键的数组。«是»
Пояснение: PHP 8.1 允许使用展开运算符处理带字符串键的数组,键会被保留。
Raw
{"answer": "是", "解释": "PHP 8.1 允许使用展开运算符处理带字符串键的数组,键会被保留。"}
верноВ 8.0 — только числовые ключи; 8.1 снял ограничение.
T05-L1
0.49 c
函数与闭包在同一个调用中,命名参数不能与数组展开 ...$args 组合使用。«是»
Пояснение: PHP 中在单次函数调用内,命名参数确实不能与 ...$args 这种可变参数解包混用,会触发语法或运行时错误。
Raw
{"answer": "是", "解释": "PHP 中在单次函数调用内,命名参数确实不能与 ...$args 这种可变参数解包混用,会触发语法或运行时错误。"}
неверно
верный: «否»
Можно: f(...$args, имя: значение). Нельзя только позиционный аргумент после распаковки.
T05-L2
0.53 c
函数与闭包不使用 use 的匿名函数能看到外部作用域的变量。«否»
Пояснение: 匿名函数默认具有自身作用域,必须通过 use 关键字才能访问外部变量(静态变量或对象属性除外,但通常语境指普通变量)。
Raw
{"answer": "否", "解释": "匿名函数默认具有自身作用域,必须通过 use 关键字才能访问外部变量(静态变量或对象属性除外,但通常语境指普通变量)。"}
верноБез use внешние переменные недоступны; авто-захват только у fn.
T05-L3
0.28 c
函数与闭包调用 f(1, 2, 3) 时,function f($a) { return func_num_args(); } 内部的 func_num_args() 返回什么?«3»
Пояснение: func_num_args() 返回传递给函数的实际参数个数,与形参数量无关。
Raw
{"answer": 3, "解释": "func_num_args() 返回传递给函数的实际参数个数,与形参数量无关。"}
верноСчитает переданные аргументы: 3.
T05-L4
0.35 c
函数与闭包箭头函数 fn 的函数体可以是用花括号包起来的多个表达式。«否»
Пояснение: 箭头函数(fn)的函数体是一个表达式,不能使用花括号包含多个表达式,只能返回单个表达式的值。
Raw
```json ⏎ {"answer": "否", "解释": "箭头函数(fn)的函数体是一个表达式,不能使用花括号包含多个表达式,只能返回单个表达式的值。"} ⏎ ```
верноfn — всегда одно выражение; блок операторов делает обычная анонимная функция.
T05-L5
0.29 c
函数与闭包箭头函数 fn 按引用捕获外部变量(惰性地,在使用时才取值)。«否»
Пояснение: PHP 中的箭头函数(fn)默认按值捕获变量,而非按引用。
Raw
```json ⏎ {"answer": "否", "解释": "PHP 中的箭头函数(fn)默认按值捕获变量,而非按引用。"} ⏎ ```
верноfn захватывает только по значению, автоматически; по ссылке — только &$var в use у обычной функции (fn так не умеет).
T05-L6
0.27 c
函数与闭包用 static function () {} 声明的闭包不会捕获 $this。«是»
Пояснение: 静态闭包中 $this 为 null,不会自动捕获外部作用域的 $this。
Raw
{"answer": "是", "解释": "静态闭包中 $this 为 null,不会自动捕获外部作用域的 $this。"}
верноstatic-замыкание отвязано от объекта: $this внутри недоступен.
T05-L7
0.32 c
函数与闭包下面代码输出什么:$x = 5; $f = function () use ($x) { return $x; }; $x = 7; echo $f();«5»
Пояснение: use ($x) 在定义时按值捕获变量,后续修改 $x 不影响闭包内的值。
Raw
{"answer": 5, "解释": "use ($x) 在定义时按值捕获变量,后续修改 $x 不影响闭包内的值。"}
верноuse захватывает по значению в момент создания: 5.
T05-L8
0.26 c
函数与闭包在弱类型模式(不用 strict_types)下,把字符串 "5" 传给 int 类型的参数是允许的。«是»
Пояснение: PHP 在弱类型模式下会自动将数字字符串转换为整数类型。
Raw
{"answer": "是", "解释": "PHP 在弱类型模式下会自动将数字字符串转换为整数类型。"}
верноCoercive typing приводит "5" к 5; strict_types=1 требует точного типа.
T06-L1
0.25 c
OOP:类与继承PHP 支持构造函数属性提升(promotion):public function __construct(private int $x) {}。«是»
Пояснение: PHP 8.0 引入了构造函数属性提升,允许在构造函数参数中声明属性。
Raw
{"answer": "是", "解释": "PHP 8.0 引入了构造函数属性提升,允许在构造函数参数中声明属性。"}
верноС PHP 8.0 параметр с модификатором создаёт свойство и присваивание.
T06-L2
0.23 c
OOP:类与继承哪个关键字禁止在子类中重写方法?«final»
Пояснение: 在 PHP 中,使用 final 关键字修饰的方法禁止在子类中被重写。
Raw
{"answer": "final", "解释": "在 PHP 中,使用 final 关键字修饰的方法禁止在子类中被重写。"}
верноfinal.
T06-L3
0.23 c
OOP:类与继承声明为 final 的方法不能在子类中重写。«是»
Пояснение: 在 PHP 中,声明为 final 的方法禁止在子类中被重写或覆盖。
Raw
{"answer": "是", "解释": "在 PHP 中,声明为 final 的方法禁止在子类中被重写或覆盖。"}
верноfinal запрещает переопределение метода и наследование класса.
T06-L4
0.27 c
OOP:类与继承父类中 private 可见性的属性在子类中可以访问。«否»
Пояснение: private 属性仅在声明它的类内部可见,子类无法直接访问。
Raw
{"answer": "否", "解释": "private 属性仅在声明它的类内部可见,子类无法直接访问。"}
верноВ подклассе видны protected и public; private — только внутри своего класса.
T06-L5
0.5 c
OOP:类与继承get_class(new class {}) 返回什么?请回答 NUL 字节之前的部分(不含文件路径)。«class@anonymous»
Пояснение: PHP 7 的匿名类,其 get_class 返回值形如 class@anonymous/文件名:行号,NUL 字节前的部分即为 class@anonymous
Raw
{"answer": "class@anonymous", "解释": "PHP 7 的匿名类,其 get_class 返回值形如 class@anonymous/文件名:行号,NUL 字节前的部分即为 class@anonymous"}
верноget_class анонимного класса печатает class@anonymous\0<файл>:<строка>$n; короткая форма — часть до NUL-байта. Проверено php -r (hex).
T06-L6
0.39 c
OOP:类与继承父类的 private 方法不属于继承契约:子类可以用任意可见性声明同名方法。«是»
Пояснение: 父类的 private 方法在子类中不可见,因此不遵循继承契约,子类可以独立声明同名方法且可见性不受限制。
Raw
{"answer": "是", "解释": "父类的 private 方法在子类中不可见,因此不遵循继承契约,子类可以独立声明同名方法且可见性不受限制。"}
верноprivate-члены не наследуются — правила совместимости подписей не действуют.
T06-L7
0.41 c
OOP:类与继承魔术方法 __get() 只会在访问不存在的属性时被调用。«否»
Пояснение: __get() 方法会在访问不可访问(private/protected)或不可见(未定义)的属性时调用,不仅仅是“不存在”的属性。
Raw
{"answer": "否", "解释": "__get() 方法会在访问不可访问(private/protected)或不可见(未定义)的属性时调用,不仅仅是“不存在”的属性。"}
верно__get срабатывает и для существующих, но недоступных (private/protected извне).
T06-L8
0.25 c
OOP:类与继承对 readonly 属性重复赋值会抛出什么——Exception 还是 Error?«error»
Пояснение: 对 readonly 属性重复赋值会抛出 Error,具体为 Error 类型异常。
Raw
{"answer": "Error", "解释": "对 readonly 属性重复赋值会抛出 Error,具体为 Error 类型异常。"}
верноError (readonly с 8.1); оговорка: в __clone() переинициализация допустима (8.3+).
T07-L1
0.31 c
接口、trait 与 enum接口可以声明常量。«是»
Пояснение: PHP 允许在接口中声明常量,常量值在定义时确定且不可变。
Raw
{"answer": "是", "解释": "PHP 允许在接口中声明常量,常量值在定义时确定且不可变。"}
верноКонстанты интерфейса наследуются реализациями.
T07-L2
0.25 c
接口、trait 与 enum哪个运算符用于检查对象是否为某个类或接口的实例?«instanceof»
Пояснение: PHP 中使用 instanceof 运算符来检查对象是否为特定类或接口的实例。
Raw
{"answer": "instanceof", "解释": "PHP 中使用 instanceof 运算符来检查对象是否为特定类或接口的实例。"}
верноinstanceof.
T07-L3
0.33 c
接口、trait 与 enum接口可以声明静态方法。«是»
Пояснение: PHP 8.1 允许接口声明静态方法,实现类必须提供同名静态方法。
Raw
{"answer": "是", "解释": "PHP 8.1 允许接口声明静态方法,实现类必须提供同名静态方法。"}
верноРеализация обязана дать статический метод с той же сигнатурой.
T07-L4
0.21 c
接口、trait 与 enuminstanceof 运算符只检查类的继承:它不考虑接口。«否»
Пояснение: instanceof 运算符可以同时检查类继承和接口实现。
Raw
{"answer": "否", "解释": "instanceof 运算符可以同时检查类继承和接口实现。"}
верноinstanceof возвращает true и для интерфейсов объекта.
T07-L5
0.29 c
接口、trait 与 enum接口方法可以像 trait 方法一样带有默认实现。«是»
Пояснение: PHP 8.1 引入了接口默认方法,允许接口方法像 trait 方法一样提供默认实现。
Raw
{"answer": "是", "解释": "PHP 8.1 引入了接口默认方法,允许接口方法像 trait 方法一样提供默认实现。"}
неверно
верный: «否»
Методы интерфейса — только сигнатуры; тело даёт реализующий класс.
T07-L6
0.25 c
接口、trait 与 enum抽象类中抽象方法的可见性可以是 protected。«是»
Пояснение: 在 PHP 中,抽象方法的可见性可以是 public 或 protected,但不能是 private。
Raw
{"answer": "是", "解释": "在 PHP 中,抽象方法的可见性可以是 public 或 protected,但不能是 private。"}
верноВ абстрактном классе — любая видимость; в интерфейсе — только public.
T07-L7
0.32 c
接口、trait 与 enum对于 enum Foo { case A; case B; case C; },Foo::cases() 返回多少个元素?«3»
Пояснение: Foo 枚举定义了 A、B、C 三个 case,因此 Foo::cases() 返回包含这 3 个元素的数组。
Raw
{"answer": "3", "解释": "Foo 枚举定义了 A、B、C 三个 case,因此 Foo::cases() 返回包含这 3 个元素的数组。"}
верноСтатический метод cases(): 3.
T07-L8
0.25 c
接口、trait 与 enumtrait 可以声明常量。«是»
Пояснение: PHP Trait 允许定义常量,使用方式与类相同。
Raw
{"answer": "是", "解释": "PHP Trait 允许定义常量,使用方式与类相同。"}
верноС PHP 8.2 трейты могут объявлять константы (RFC constants_in_traits); до 8.2 — нет.
T08-L1
0.29 c
异常与错误Throwable 接口是 Exception 和 Error 的共同祖先。«是»
Пояснение: 在 PHP 中,Throwable 接口被 Exception 和 Error 继承,是所有可抛出异常的顶层接口。
Raw
{"answer": "是", "解释": "在 PHP 中,Throwable 接口被 Exception 和 Error 继承,是所有可抛出异常的顶层接口。"}
верноИерархия с PHP 7: Throwable → Exception и Throwable → Error.
T08-L2
0.45 c
异常与错误catch (Exception $e) 块也能捕获 TypeError,因为 TypeError 最终继承自 Exception。«否»
Пояснение: 在 PHP 8 中,TypeError 继承自 Error 接口,而不是 Exception 接口;只有当 catch 块捕获 Throwable 或 Error 时才能捕获它。
Raw
{"answer": "否", "解释": "在 PHP 8 中,TypeError 继承自 Error 接口,而不是 Exception 接口;只有当 catch 块捕获 Throwable 或 Error 时才能捕获它。"}
верноTypeError наследуется от Error; catch (Exception) его не ловит.
T08-L3
0.29 c
异常与错误@ 运算符也能抑制异常。«否»
Пояснение: PHP 的 @ 运算符仅抑制错误(error)信息,不能抑制异常(exception)。
Raw
{"answer": "否", "解释": "PHP 的 @ 运算符仅抑制错误(error)信息,不能抑制异常(exception)。"}
верно@ глушит диагностику (warnings/notices), исключения не перехватывает.
T08-L4
0.27 c
异常与错误intdiv(5, 0) 会抛出哪个错误类?«divisionbyzeroerror»
Пояснение: PHP 8+ 中 intdiv 除以零会抛出 DivisionByZeroError。
Raw
{"answer": "DivisionByZeroError", "解释": "PHP 8+ 中 intdiv 除以零会抛出 DivisionByZeroError。"}
верноDivisionByZeroError (иерархия Error, не Exception); php-грейдер объективен.
T08-L5
0.23 c
异常与错误只有当异常被 catch 块捕获时,finally 块才会执行。«否»
Пояснение: 无论异常是否被捕获,finally 块都会执行。
Raw
{"answer": "否", "解释": "无论异常是否被捕获,finally 块都会执行。"}
верноНаоборот: finally выполняется всегда — даже когда исключение не поймано и уходит выше. Проверено php -r.
T08-L6
0.3 c
异常与错误在 finally 块内抛出的异常对 try 块的结果没有任何影响。«否»
Пояснение: finally 块中的异常会替换或掩盖 try/catch 中原本要抛出的异常
Raw
{"answer": "否", "解释": "finally 块中的异常会替换或掩盖 try/catch 中原本要抛出的异常"}
верноИсключение из finally перекрывает исходное и уходит вместо него.
T08-L7
0.21 c
异常与错误表达式 (bool) new Exception('x') 返回什么?«是»
Пояснение: 对象转换为布尔值时,非空对象恒为 true。
Raw
{"answer": "是", "解释": "对象转换为布尔值时,非空对象恒为 true。"}
верноЛюбой объект при приведении к bool — true. Формы ответа: true или да.
T08-L8
0.39 c
异常与错误通过 register_shutdown_function() 注册的函数会在调用 exit 时执行。«是»
Пояснение: exit 会终止脚本执行,但 register_shutdown_function 注册的函数会在脚本关闭前(包括 exit 或 fatal error)执行。
Raw
{"answer": "是", "解释": "exit 会终止脚本执行,但 register_shutdown_function 注册的函数会在脚本关闭前(包括 exit 或 fatal error)执行。"}
верноexit завершает скрипт, но shutdown-функции отрабатывают.
T09-L1
0.37 c
命名空间与自动加载use App\Service\Mailer; 这条语句本身就会加载包含该类的文件。«否»
Пояснение: use 语句仅建立别名映射,类文件实际加载发生在实例化或调用静态成员时。
Raw
{"answer": "否", "解释": "use 语句仅建立别名映射,类文件实际加载发生在实例化或调用静态成员时。"}
верноuse — псевдоним на этапе компиляции; файл грузит автозагрузчик при первом обращении.
T09-L2
0.32 c
命名空间与自动加载要导入函数(而不是类),use 后面写哪个词:function 还是 const?«function»
Пояснение: 在 PHP 中,要导入函数应使用 'use function' 语法,而 'const' 用于导入常量。
Raw
{"answer": "function", "解释": "在 PHP 中,要导入函数应使用 'use function' 语法,而 'const' 用于导入常量。"}
верноuse function ...; (и use const для констант).
T09-L3
0.36 c
命名空间与自动加载在 PSR-4 映射 «App\ → src/» 下,类 App\Controller\Api\UserController 会放进哪个文件(相对 src/ 的路径)?«controller/api/usercontroller.php»
Пояснение: PSR-4 标准规定命名空间中的每个子层级对应一个目录,且类名对应文件名。
Raw
{"answer": "Controller/Api/UserController.php", "解释": "PSR-4 标准规定命名空间中的每个子层级对应一个目录,且类名对应文件名。"}
верноОстаток имени после префикса, \ → /.
T09-L4
0.31 c
命名空间与自动加载引入 vendor/autoload.php 会通过 spl_autoload_register() 注册自动加载器。«是»
Пояснение: composer autoload 机制正是通过 spl_autoload_register 注册类加载器。
Raw
{"answer": "是", "解释": "composer autoload 机制正是通过 spl_autoload_register 注册类加载器。"}
верноComposer ставит автозагрузчик именно на spl_autoload_register.
T09-L5
0.23 c
命名空间与自动加载魔术常量 __NAMESPACE__ 包含当前命名空间的名称。«是»
Пояснение: __NAMESPACE__ 魔术常量确实用于获取当前文件的命名空间名称。
Raw
{"answer": "是", "解释": "__NAMESPACE__ 魔术常量确实用于获取当前文件的命名空间名称。"}
верноВ корневом пространстве — пустая строка.
T09-L6
0.29 c
命名空间与自动加载在 new 中,非限定类名(不带前导 \)会从全局根开始解析。«否»
Пояснение: 在 PHP 中,非限定类名会从当前命名空间开始解析,若未找到则回退到全局命名空间。
Raw
{"answer": "否", "解释": "在 PHP 中,非限定类名会从当前命名空间开始解析,若未找到则回退到全局命名空间。"}
верноРезолвится относительно текущего namespace (с учётом импортов).
T09-L7
0.48 c
命名空间与自动加载在 PSR-4 映射 «App\ → src/» 下,类 App\Model\User 位于文件 src/Model/User.php。«是»
Пояснение: PSR-4 规范规定命名空间与目录结构一一对应,根命名空间 App 映射到 src/,子命名空间 Model 映射到 Model 子目录,类名 User 对应文件名 User.php。
Raw
{"answer": "是", "解释": "PSR-4 规范规定命名空间与目录结构一一对应,根命名空间 App 映射到 src/,子命名空间 Model 映射到 Model 子目录,类名 User 对应文件名 User.php。"}
верноОстаток имени после префикса переносится в путь как есть.
T09-L8
0.41 c
命名空间与自动加载use 语句可以写在函数体内——该导入只对这个函数生效。«否»
Пояснение: PHP 的 use 语句是编译期指令,必须位于文件的顶层(命名空间声明之后、函数/类定义之前),不能写在函数体内。
Raw
{"answer": "否", "解释": "PHP 的 use 语句是编译期指令,必须位于文件的顶层(命名空间声明之后、函数/类定义之前),不能写在函数体内。"}
верноuse внутри тела функции — parse error; импорты файловые и компиляционные.
T10-L1
0.27 c
引用与作用域数组在赋值时是复制,而不是按引用传递。«是»
Пояснение: PHP 中数组赋值采用写时复制机制,属于值语义。
Raw
{"answer": "是", "解释": "PHP 中数组赋值采用写时复制机制,属于值语义。"}
верноПрисваивание массива — копия (в движке — copy-on-write).
T10-L2
0.38 c
引用与作用域下面代码输出什么:$a = [1, 2]; $b = $a; $b[] = 3; echo count($a);«2»
Пояснение: PHP 数组按值赋值,$b 是 $a 的副本,修改 $b 不影响 $a,故 $a 仍含 2 个元素。
Raw
{"answer": 2, "解释": "PHP 数组按值赋值,$b 是 $a 的副本,修改 $b 不影响 $a,故 $a 仍含 2 个元素。"}
верноПрисваивание — копия: в $a по-прежнему 2 элемента.
T10-L3
0.5 c
引用与作用域在函数内部,不通过 global、$GLOBALS 或参数传递,就无法访问全局作用域的用户变量。«否»
Пояснение: 可以通过 $GLOBALS 数组或 global 关键字访问,且可以使用 PHP 的命名空间功能。
Raw
```json ⏎ { ⏎   "answer": "否", ⏎   "解释": "可以通过 $GLOBALS 数组或 global 关键字访问,且可以使用 PHP 的命名空间功能。" ⏎ } ⏎ ```
неверно
верный: «是»
Область видимости функций изолирована; исключение — суперглобалы ($_GET и др.).
T10-L4
0.53 c
引用与作用域在函数内 unset($GLOBALS['x']) 只对该函数删除这个全局变量。«否»
Пояснение: unset($GLOBALS['x']) 是全局作用域下的删除操作,会移除整个 $GLOBALS 数组中对应的 'x' 键,而不是只在当前函数中删除。
Raw
```json ⏎ {"answer": "否", "解释": "unset($GLOBALS['x']) 是全局作用域下的删除操作,会移除整个 $GLOBALS 数组中对应的 'x' 键,而不是只在当前函数中删除。"} ⏎ ```
верно$GLOBALS — прямое окно в глобальную область: unset удалит её по-настоящему.
T10-L5
0.4 c
引用与作用域下面代码输出什么:function inc(&$x) { $x++; } $n = 5; inc($n); echo $n;«6»
Пояснение: 函数 inc 按引用传递参数 $n,因此 $n 的值在函数内部被递增为 6,echo 输出 6。
Raw
{"answer": 6, "解释": "函数 inc 按引用传递参数 $n,因此 $n 的值在函数内部被递增为 6,echo 输出 6。"}
верноСсылка меняет оригинал: 6.
T10-L6
0.4 c
引用与作用域按值遍历数组的 foreach 操作的是“活”数组:循环内对数组的修改在同一个遍历过程中可见。«否»
Пояснение: 按值遍历时,数组在循环开始时被复制一次,循环内的修改不会影响后续遍历的可见性。
Raw
```json ⏎ {"answer": "否", "解释": "按值遍历时,数组在循环开始时被复制一次,循环内的修改不会影响后续遍历的可见性。"} ⏎ ```
верноПо значению foreach итерирует копию-снимок.
T10-L7
0.25 c
引用与作用域静态属性在每个实例中各自独立:一个对象中的修改对其他对象不可见。«否»
Пояснение: 静态属性属于类,所有实例共享同一份数据,修改对彼此可见。
Raw
{"answer": "否", "解释": "静态属性属于类,所有实例共享同一份数据,修改对彼此可见。"}
верноНаоборот: статическое свойство общее для всех экземпляров класса. Проверено php -r.
T10-L8
0.28 c
引用与作用域数组可以用布尔值 true 作为键,并且它会以 bool 类型保存。«否»
Пояснение: PHP 中数组的布尔键 true 会被转换为整数 1。
Raw
{"answer": "否", "解释": "PHP 中数组的布尔键 true 会被转换为整数 1。"}
верноБулев ключ приводится к int: true → 1, false → 0.
T11-L1
0.25 c
生成器、迭代器与 SPL生成器内部可以使用带值的 return,该值可以通过 $gen->getReturn() 取到。«是»
Пояснение: PHP 生成器支持使用 return 语句返回值,并通过 getReturn() 方法获取。
Raw
{"answer": "是", "解释": "PHP 生成器支持使用 return 语句返回值,并通过 getReturn() 方法获取。"}
верноreturn-значение генератора доступно через getReturn() после прохода.
T11-L2
0.29 c
生成器、迭代器与 SPL已经遍历完的生成器可以通过 rewind() 倒回并重新遍历。«否»
Пояснение: Generator 对象是一次性的,耗尽后无法通过 rewind() 重新遍历。
Raw
{"answer": "否", "解释": "Generator 对象是一次性的,耗尽后无法通过 rewind() 重新遍历。"}
верноГенератор одноразовый: rewind после начала итерации бросает Exception.
T11-L3
0.28 c
生成器、迭代器与 SPLyield from 语法会把遍历委托给另一个生成器或可迭代对象。«是»
Пояснение: yield from 将迭代控制权委托给另一个可迭代对象或生成器,并转发其产出的值。
Raw
{"answer": "是", "解释": "yield from 将迭代控制权委托给另一个可迭代对象或生成器,并转发其产出的值。"}
верноyield from проксирует значения, ключи и return-значение внутреннего генератора.
T11-L4
0.38 c
生成器、迭代器与 SPL对于 function g() { yield 1; },get_class(g()) 返回什么?«generator»
Пояснение: 在 PHP 7.0+ 中,包含 yield 的函数调用后返回的是 \Generator 对象,get_class() 会返回其类名 'Generator'。
Raw
{"answer": "Generator", "解释": "在 PHP 7.0+ 中,包含 yield 的函数调用后返回的是 \\Generator 对象,get_class() 会返回其类名 'Generator'。"}
верноФункция с yield возвращает Generator.
T11-L5
0.3 c
生成器、迭代器与 SPLcount(iterator_to_array((function () { yield from [1, 2, 3]; })())) 返回多少个元素?«3»
Пояснение: 生成器产出3个元素,iterator_to_array 将其转为数组,count 返回3
Raw
{"answer": 3, "解释": "生成器产出3个元素,iterator_to_array 将其转为数组,count 返回3"}
верноyield from делегирует все 3 элемента.
T11-L6
0.29 c
生成器、迭代器与 SPLSplStack 类实现的是 FIFO 队列。«否»
Пояснение: SplStack 实现的是 LIFO(后进先出)栈,而 SplQueue 实现的是 FIFO(先进先出)队列。
Raw
{"answer": "否", "解释": "SplStack 实现的是 LIFO(后进先出)栈,而 SplQueue 实现的是 FIFO(先进先出)队列。"}
верноSplStack — стек LIFO; очередь FIFO — SplQueue.
T11-L7
0.25 c
生成器、迭代器与 SPLArrayIterator 可以包装数组,并通过 Iterator 接口遍历它。«是»
Пояснение: ArrayIterator 类实现了 Iterator 接口,允许以对象方式遍历数组。
Raw
{"answer": "是", "解释": "ArrayIterator 类实现了 Iterator 接口,允许以对象方式遍历数组。"}
верноОбъектная обёртка над массивом.
T11-L8
0.21 c
生成器、迭代器与 SPLArrayObject 类的对象不能用 foreach 遍历。«否»
Пояснение: ArrayObject 实现了 Iterator 接口,支持 foreach 遍历。
Raw
{"answer": "否", "解释": "ArrayObject 实现了 Iterator 接口,支持 foreach 遍历。"}
верноArrayObject реализует IteratorAggregate — foreach по нему работает.
T12-L1
0.25 c
配置与安全password_hash() 会自动生成盐(salt)——不需要单独传盐。«是»
Пояснение: password_hash() 函数内部会自动生成随机盐并将其包含在返回的哈希字符串中。
Raw
{"answer": "是", "解释": "password_hash() 函数内部会自动生成随机盐并将其包含在返回的哈希字符串中。"}
верноСоль встраивается в строку результата; параметр salt устарел.
T12-L2
0.33 c
配置与安全在 PHP 8 中,PASSWORD_DEFAULT 算法是自动加盐的 md5。«否»
Пояснение: PASSWORD_DEFAULT 在 PHP 8 中默认使用 bcrypt 算法,它是自动加盐的且比 MD5 更安全。
Raw
{"answer": "否", "解释": "PASSWORD_DEFAULT 在 PHP 8 中默认使用 bcrypt 算法,它是自动加盐的且比 MD5 更安全。"}
верноPASSWORD_DEFAULT — bcrypt; md5 для паролей непригоден (перебирается массово).
T12-L3
0.21 c
配置与安全password_verify('secret', password_hash('secret', PASSWORD_DEFAULT)) 返回什么?«是»
Пояснение: password_verify 在密码匹配时返回 true。
Raw
{"answer": "是", "解释": "password_verify 在密码匹配时返回 true。"}
верноСоль и хеш в одной строке: true (форма ответа: true или да).
T12-L4
0.26 c
配置与安全strip_tags() 函数能防 SQL 注入。«否»
Пояснение: strip_tags() 用于移除 HTML 标签,无法防止 SQL 注入,需使用预处理语句或参数化查询。
Raw
{"answer": "否", "解释": "strip_tags() 用于移除 HTML 标签,无法防止 SQL 注入,需使用预处理语句或参数化查询。"}
верноstrip_tags режет HTML-теги (помощник против XSS), к параметризации SQL отношения не имеет.
T12-L5
0.41 c
配置与安全session_regenerate_id() 函数用于在用户登录时防范会话固定(session fixation)。«是»
Пояснение: session_regenerate_id() 通过生成新的会话ID并废弃旧ID,有效防止会话固定攻击,常用于登录成功后的安全加固。
Raw
{"answer": "是", "解释": "session_regenerate_id() 通过生成新的会话ID并废弃旧ID,有效防止会话固定攻击,常用于登录成功后的安全加固。"}
верноНовый ID сессии после логина — стандартная защита от session fixation.
T12-L6
0.29 c
配置与安全哪个内置函数返回 SAPI 的名称(例如 cli)?«php_sapi_name»
Пояснение: php_sapi_name() 用于返回当前 SAPI 的名称,如 cli、apache2handler 等。
Raw
{"answer": "php_sapi_name", "解释": "php_sapi_name() 用于返回当前 SAPI 的名称,如 cli、apache2handler 等。"}
верноphp_sapi_name().
T12-L7
0.44 c
配置与安全session_destroy() 删除服务器端的会话数据,但不会删除用户浏览器中的 cookie。«是»
Пояснение: session_destroy() 只删除服务器端的会话数据,而浏览器中的 session cookie 需要单独处理,通常需要使用 setcookie() 手动删除。
Raw
```json ⏎ { ⏎   "answer": "是", ⏎   "解释": "session_destroy() 只删除服务器端的会话数据,而浏览器中的 session cookie 需要单独处理,通常需要使用 setcookie() 手动删除。" ⏎ } ⏎ ```
верноУдаление cookie — отдельный шаг через setcookie с истёкшим сроком.
T12-L8
0.26 c
配置与安全不调用 session_start(),$_SESSION 数组也会自动加载会话数据。«否»
Пояснение: 必须调用 session_start() 才能加载或创建会话数据,否则 $_SESSION 为空。
Raw
{"answer": "否", "解释": "必须调用 session_start() 才能加载或创建会话数据,否则 $_SESSION 为空。"}
верноБез session_start() данные сессии в массив не загружаются ($_SESSION можно заполнить вручную, но привязки к сессии нет).
VC-L1
0.21 c
PHP 8.4–8.5函数 array_find() 是在哪个 PHP 版本中引入的?«8.0»
Пояснение: array_find() 函数是在 PHP 8.0 中引入的。
Raw
{"answer": "8.0", "解释": "array_find() 函数是在 PHP 8.0 中引入的。"}
неверно
верный: «8.4»
PHP 8.4 (RFC array_find).
VC-L2
0.31 c
PHP 8.4–8.5属性钩子(property hooks,直接在属性声明里写 get/set)进入了 PHP 8.4。«是»
Пояснение: PHP 8.4 引入了属性钩子(property hooks),允许在类中直接定义属性的 getter 和 setter。
Raw
{"answer": "是", "解释": "PHP 8.4 引入了属性钩子(property hooks),允许在类中直接定义属性的 getter 和 setter。"}
верноProperty hooks — PHP 8.4 (ноябрь 2024).
VC-L3
0.47 c
PHP 8.4–8.5非对称可见性(public private(set) string $name)出现在 PHP 8.4。«是»
Пояснение: PHP 8.4 引入了非对称可见性,允许将属性定义为 public,但将 set 方法设为 private,例如 `public private(set) string $name`。
Raw
```json ⏎ { ⏎   "answer": "是", ⏎   "解释": "PHP 8.4 引入了非对称可见性,允许将属性定义为 public,但将 set 方法设为 private,例如 `public private(set) string $name`。" ⏎ } ⏎ ```
верноAsymmetric visibility v2 — PHP 8.4.
VC-L4
0.37 c
PHP 8.4–8.5属性 #[\NoDiscard] 最早出现在哪个 PHP 版本?请回答版本号。«8.2»
Пояснение: PHP 8.2 引入了 NoDiscard 属性,用于标记函数调用时其返回值不应被丢弃。
Raw
{"answer": "8.2", "解释": "PHP 8.2 引入了 NoDiscard 属性,用于标记函数调用时其返回值不应被丢弃。"}
неверно
верный: «8.5»
#[\NoDiscard] — PHP 8.5 (marking return values as important).
VC-L5
0.23 c
PHP 8.4–8.5管道运算符 |> 最早出现在哪个 PHP 版本?请回答版本号。«8.1»
Пояснение: PHP 8.1 引入了管道运算符。
Raw
{"answer": "8.1", "解释": "PHP 8.1 引入了管道运算符。"}
неверно
верный: «8.5»
Pipe operator — PHP 8.5 (2025).
VC-L6
0.3 c
PHP 8.4–8.5clone-with 语法 clone($obj, ['x' => 1]) 是在哪个 PHP 版本中出现的?请回答版本号。«8.4»
Пояснение: clone with 语法(clone with object)是在 PHP 8.4 中引入的。
Raw
{"answer": "8.4", "解释": "clone with 语法(clone with object)是在 PHP 8.4 中引入的。"}
неверно
верный: «8.5»
Clone with v2 — PHP 8.5.
VC-L7
0.28 c
PHP 8.4–8.5函数 array_first() 和 array_last() 是在哪个 PHP 版本中引入的?«php 8.4»
Пояснение: array_first() 和 array_last() 函数是在 PHP 8.4 版本中引入的。
Raw
{"answer": "PHP 8.4", "解释": "array_first() 和 array_last() 函数是在 PHP 8.4 版本中引入的。"}
неверно
верный: «8.5»
PHP 8.5.
VC-L8
0.3 c
PHP 8.4–8.5截至 2026-11-07,RFC Partial Function Application v2 被接受进入哪个 PHP 版本?请回答版本号。«php 8.4»
Пояснение: RFC Partial Function Application (PFA) v2 已被接受进入 PHP 8.4。
Raw
{"answer": "PHP 8.4", "解释": "RFC Partial Function Application (PFA) v2 已被接受进入 PHP 8.4。"}
неверно
верный: «8.6»
PFA v2 принят 05.12.2025 (33-0-0), реализован в PHP 8.6.
VF-L1
0.38 c
PHP:8.6+ 与未来截至 2026-11-07,RFC clamp_v2(函数 clamp())在哪个 PHP 版本中实现?请回答版本号。«8.4»
Пояснение: PHP 8.4.0 引入了新的内置函数 clamp(),用于在最小值和最大值之间限制一个值。
Raw
{"answer": "8.4", "解释": "PHP 8.4.0 引入了新的内置函数 clamp(),用于在最小值和最大值之间限制一个值。"}
неверно
верный: «8.6»
По данным владельца (wiki.php.net/rfc): clamp_v2 — 8.6; clamp() в 8.5.11 отсутствует (косвенное подтверждение). Дата-якорь делает клетку монотонной.
VF-L2
0.3 c
PHP:8.6+ 与未来截至 2026-11-07,RFC Context Managers v2 已被 PHP 接受。«否»
Пояснение: 截至 2026-11-07,PHP 尚未接受 RFC Context Managers v2。
Raw
```json ⏎ {"answer": "否", "解释": "截至 2026-11-07,PHP 尚未接受 RFC Context Managers v2。"} ⏎ ```
верноНа 06.11.2026 — в обсуждении (создан 2026-10-23); не принят.
VF-L3
0.25 c
PHP:8.6+ 与未来RFC Bound-Erased Generic Types(泛型)已于 2026 年被拒绝。«是»
Пояснение: PHP RFC Bound-Erased Generic Types 已于 2026 年被拒绝。
Raw
{"answer": "是", "解释": "PHP RFC Bound-Erased Generic Types 已于 2026 年被拒绝。"}
верноГолосование завершилось 2026-06-28: отклонён (wiki.php.net/rfc).
VF-L4
0.4 c
PHP:8.6+ 与未来截至 2026-11-07,默认启用多线程(ZTS)的 RFC 已在 PHP 中被接受。«是»
Пояснение: PHP 8.3 版本中,ZTS(多线程)构建已成为官方推荐的默认构建方式,并逐步取代 NTS。
Raw
{"answer": "是", "解释": "PHP 8.3 版本中,ZTS(多线程)构建已成为官方推荐的默认构建方式,并逐步取代 NTS。"}
неверно
верный: «否»
Такого принятого RFC нет на дату якоря; якорь делает клетку монотонной — при принятии RFC позже клетка не перевернётся.
VF-L5
0.6 c
PHP:8.6+ 与未来PHP 8.5 仍然没有泛型(参数化类型)。«是»
Пояснение: PHP 核心语言至今(含 PHP 8.5)尚未实现真正的泛型类型系统,尽管社区已有相关提案(如 RFC: Generic Classes),但仍未被采纳为语言特性。
Raw
{"answer": "是", "解释": "PHP 核心语言至今(含 PHP 8.5)尚未实现真正的泛型类型系统,尽管社区已有相关提案(如 RFC: Generic Classes),但仍未被采纳为语言特性。"}
верноGenerics в PHP отсутствуют; отрицательный контроль (не путать с C#/Java).
VF-L6
0.42 c
PHP:8.6+ 与未来截至 2026-11-07,PHP 的最新稳定版本是 8.5,PHP 8.6 尚未发布(GA 为 2026-11-19)。«否»
Пояснение: PHP 8.5 尚未正式发布,PHP 8.4 是当前(截至2024)最新稳定版。
Raw
{"answer": "否", "解释": "PHP 8.5 尚未正式发布,PHP 8.4 是当前(截至2024)最新稳定版。"}
неверно
верный: «是»
8.5 — релиз осени 2025; 8.6 GA 19.11.2026 (wiki.php.net/todo/php86). Дата снимка — 06.11.2026.
VF-L7
0.31 c
PHP:8.6+ 与未来PHP 6 分支从未发布:PHP 5.6 之后直接就是 PHP 7.0。«是»
Пояснение: PHP 5.6 之后确实是 PHP 7.0,不存在 PHP 6。
Raw
{"answer": "是", "解释": "PHP 5.6 之后确实是 PHP 7.0,不存在 PHP 6。"}
верноИсторический факт: ветка 6 не была релизнута.
VF-L8
0.33 c
PHP:8.6+ 与未来向核心添加 #[\Deprecated] 属性的 RFC 已被接受。«是»
Пояснение: PHP RFC 已接受添加 #\[Deprecated] 属性以标记代码为弃用。
Raw
{"answer": "是", "解释": "PHP RFC 已接受添加 #\\[Deprecated] 属性以标记代码为弃用。"}
верно#[\Deprecated] — принят, реализован в PHP 8.4.
T25-L1
0.6 c
整洁架构整洁架构与洋葱架构的依赖规则:内层对外层一无所知——依赖指向中心。«是»
Пояснение: 整洁架构(Clean Architecture)和洋葱架构(Onion Architecture)的核心原则之一就是依赖规则(Dependency Rule):所有代码依赖都指向内层,内层(领域/业务逻辑)不知道外层的存在(如数据库、框架、UI 等),而外层可以依赖内层。
Raw
{"answer": "是", "解释": "整洁架构(Clean Architecture)和洋葱架构(Onion Architecture)的核心原则之一就是依赖规则(Dependency Rule):所有代码依赖都指向内层,内层(领域/业务逻辑)不知道外层的存在(如数据库、框架、UI 等),而外层可以依赖内层。"}
верноЧистая (Robert C. Martin), луковичная (Jeffrey Palermo) и гексагональная (ports & adapters) — варианты одной идеи: зависимости направлены внутрь, к домену. Слоями в проекте следит deptrac.
T25-L2
0.43 c
整洁架构领域实体既不导入 Doctrine 也不导入 Symfony——只用语言本身(最多加标准库)。«是»
Пояснение: 遵循分层架构原则,领域层(Domain Layer)应保持纯净,不依赖框架或 ORM,以确保核心业务逻辑的独立性和可测试性。
Raw
{"answer": "是", "解释": "遵循分层架构原则,领域层(Domain Layer)应保持纯净,不依赖框架或 ORM,以确保核心业务逻辑的独立性和可测试性。"}
верноИзоляция домена от инфраструктуры; deptrac в проекте как раз следит за слоями.
T25-L3
0.37 c
整洁架构控制器和 Twig 模板属于业务逻辑层,因为是它们调用用例。«否»
Пояснение: 控制器和模板属于表现层(UI 层),负责处理 HTTP 请求/响应及视图渲染,而非业务逻辑层。
Raw
{"answer": "否", "解释": "控制器和模板属于表现层(UI 层),负责处理 HTTP 请求/响应及视图渲染,而非业务逻辑层。"}
верноНаоборот: это интерфейсные адаптеры (внешний слой); они зависят от use cases, а не наоборот.
T25-L4
0.26 c
整洁架构洋葱架构的最中心是什么?«实体»
Пояснение: 洋葱架构最中心是定义业务规则的实体(Entities)
Raw
{"answer": "实体", "解释": "洋葱架构最中心是定义业务规则的实体(Entities)"}
неверно
верный: «domain model»
Центральное кольцо — Domain Model: сущности и бизнес-правила без зависимостей; далее Domain Services → Application Services → Infrastructure/UI/Tests (Palermo).
T25-L5
0.35 c
整洁架构层边界的破坏可以自动捕获:层间依赖分析器(如 deptrac)会在出现禁止的调用时报错。«是»
Пояснение: deptrac 等工具通过分析代码依赖关系,能够在构建或测试阶段自动检测并报告违反分层架构规则的调用。
Raw
{"answer": "是", "解释": "deptrac 等工具通过分析代码依赖关系,能够在构建或测试阶段自动检测并报告违反分层架构规则的调用。"}
верноdepfile.yaml в проекте TasK: CI проверяет правила слоёв на каждом пайплайне.
T25-L6
0.39 c
整洁架构用例(interactor)可以接受 HTTP 请求或 EntityManager 作为参数——这样更简单。«否»
Пояснение: 用例应依赖抽象服务或仓储接口,而非具体的 HTTP 请求或 EntityManager,以保持高内聚低耦合。
Raw
{"answer": "否", "解释": "用例应依赖抽象服务或仓储接口,而非具体的 HTTP 请求或 EntityManager,以保持高内聚低耦合。"}
верноUse case принимает DTO и порты; привязка к HTTP/ORM протекает инфраструктуру во внутренние слои.
T25-L7
0.34 c
整洁架构在接口背后隐藏存储机制、并提供聚合/实体集合的组件叫什么?«仓储(repository)»
Пояснение: 仓储模式用于解耦业务逻辑与数据存储,提供统一的集合访问接口。
Raw
{"answer": "仓储(Repository)", "解释": "仓储模式用于解耦业务逻辑与数据存储,提供统一的集合访问接口。"}
верноRepository pattern (DDD/Evans); в проекте — Doctrine-репозитории за портами.
T25-L8
0.39 c
整洁架构在整洁架构中,把 PostgreSQL 换成其他数据库只会影响外层——领域和用例保持不变。«是»
Пояснение: 整洁架构通过依赖反转和接口抽象解耦领域与基础设施,更换数据库仅需修改外层适配器代码。
Raw
{"answer": "是", "解释": "整洁架构通过依赖反转和接口抽象解耦领域与基础设施,更换数据库仅需修改外层适配器代码。"}
верноСледствие правила зависимостей: инфраструктура взаимозаменяема.
T26-L1
0.31 c
DDD在 DDD 中,聚合(aggregate)只是数据库表的另一个名字。«否»
Пояснение: 聚合是DDD中的业务边界概念,用于保证数据一致性,并非简单的数据库表映射。
Raw
{"answer": "否", "解释": "聚合是DDD中的业务边界概念,用于保证数据一致性,并非简单的数据库表映射。"}
верноАгрегат — кластер объектов с границей согласованности (транзакционной вокруг корня); таблица — деталь хранения.
T26-L2
0.33 c
DDD值对象(Value Object)不可变,按字段值比较,而不是按标识符。«是»
Пояснение: 值对象的核心特征是不可变性以及基于字段值的相等性判断,而非基于对象标识符。
Raw
{"answer": "是", "解释": "值对象的核心特征是不可变性以及基于字段值的相等性判断,而非基于对象标识符。"}
верноКлассика Evans: Money, Email; равенство структурное.
T26-L3
0.37 c
DDD聚合的唯一外部入口——所有变更必须经过它——叫什么?«command handler»
Пояснение: 在 CQRS/ES 架构中,Command Handler 是处理意图(Command)并执行聚合根变更的唯一外部入口。
Raw
{"answer": "Command Handler", "解释": "在 CQRS/ES 架构中,Command Handler 是处理意图(Command)并执行聚合根变更的唯一外部入口。"}
неверно
верный: «aggregate root»
Aggregate Root: внешние объекты ссылаются только на корень; он защищает инварианты агрегата.
T26-L4
0.29 c
DDD在 DDD 中,仓储是针对聚合(其根)声明的,而不是针对每个实体。«是»
Пояснение: 仓储模式是针对聚合根设计的,而非单个实体,以确保聚合的一致性和完整性。
Raw
{"answer": "是", "解释": "仓储模式是针对聚合根设计的,而非单个实体,以确保聚合的一致性和完整性。"}
верноРепозиторий корня хранит границу согласованности агрегата; вложенные сущности доступны только через корень.
T26-L5
0.35 c
DDD统一语言(ubiquitous language)是开发者和领域专家共享的模型语言。«是»
Пояснение: 统一语言旨在弥合业务与技术鸿沟,确保术语在模型、代码和文档中一致。
Raw
{"answer": "是", "解释": "统一语言旨在弥合业务与技术鸿沟,确保术语在模型、代码和文档中一致。"}
верноEvans: язык из требований переходит в имена классов и методов.
T26-L6
0.91 c
DDD哪种边界内部模型和语言一致,而边界外同样的词对应别的模型?«词»
Пояснение: 在自然语言处理中,通常以“词”为基本单位(边界),词内部符合某种语言模型(如内部连贯),而跨越词边界时(如词与词之间),其关系由另一个模型(如搭配模型或跨词模型)处理。不过,更准确的术语可能是“词”作为边界单位。
Raw
{"answer": "词", "解释": "在自然语言处理中,通常以“词”为基本单位(边界),词内部符合某种语言模型(如内部连贯),而跨越词边界时(如词与词之间),其关系由另一个模型(如搭配模型或跨词模型)处理。不过,更准确的术语可能是“词”作为边界单位。"}
неверно
верный: «bounded context»
Bounded Context; «Заказ» в биллинге и в доставке — разные модели.
T26-L7
0.37 c
DDD贫血模型(只有 getter/setter,逻辑全在服务里)是 DDD 推荐的风格。«否»
Пояснение: DDD 推荐使用充血模型,将业务逻辑封装在实体或聚合根中,而非仅靠 Getter/Setter 和外部服务。
Raw
{"answer": "否", "解释": "DDD 推荐使用充血模型,将业务逻辑封装在实体或聚合根中,而非仅靠 Getter/Setter 和外部服务。"}
верноНаоборот: Evans называет анемичность антипаттерном — поведение должно жить в доменных объектах.
T26-L8
0.37 c
DDD限界上下文意味着每个上下文都有自己的模型:同一个概念在不同上下文中是不同的类。«是»
Пояснение: 限界上下文的核心原则之一:同一概念在不同上下文可以有不同模型与实现。
Raw
```json ⏎ {"answer": "是", "解释": "限界上下文的核心原则之一:同一概念在不同上下文可以有不同模型与实现。"} ⏎ ```
верноМодели контекстов независимы; между ними — явная интеграция (ACL, published language).
T13-L1
0.54 c
SymfonySymfony 的 DI 容器中的服务默认是惰性创建的——在首次使用时才实例化。«否»
Пояснение: Symfony 容器默认是单例模式(Singleton),在首次获取时实例化并保持存活,而非每次使用都惰性创建新实例(除非明确配置为 Prototype)。
Raw
{"answer": "否", "解释": "Symfony 容器默认是单例模式(Singleton),在首次获取时实例化并保持存活,而非每次使用都惰性创建新实例(除非明确配置为 Prototype)。"}
неверно
верный: «是»
Контейнер инстанцирует сервис при первом извлечении; eager-создания по умолчанию нет.
T13-L2
0.33 c
SymfonySymfony 的哪条控制台命令会列出所有已注册的路由?«bin/console debug:router»
Пояснение: Symfony 中列出已注册路由的常用命令是 bin/console debug:router。
Raw
{"answer": "bin/console debug:router", "解释": "Symfony 中列出已注册路由的常用命令是 bin/console debug:router。"}
верноbin/console debug:router (FrameworkBundle); в Symfony 3 команда называлась router:debug.
T13-L3
0.33 c
SymfonySymfony 的自动装配(autowiring)需要在 services.yaml 中手动声明每一个服务。«否»
Пояснение: Symfony 的自动装配允许通过类型提示自动解析依赖,无需为每个服务手动声明完整的配置。
Raw
{"answer": "否", "解释": "Symfony 的自动装配允许通过类型提示自动解析依赖,无需为每个服务手动声明完整的配置。"}
верноAutowire+autoconfigure регистрируют и связывают сервисы автоматически; ручное перечисление — исключение.
T13-L4
0.29 c
SymfonyTwig 模板会编译成 PHP 类并在请求之间缓存。«是»
Пояснение: Twig 会将模板预编译为 PHP 类,并在请求之间缓存以提高性能。
Raw
```json ⏎ { ⏎   "answer": "是", ⏎   "解释": "Twig 会将模板预编译为 PHP 类,并在请求之间缓存以提高性能。" ⏎ } ⏎ ```
верноTwig компилирует шаблон один раз; кэш в var/cache/twig, в prod не пересобирается.
T13-L5
0.86 c
Symfony在 Symfony 的 dev 环境中,DI 容器只在被跟踪的文件变化后重建,而不是每个请求都重建。«否»
Пояснение: Symfony 的 dev 环境中,DI 容器在检测到变更时会重建,但并非每个请求都重建;然而,'只在被跟踪的文件变化后重建' 这一说法基本正确,但更准确地说,Symfony 在每次请求中都会检查缓存是否有效,如果有效则直接使用,而不是重建。因此,'不是每个请求都重建' 是正确的,但 '只在被跟踪的文件变化后重建' 也正确。综合来看,该陈述整体上是正确的。
Raw
{"answer": "否", "解释": "Symfony 的 dev 环境中,DI 容器在检测到变更时会重建,但并非每个请求都重建;然而,'只在被跟踪的文件变化后重建' 这一说法基本正确,但更准确地说,Symfony 在每次请求中都会检查缓存是否有效,如果有效则直接使用,而不是重建。因此,'不是每个请求都重建' 是正确的,但 '只在被跟踪的文件变化后重建' 也正确。综合来看,该陈述整体上是正确的。"}
неверно
верный: «是»
Kernel проверяет freshness ресурсов (конфиги, классы); иначе переиспользуется кэш контейнера.
T13-L6
0.27 c
Symfony哪个环境变量决定 Symfony 的活动环境(dev/prod)?«app_env»
Пояснение: Symfony 使用 APP_ENV 环境变量来指定当前运行的环境(如 dev 或 prod)。
Raw
{"answer": "APP_ENV", "解释": "Symfony 使用 APP_ENV 环境变量来指定当前运行的环境(如 dev 或 prod)。"}
верноAPP_ENV в .env; APP_DEBUG — отдельный флаг отладки.
T13-L7
0.29 c
Symfony控制器方法可以是 private——Symfony 的路由对类中的任何方法都有效。«否»
Пояснение: Symfony 控制器方法必须是 public 才能通过 HTTP 路由访问。
Raw
{"answer": "否", "解释": "Symfony 控制器方法必须是 public 才能通过 HTTP 路由访问。"}
верноДействие контроллера должно быть public; приватный метод по маршруту не вызывается.
T13-L8
0.31 c
Symfony事件订阅者(EventSubscriber)总是比监听器(listener)更早收到事件,因为接口赋予它们优先级。«否»
Пояснение: 事件订阅者和监听器都支持优先级设置,事件订阅者并不总是比监听器更早收到事件。
Raw
{"answer": "否", "解释": "事件订阅者和监听器都支持优先级设置,事件订阅者并不总是比监听器更早收到事件。"}
верноПорядок определяет priority, а не тип подписки; приоритеты задаются в getSubscribedEvents() так же, как у слушателей.
T22-L1
0.4 c
Symfony:安全与表单在现代 Symfony(6.0+)中,认证基于 authenticator 类(AuthenticatorInterface);旧的 guard 体系已被移除。«是»
Пояснение: Symfony 5.3 引入新认证系统,Symfony 6.0 正式移除了旧的 Guard 体系,认证现基于 AuthenticatorInterface。
Raw
{"answer": "是", "解释": "Symfony 5.3 引入新认证系统,Symfony 6.0 正式移除了旧的 Guard 体系,认证现基于 AuthenticatorInterface。"}
верноGuard объявлен устаревшим в 5.3 и удалён в 6.0; в проекте symfony/security-bundle 8.1.
T22-L2
0.3 c
Symfony:安全与表单Symfony 的哪个属性直接在控制器方法上检查角色/权限(没有它就返回 403)?«isgranted»
Пояснение: Symfony 使用 #[IsGranted] 属性直接在控制器方法上检查角色或权限,若无权限则返回 403。
Raw
{"answer": "IsGranted", "解释": "Symfony 使用 #[IsGranted] 属性直接在控制器方法上检查角色或权限,若无权限则返回 403。"}
верно#[IsGranted('ROLE_ADMIN')]; атрибут из symfony/security-http.
T22-L3
0.49 c
Symfony:安全与表单Voter(投票者)是 Symfony 检查对具体对象访问权的机制:isGranted('EDIT', $post)。«是»
Пояснение: Voter 是 Symfony 中用于定义和检查对具体实体对象(如 $post)是否具有特定权限(如 EDIT)的机制,通常通过 Security::isGranted 方法调用。
Raw
{"answer": "是", "解释": "Voter 是 Symfony 中用于定义和检查对具体实体对象(如 $post)是否具有特定权限(如 EDIT)的机制,通常通过 Security::isGranted 方法调用。"}
верноVoterInterface->vote(); docs Symfony — Voters.
T22-L4
0.36 c
Symfony:安全与表单在现代 Symfony(7+)中,验证约束用 PHP 属性声明(#[Assert\NotBlank]);不再支持 doctrine 注解。«是»
Пояснение: Symfony 7+ 使用 PHP 原生属性(Attributes)替代 Doctrine 注解,旧注解已不再受支持。
Raw
{"answer": "是", "解释": "Symfony 7+ 使用 PHP 原生属性(Attributes)替代 Doctrine 注解,旧注解已不再受支持。"}
верноДокблок-аннотации удалены в Symfony 7.0; стандарт — атрибуты. В проекте symfony/validator 8.1.
T22-L5
0.35 c
Symfony:安全与表单Symfony 表单的 CSRF 保护默认开启:表单在提交时会校验令牌。«是»
Пояснение: Symfony 的表单系统默认启用 CSRF 保护,确保表单在提交时校验 CSRF 令牌。
Raw
```json ⏎ {"answer": "是", "解释": "Symfony 的表单系统默认启用 CSRF 保护,确保表单在提交时校验 CSRF 令牌。"} ⏎ ```
верноFormType добавляет скрытое поле _token и проверяет его при валидации; отключение — осознанное исключение (csrf: false).
T22-L6
0.29 c
Symfony:安全与表单Symfony 的表单验证在服务器端执行,即使客户端(HTML5)检查已经通过。«是»
Пояснение: 服务器端验证是确保数据完整性和安全的最终防线,不依赖客户端。
Raw
{"answer": "是", "解释": "服务器端验证是确保数据完整性和安全的最终防线,不依赖客户端。"}
верноКлиентская валидация — только удобство; серверная обязательна и идёт по метаданным объекта формы.
T22-L7
0.23 c
Symfony:安全与表单Symfony maker 的哪条命令会生成表单类(FormType)?«make:form»
Пояснение: make:form 命令用于生成 Symfony 表单类(FormType)
Raw
{"answer": "make:form", "解释": "make:form 命令用于生成 Symfony 表单类(FormType)"}
верноbin/console make:form (symfony/maker-bundle — в проекте).
T22-L8
0.33 c
Symfony:安全与表单Symfony 以明文形式把用户密码存在会话中。«否»
Пояснение: Symfony 使用哈希算法(如 bcrypt)加密密码,不会以明文形式存储。
Raw
```json ⏎ {"answer": "否", "解释": "Symfony 使用哈希算法(如 bcrypt)加密密码,不会以明文形式存储。"} ⏎ ```
верноВ сессии живёт объект пользователя в токене; хеш затирается eraseCredentials(), plaintext там никогда не лежит.
T23-L1
0.47 c
Symfony:配置与服务Symfony 的 bundle 配置放在 config/packages 中——每个 bundle 或主题一个文件。«是»
Пояснение: Symfony 现代版本(如 4.x 和 5.x)确实推荐将配置拆分为多个文件放在 config/packages 目录下,通常每个 bundle 或功能主题对应一个文件。
Raw
{"answer": "是", "解释": "Symfony 现代版本(如 4.x 和 5.x)确实推荐将配置拆分为多个文件放在 config/packages 目录下,通常每个 bundle 或功能主题对应一个文件。"}
верноСтандартная структура (config/packages/*.yaml); перегрузка — config/packages/<env>.
T23-L2
0.37 c
Symfony:配置与服务包含开发默认值的 .env 文件会提交到仓库,而真正的机密放在不提交的 .env.local 中。«是»
Пояснение: 这是常见且推荐的做法,.env 包含默认配置并提交,.env.local 存放本地或敏感配置且不提交。
Raw
{"answer": "是", "解释": "这是常见且推荐的做法,.env 包含默认配置并提交,.env.local 存放本地或敏感配置且不提交。"}
верноsymfony/dotenv: .env — общий безопасный набор значений; локальные секреты — .env.local (gitignored) или secrets-хранилище.
T23-L3
0.27 c
Symfony:配置与服务Symfony 的哪条命令会列出容器中注册的服务及其别名?«debug:container»
Пояснение: Symfony 使用 debug:container 命令查看容器中注册的服务及其别名。
Raw
{"answer": "debug:container", "解释": "Symfony 使用 debug:container 命令查看容器中注册的服务及其别名。"}
верноbin/console debug:container; параметры контейнера — debug:parameter.
T23-L4
0.41 c
Symfony:配置与服务Symfony 容器允许在运行时修改参数:$container->setParameter() 可以在控制器中使用。«是»
Пояснение: 虽然通常不推荐,但在Symfony容器的设计层面,确实可以在运行时通过$container->setParameter()方法修改参数。
Raw
```json ⏎ {"answer": "是", "解释": "虽然通常不推荐,但在Symfony容器的设计层面,确实可以在运行时通过$container->setParameter()方法修改参数。"} ⏎ ```
неверно
верный: «否»
Контейнер компилируется и замораживается; runtime-значения — только через переменные окружения.
T23-L5
0.28 c
Symfony:配置与服务默认情况下,Symfony 的服务是公开的(public: true)——可以直接从容器中获取。«否»
Пояснение: 默认情况下 Symfony 服务是私有的(public: false),需要显式设置为 public 才能直接从容器获取。
Raw
{"answer": "否", "解释": "默认情况下 Symfony 服务是私有的(public: false),需要显式设置为 public 才能直接从容器获取。"}
верноС Symfony 4.0 сервисы по умолчанию private: инжектятся через autowiring; $container->get() — только для публичных.
T23-L6
0.49 c
Symfony:配置与服务如果 config/packages 里没有配置文件,bundle 就无法工作——每个 bundle 都必须有配置。«否»
Пояснение: Symfony Bundle 可以包含默认配置(如 Resources/config 下的配置)或完全不需要用户配置,config/packages 中的文件主要用于覆盖或自定义默认设置。
Raw
{"answer": "否", "解释": "Symfony Bundle 可以包含默认配置(如 Resources/config 下的配置)或完全不需要用户配置,config/packages 中的文件主要用于覆盖或自定义默认设置。"}
верноУ бандлов есть встроенные умолчания (Extension); конфиг нужен только для отклонений от них.
T23-L7
0.27 c
Symfony:配置与服务环境变量的值可以通过 %env(VAR)% 语法注入 services.yaml。«是»
Пояснение: 在 Symfony 中,%env(VAR)% 是标准的注入环境变量语法。
Raw
{"answer": "是", "解释": "在 Symfony 中,%env(VAR)% 是标准的注入环境变量语法。"}
верно%env(...)% резолвится в рантайме env-процессорами; docs — Env Var Processors.
T23-L8
0.26 c
Symfony:配置与服务Symfony 的哪个环境变量会开启调试模式(影响 profiler 和 Twig 调试)?«app_debug»
Пояснение: Symfony 中使用 APP_DEBUG 环境变量控制调试模式,影响 profiler 和 Twig 调试。
Raw
{"answer": "APP_DEBUG", "解释": "Symfony 中使用 APP_DEBUG 环境变量控制调试模式,影响 profiler 和 Twig 调试。"}
верноAPP_DEBUG=1 (в .env dev-окружения); окружение выбирает APP_ENV — см. T13-L6.
T16-L1
0.35 c
Symfony:Messenger在 Symfony Messenger 中,一条消息只能有一个处理者(handler)。«否»
Пояснение: Symfony Messenger 支持通过不同的处理器链来处理同一条消息。
Raw
```json ⏎ {"answer": "否", "解释": "Symfony Messenger 支持通过不同的处理器链来处理同一条消息。"} ⏎ ```
верноMessenger вызывает все хендлеры, подписанные на класс сообщения (docs — Multiple Handlers).
T16-L2
0.47 c
Symfony:MessengerMessenger 的 sync 传输会把消息放进队列交给 worker 处理,和 async 一样。«是»
Пояснение: sync 和 async 都通过消息队列(如 Redis)将消息交由独立的 worker 进程处理,区别仅在于发送端是阻塞等待结果还是立即返回。
Raw
{"answer": "是", "解释": "sync 和 async 都通过消息队列(如 Redis)将消息交由独立的 worker 进程处理,区别仅在于发送端是阻塞等待结果还是立即返回。"}
неверно
верный: «否»
Наоборот: sync обрабатывает немедленно в том же процессе, что и отправка; очередь — это async-транспорт.
T16-L3
0.25 c
Symfony:Messenger哪条控制台命令会启动处理 Messenger 队列消息的 worker?«bin/console messenger:consume»
Пояснение: Symfony Messenger 使用该命令启动消费队列消息的 worker。
Raw
{"answer": "bin/console messenger:consume", "解释": "Symfony Messenger 使用该命令启动消费队列消息的 worker。"}
верноbin/console messenger:consume async; воркеры под supervisord/systemd в проде.
T16-L4
0.31 c
Symfony:Messenger失败消息的重试策略(retry_strategy)在 Messenger 传输层面配置。«否»
Пояснение: 重试策略是在消息头(Message Header)中定义,而非在 Messenger 传输(Transport)层面配置。
Raw
{"answer": "否", "解释": "重试策略是在消息头(Message Header)中定义,而非在 Messenger 传输(Transport)层面配置。"}
неверно
верный: «是»
retry_strategy на транспорте: max_retries, delay, multiplier; docs — Failed Messages & Retries.
T16-L5
0.21 c
Symfony:Messenger默认情况下,Messenger 会把消息序列化为 JSON。«是»
Пояснение: PHP Symfony Messenger 默认使用 JSON 序列化器。
Raw
{"answer": "是", "解释": "PHP Symfony Messenger 默认使用 JSON 序列化器。"}
неверно
верный: «否»
Дефолтный сериализатор — PhpSerializer (serialize()); JSON-сериализатор включается отдельно.
T16-L6
0.27 c
Symfony:MessengerSymfony Scheduler 按计划产生消息,并通过 Messenger 发送。«是»
Пояснение: Symfony Scheduler 可以生成任务,这些任务可以通过 Messenger 组件异步处理。
Raw
{"answer": "是", "解释": "Symfony Scheduler 可以生成任务,这些任务可以通过 Messenger 组件异步处理。"}
верноSchedule → RecurringMessage → шина Messenger; docs — Scheduler.
T16-L7
0.25 c
Symfony:Messenger哪个内置的 Messenger 传输通过 Doctrine 把消息存到数据库表中?«doctrine»
Пояснение: Symfony Messenger 的 doctrine 传输使用 Doctrine 将消息持久化到数据库中。
Raw
{"answer": "doctrine", "解释": "Symfony Messenger 的 doctrine 传输使用 Doctrine 将消息持久化到数据库中。"}
верноТранспорт doctrine (symfony/doctrine-messenger); таблица messenger_messages. В проекте стоит amqp-messenger + doctrine-messenger.
T16-L8
0.29 c
Symfony:MessengerMessenger 的管道可以用自定义 middleware 扩展,放在内置中间件之前或之后。«是»
Пояснение: Messenger 管道支持在内置中间件前后插入自定义中间件,以实现灵活的消息处理逻辑。
Raw
{"answer": "是", "解释": "Messenger 管道支持在内置中间件前后插入自定义中间件,以实现灵活的消息处理逻辑。"}
верноmessenger.bus.*.middleware в yaml; docs — Middleware.
T28-L1
0.39 c
Symfony:版本Symfony 的主版本每两年发布一次,次版本每六个月一次(5 月和 11 月)。«是»
Пояснение: Symfony 主版本每年发布一次,次版本每半年发布一次(2 月和 8 月),但题目中“每两年发布一次主版本”的说法是错误的。
Raw
{"answer": "是", "解释": "Symfony 主版本每年发布一次,次版本每半年发布一次(2 月和 8 月),但题目中“每两年发布一次主版本”的说法是错误的。"}
верноСтандартный релизный цикл: 8.0 — ноябрь 2025, 8.1 — май 2026, 8.2 — ноябрь 2026.
T28-L2
0.21 c
Symfony:版本Symfony 8 要求的最低 PHP 版本是多少?«8.2»
Пояснение: Symfony 8 要求 PHP 8.2 或更高版本。
Raw
{"answer": "8.2", "解释": "Symfony 8 要求 PHP 8.2 或更高版本。"}
неверно
верный: «8.4»
Symfony 8.0 поднял требование до PHP >= 8.4.1 (в vendor проекта: "php": ">=8.4.1").
T28-L3
0.37 c
Symfony:版本Symfony 7.0 保留了对文档块注解(验证、路由)的支持。«否»
Пояснение: Symfony 7.0 移除了对基于注解(Docblock)的验证和路由支持,仅保留属性(Attributes)。
Raw
{"answer": "否", "解释": "Symfony 7.0 移除了对基于注解(Docblock)的验证和路由支持,仅保留属性(Attributes)。"}
верноНаоборот: в 7.0 аннотации удалены — только PHP-атрибуты (#[Route], #[Assert\NotBlank]).
T28-L4
0.29 c
Symfony:版本AssetMapper 无需 node 和 webpack 即可管理 CSS/JS——通过 importmap.php。«是»
Пояснение: AssetMapper 使用 importmap.php 管理资源,不强制依赖 Node.js 或 Webpack。
Raw
{"answer": "是", "解释": "AssetMapper 使用 importmap.php 管理资源,不强制依赖 Node.js 或 Webpack。"}
верноsymfony/asset-mapper (с 6.3, стандарт с 7.x); в проекте — importmap.php в корне и asset-mapper 8.1.
T28-L5
0.21 c
Symfony:版本Symfony 6.4 是没有长期支持的普通版本。«否»
Пояснение: Symfony 6.4 是 LTS(长期支持)版本。
Raw
{"answer": "否", "解释": "Symfony 6.4 是 LTS(长期支持)版本。"}
верноНаоборот: 6.4 — LTS (расширенная поддержка); LTS выходит вместе с очередным мажором (6.4 — вместе с 7.0).
T28-L6
0.37 c
Symfony:版本升级到新的 Symfony 主版本时,上一分支的弃用功能仍然可用——主版本不会移除它们。«否»
Пояснение: Symfony 遵循语义化版本控制,主要版本升级会移除在之前版本中被标记为弃用的功能。
Raw
{"answer": "否", "解释": "Symfony 遵循语义化版本控制,主要版本升级会移除在之前版本中被标记为弃用的功能。"}
верноНаоборот: мажорный релиз удаляет всё устаревшее (7.0 убрал деприкейшены 6.x, 8.0 — 7.x).
T28-L7
0.31 c
Symfony:版本Symfony 的每个主版本都附带列出变更的 UPGRADE 指南。«是»
Пояснение: Symfony 每个主版本发布时确实会提供 UPGRADE 指南以说明变更。
Raw
{"answer": "是", "解释": "Symfony 每个主版本发布时确实会提供 UPGRADE 指南以说明变更。"}
верноUPGRADE-7.0.md, UPGRADE-8.0.md в репозитории symfony/symfony.
T28-L8
0.43 c
Symfony:版本Symfony 的哪个组件在没有 node/webpack 的情况下管理资源和 importmap?«assetmapper»
Пояснение: Symfony Asset Mapper 组件通过配置和缓存机制管理资产,无需依赖 Node.js 或 Webpack 即可处理 importmap。
Raw
{"answer": "AssetMapper", "解释": "Symfony Asset Mapper 组件通过配置和缓存机制管理资产,无需依赖 Node.js 或 Webpack 即可处理 importmap。"}
верноsymfony/asset-mapper 8.1 — в проекте.
T29-L1
0.69 c
Symfony:8.2 与未来截至 2026-11-07,Symfony 8.2 已经发布。«否»
Пояснение: 截至 2026-11-07,Symfony 8.2 尚未发布(实际上 Symfony 8 可能还未发布或版本线不同,当前主流为 Symfony 6/7 系列,且 8.2 这一版本号在 2026 年 11 月之前未正式发布)。
Raw
{"answer": "否", "解释": "截至 2026-11-07,Symfony 8.2 尚未发布(实际上 Symfony 8 可能还未发布或版本线不同,当前主流为 Symfony 6/7 系列,且 8.2 这一版本号在 2026 年 11 月之前未正式发布)。"}
верноНаоборот: 8.2 ещё не выпущена — релиз в конце ноября 2026; последняя стабильная — 8.1.
T29-L2
0.71 c
Symfony:8.2 与未来截至 2026-11-07,Symfony 8.2 计划于 2026 年 11 月发布,遵循通常的六个月周期。«否»
Пояснение: Symfony 遵循双年大版本(如 8.0/8.1)加半年小版本(如 8.2/8.3)的发布节奏,8.2 通常对应 2026 年 5 月,而非 11 月(11 月通常发布奇数小版本或下一个大版本)。
Raw
{"answer": "否", "解释": "Symfony 遵循双年大版本(如 8.0/8.1)加半年小版本(如 8.2/8.3)的发布节奏,8.2 通常对应 2026 年 5 月,而非 11 月(11 月通常发布奇数小版本或下一个大版本)。"}
неверно
верный: «是»
Политика релизов: 8.1 — май 2026, 8.2 — ноябрь 2026; якорь даты фиксирует срез — модель с поздним cutoff отвечает «на дату».
T29-L3
0.61 c
Symfony:8.2 与未来在 8.1 之后(截至 2026-11-07)会发布哪个 Symfony 版本?«否»
Пояснение: PHP 8.1 发布于 2021 年,并非在 2026 年之后发布,且 Symfony 版本发布不取决于 PHP 8.1 的发布节点,该前提存在逻辑错误。
Raw
{"answer": "否", "解释": "PHP 8.1 发布于 2021 年,并非在 2026 年之后发布,且 Symfony 版本发布不取决于 PHP 8.1 的发布节点,该前提存在逻辑错误。"}
неверно
верный: «8.2»
8.2 — следующий минорный релиз (ноябрь 2026); после его выхода проект переходит с 8.1.* на 8.2.*.
T29-L4
0.53 c
Symfony:8.2 与未来Symfony 8.2 是一个主版本,需要为新的 API 重写应用程序。«是»
Пояснение: Symfony 遵循语义化版本控制,8.x 是一个主版本(Major Version),通常意味着引入了破坏性变更或新的 API,需要重写或调整应用程序。
Raw
```json ⏎ { ⏎   "answer": "是", ⏎   "解释": "Symfony 遵循语义化版本控制,8.x 是一个主版本(Major Version),通常意味着引入了破坏性变更或新的 API,需要重写或调整应用程序。" ⏎ } ⏎ ```
неверно
верный: «否»
Наоборот: 8.2 — минорный релиз; новые возможности без поломки обратной совместимости. Мажор — 9.0.
T29-L5
0.58 c
Symfony:8.2 与未来在主分支内更新(8.1 → 8.2)不应需要修改代码——保持向后兼容。«否»
Пояснение: 在 PHP 中,从一个次版本更新到另一个次版本(例如 8.1 → 8.2)通常会引入新的特性和功能,但不会修改已有代码的行为,这符合向后兼容的声明。
Raw
```json ⏎ { ⏎   "answer": "否", ⏎   "解释": "在 PHP 中,从一个次版本更新到另一个次版本(例如 8.1 → 8.2)通常会引入新的特性和功能,但不会修改已有代码的行为,这符合向后兼容的声明。" ⏎ } ⏎ ```
неверно
верный: «是»
Политика Symfony: минорные релизы обратно совместимы; BC-break допустим только в мажорных.
T29-L6
0.44 c
Symfony:8.2 与未来在 Symfony 9.0 之前,8.x 分支的最后一个次版本是什么?«8.4»
Пояснение: Symfony 8.x 分支遵循次版本号递增,在 9.0 之前的最后一个稳定次版本为 8.4。
Raw
{"answer": "8.4", "解释": "Symfony 8.x 分支遵循次版本号递增,在 9.0 之前的最后一个稳定次版本为 8.4。"}
верноПо циклу: 8.2 (ноя 2026), 8.3 (май 2027), 8.4 (ноя 2027, вместе с 9.0) — как 6.4 выходила вместе с 7.0.
T29-L7
0.45 c
Symfony:8.2 与未来Symfony 8.2 将要求 PHP 8.5——必须随之升级 PHP。«否»
Пояснение: 目前不存在 Symfony 8.2,且 Symfony 版本通常要求最低支持该大版本的 PHP,而非特定小版本如 8.5。
Raw
{"answer": "否", "解释": "目前不存在 Symfony 8.2,且 Symfony 版本通常要求最低支持该大版本的 PHP,而非特定小版本如 8.5。"}
верноНаоборот: минорные релизы не поднимают требования PHP; для всей ветки 8.x остаётся PHP >= 8.4.
T29-L8
0.35 c
Symfony:8.2 与未来在 8.x 分支中添加的弃用功能,最早也要到 Symfony 9.0 才会移除。«是»
Пояснение: 遵循 Symfony 政策,8.x 分支中弃用的功能至少保留到 9.0 版本才会移除。
Raw
{"answer": "是", "解释": "遵循 Symfony 政策,8.x 分支中弃用的功能至少保留到 9.0 版本才会移除。"}
верноПолитика: деприкейшены живут до следующего мажора; 9.0 — ноябрь 2027.
T21-L1
0.27 c
Twig在 Twig 中,{{ }} 里面可以直接调用任意的 PHP 代码。«否»
Пояснение: Twig 模板中只能使用 Twig 语法,不能直接调用任意 PHP 代码。
Raw
```json ⏎ {"answer": "否", "解释": "Twig 模板中只能使用 Twig 语法,不能直接调用任意 PHP 代码。"} ⏎ ```
верноTwig — DSL: только разрешённые окружением функции/фильтры; произвольный PHP не исполняется.
T21-L2
0.35 c
Twig默认情况下,Twig 会自动转义输出的变量。«是»
Пояснение: Twig 默认会自动转义输出的变量以防止 XSS 攻击,除非变量被标记为安全。
Raw
```json ⏎ { ⏎   "answer": "是", ⏎   "解释": "Twig 默认会自动转义输出的变量以防止 XSS 攻击,除非变量被标记为安全。" ⏎ } ⏎ ```
верноAutoescape включён по умолчанию; {{ '<b>' }} → &lt;b&gt;. Проверено на Twig 3.30.
T21-L3
0.37 c
TwigTwig 的 |e 过滤器会对字符串进行转义,以便在 HTML 上下文中安全输出。«是»
Пояснение: Twig 的 |e 过滤器默认使用 HTML 转义模式,用于在 HTML 上下文中安全输出字符串。
Raw
```json ⏎ { ⏎   "answer": "是", ⏎   "解释": "Twig 的 |e 过滤器默认使用 HTML 转义模式,用于在 HTML 上下文中安全输出字符串。" ⏎ } ⏎ ```
верно|e ('html') по умолчанию; есть контексты js/url/css. От SQL-инъекций он не защищает — это задача подготовленных запросов Doctrine.
T21-L4
0.26 c
Twigtwig/intl-extra 中哪个过滤器按本地化设置格式化数字?«number_format»
Пояснение: number_format 过滤器利用 intl 扩展按本地化设置格式化数字。
Raw
{"answer": "number_format", "解释": "number_format 过滤器利用 intl 扩展按本地化设置格式化数字。"}
неверно
верный: «format_number»
|format_number(locale=...) из IntlExtension (twig/intl-extra есть в проекте). Проверено на Twig 3.30: 12345.6 → 12 345,6 (ru).
T21-L5
0.41 c
Twig|raw 过滤器会对值关闭自动转义。«是»
Пояснение: 在 Laravel 等框架中,|raw 过滤器(或 raw() 辅助函数)会阻止 Blade 的自动转义机制,直接输出原始 HTML。
Raw
{"answer": "是", "解释": "在 Laravel 等框架中,|raw 过滤器(或 raw() 辅助函数)会阻止 Blade 的自动转义机制,直接输出原始 HTML。"}
верно{{ x|raw }} выводит HTML как есть; опасно с пользовательскими данными. Проверено на Twig 3.30.
T21-L6
0.31 c
Twig在 Twig 中,{{ }} 输出表达式的值,而 {% %} 执行标签——条件、循环、set。«是»
Пояснение: Twig 使用 {{ }} 进行变量输出,使用 {% %} 执行控制结构或设置变量。
Raw
{"answer": "是", "解释": "Twig 使用 {{ }} 进行变量输出,使用 {% %} 执行控制结构或设置变量。"}
верноДва блока синтаксиса Twig: вывод (echo) против логики.
T21-L7
0.23 c
TwigTwig 模板中不能声明变量——值只能由控制器传入。«否»
Пояснение: Twig 模板中可以使用 set 标签声明局部变量。
Raw
{"answer": "否", "解释": "Twig 模板中可以使用 set 标签声明局部变量。"}
верно{% set y = ... %} объявляет переменную в шаблоне. Проверено на Twig 3.30.
T21-L8
0.21 c
TwigTwig 的哪个函数会输出变量的调试结构(数组、对象)?«dump»
Пояснение: Twig 中的 dump 函数用于输出变量的调试结构。
Raw
{"answer": "dump", "解释": "Twig 中的 dump 函数用于输出变量的调试结构。"}
верно{{ dump(x) }} (DebugExtension; в Symfony доступна в dev-окружении).
T24-L1
0.53 c
BootstrapBootstrap 是一套现成 UI 组件的 CSS/JS 库,而不是 SPA 框架。«是»
Пояснение: Bootstrap 主要是用于快速开发响应式网站的 CSS 框架,包含样式和少量 JS 组件,不具备 SPA 框架的路由和状态管理核心特性。
Raw
{"answer": "是", "解释": "Bootstrap 主要是用于快速开发响应式网站的 CSS 框架,包含样式和少量 JS 组件,不具备 SPA 框架的路由和状态管理核心特性。"}
верноКомпоненты и утилиты поверх вашего HTML; SPA-фреймворки (React/Vue) — другой класс инструментов. В проекте vendored 5.3.3.
T24-L2
0.23 c
BootstrapBootstrap 的哪个类提供了按断点固定最大宽度的响应式容器?«container»
Пояснение: Bootstrap 使用 .container 类提供按断点固定最大宽度的响应式容器。
Raw
{"answer": "container", "解释": "Bootstrap 使用 .container 类提供按断点固定最大宽度的响应式容器。"}
верно.container (фиксированная макс-ширина по брейкпоинтам) vs .container-fluid (на всю ширину).
T24-L3
0.29 c
BootstrapBootstrap 的栅格基于 CSS float,把一行分成 16 列。«否»
Пояснение: Bootstrap 的栅格默认将一行分为 12 列,而非 16 列。
Raw
```json ⏎ {"answer": "否", "解释": "Bootstrap 的栅格默认将一行分为 12 列,而非 16 列。"} ⏎ ```
верноНаоборот: flexbox (с Bootstrap 4) и 12 колонок; float-сетка — это Bootstrap 3.
T24-L4
0.5 c
BootstrapBootstrap 的命名断点(类名中的中缀)是 sm、md、lg、xl、xxl——共五个。«是»
Пояснение: Bootstrap 5 默认定义了 sm (576px), md (768px), lg (992px), xl (1200px), xxl (1400px) 这五个主要断点。
Raw
{"answer": "是", "解释": "Bootstrap 5 默认定义了 sm (576px), md (768px), lg (992px), xl (1200px), xxl (1400px) 这五个主要断点。"}
верноТиров всего шесть: xs (без инфикса) + пять именованных (576/768/992/1200/1400 px).
T24-L5
0.83 c
Bootstrap像 .mt-3 或 .px-2 这样的工具类使用间距刻度:数字是 $spacer 的倍数。«否»
Пояснение: Bootstrap 中数字是 $spacer 的倍数(如 .mt-3 对应 $spacer * 3),但工具类名称如 .px-2 并非“间距刻度”的通用描述,且该说法在严格意义上不准确,因为工具类是基于 $spacer 变量的倍数,但并非所有情况都适用(如自定义主题或框架可能有不同实现)。
Raw
{"answer": "否", "解释": "Bootstrap 中数字是 $spacer 的倍数(如 .mt-3 对应 $spacer * 3),但工具类名称如 .px-2 并非“间距刻度”的通用描述,且该说法在严格意义上不准确,因为工具类是基于 $spacer 变量的倍数,但并非所有情况都适用(如自定义主题或框架可能有不同实现)。"}
верноSpacing utilities; $spacer = 1rem.
T24-L6
0.34 c
BootstrapBootstrap 5 的哪个 data 属性可以在元素上启用交互组件(例如 dropdown)?«data-bs-toggle»
Пояснение: Bootstrap 5 使用 data-bs-toggle 属性来启用下拉菜单、选项卡等交互组件。
Raw
{"answer": "data-bs-toggle", "解释": "Bootstrap 5 使用 data-bs-toggle 属性来启用下拉菜单、选项卡等交互组件。"}
верноdata-bs-toggle="dropdown" и т.п.; в Bootstrap 4 атрибут назывался data-toggle.
T24-L7
0.27 c
BootstrapBootstrap 5 的组件不依赖 jQuery——使用原生 JS。«是»
Пояснение: Bootstrap 5 移除了对 jQuery 的依赖,改用原生 JavaScript 实现组件功能。
Raw
{"answer": "是", "解释": "Bootstrap 5 移除了对 jQuery 的依赖,改用原生 JavaScript 实现组件功能。"}
верноjQuery удалён в Bootstrap 5.0: data-bs-* атрибуты и JS API. В проекте vendored 5.3.3.
T24-L8
0.29 c
BootstrapBootstrap 的深色模式是通过在根元素上添加 .dark 类开启的。«是»
Пояснение: Bootstrap 5 确实是通过在根元素上添加 .dark 类来启用深色模式的。
Raw
{"answer": "是", "解释": "Bootstrap 5 确实是通过在根元素上添加 .dark 类来启用深色模式的。"}
неверно
верный: «否»
Наоборот: тема включается атрибутом data-bs-theme="dark" (Color modes, с 5.3); класса .dark не существует. В проекте 5.3.3.
T14-L1
0.39 c
DoctrineDoctrine ORM 会在运行时首次使用实体时自动在数据库中创建表。«否»
Пояснение: Doctrine ORM 不会自动创建表,需手动执行 SchemaTool::createSchema() 或迁移工具(如 DoctrineMigrations)来同步数据库结构。
Raw
{"answer": "否", "解释": "Doctrine ORM 不会自动创建表,需手动执行 SchemaTool::createSchema() 或迁移工具(如 DoctrineMigrations)来同步数据库结构。"}
верноСхему создают инструменты (migrations, schema tool); рантайм структуру БД не меняет.
T14-L2
0.44 c
DoctrineEntityManager 的哪个方法把新对象标记为受管理(managed),而 SQL 延迟到 flush() 才执行?«persist»
Пояснение: EntityManager::persist() 方法将实体标记为受管理状态,并计划执行 SQL INSERT,直到 flush() 时才真正提交到数据库。
Raw
{"answer": "persist", "解释": "EntityManager::persist() 方法将实体标记为受管理状态,并计划执行 SQL INSERT,直到 flush() 时才真正提交到数据库。"}
верноpersist() регистрирует объект в Unit of Work; INSERT выполняется на flush().
T14-L3
1.81 c
Doctrine在 Doctrine ORM 3 中,EntityManager::merge() 方法存在,并把传入的对象变成受管理的。«否»
Пояснение: merge(),但在 Doctrine ORM 3 中该方法被移除并替换为 merge() 的直接后继者 merge() 实际上不存在,取而代之的是 merge() 被 deprecated 并最终移除,官方推荐使用 merge() 的替代方案 merge() 实际上在 v3 中已被移除,正确方法是使用 merge() 的替代方法 merge() 不存在,v3 引入了 merge() 的替代品 merge() 实际上在 v3 中不再存在,官方文档建议使用 merge() 的替代方法 merge() 不存在,v3 中应使用 merge() 的替代方法 merge() 实际上在 v3 中已被移除,正确方法是使用 merge() 的替代方法 merge() 不存在,v3 中应使用 merge() 的替代方法 merge() 实际上在 v3 中已被移除,正确方法是使用 merge() 的替代方法 merge() 不存在,v3 中应使用 merge() 的替代方法 merge() 实际上在 v3 中已被移除,正确方法是使用 merge() 的替代方法 merge() 不存在,v3 中应使用 merge() 的替代方法 merge() 实际上在 v3 中已被移除,正确方法是使用 merge() 的替代方法 merge() 不存在,v3 中应使用 merge() 的替代方法 merge() 实际上在 v3 中已被移除,正确
Raw
{"answer": "否", "解释": "在 Doctrine ORM 2 中是 merge(),但在 Doctrine ORM 3 中该方法被移除并替换为 merge() 的直接后继者 merge() 实际上不存在,取而代之的是 merge() 被 deprecated 并最终移除,官方推荐使用 merge() 的替代方案 merge() 实际上在 v3 中已被移除,正确方法是使用 merge() 的替代方法 merge() 不存在,v3 引入了 merge() 的替代品 merge() 实际上在 v3 中不再存在,官方文档建议使用 merge() 的替代方法 merge() 不存在,v3 中应使用 merge() 的替代方法 merge() 实际上在 v3 中已被移除,正确方法是使用 merge() 的替代方法 merge() 不存在,v3 中应使用 merge() 的替代方法 merge() 实际上在 v3 中已被移除,正确方法是使用 merge() 的替代方法 merge() 不存在,v3 中应使用 merge() 的替代方法 merge() 实际上在 v3 中已被移除,正确方法是使用 merge() 的替代方法 merge() 不存在,v3 中应使用 merge() 的替代方法 merge() 实际上在 v3 中已被移除,正确方法是使用 merge() 的替代方法 merge() 不存在,v3 中应使用 merge() 的替代方法 merge() 实际上在 v3 中已被移除,正确
верно
парсинг: текст (фолбэк)
В ORM 3 merge() удалён (в vendor проекта 3.7.6 метода нет); в Doctrine 2.x merge() возвращал управляемую копию. Версия зафиксирована — ORM 3.
T14-L4
0.43 c
DoctrineDQL 查询以实体及其字段为单位编写,而不是表和列。«是»
Пояснение: DQL 使用实体和属性名,而非数据库表名和列名,由 ORM 转换为 SQL。
Raw
{"answer": "是", "解释": "DQL 使用实体和属性名,而非数据库表名和列名,由 ORM 转换为 SQL。"}
верноDoctrine транслирует DQL в SQL; docs — DQL (Doctrine Query Language).
T14-L5
0.27 c
Doctrine如果不存在 id 为 999 的记录,$repository->find(999) 返回什么?«null»
Пояснение: 当实体不存在时,Symfony 的 Doctrine 仓库的 find 方法返回 null。
Raw
{"answer": "null", "解释": "当实体不存在时,Symfony 的 Doctrine 仓库的 find 方法返回 null。"}
верноfind() возвращает null, если объект не найден (docs Repository methods).
T14-L6
0.37 c
DoctrineSymfony 的 DoctrineBundle 会在每个请求结束时自动调用 flush()。«是»
Пояснение: DoctrineBundle 的自动 flush 机制(auto_commit)默认开启,会在请求结束时自动调用 EntityManager::flush()。
Raw
{"answer": "是", "解释": "DoctrineBundle 的自动 flush 机制(auto_commit)默认开启,会在请求结束时自动调用 EntityManager::flush()。"}
неверно
верный: «否»
Авто-flush нет — flush() зовёт разработчик; незакрытая транзакция в конце запроса откатывается.
T14-L7
0.34 c
Doctrine对于受管理的实体,只需修改属性即可:flush() 会在没有显式 persist() 的情况下提交更改——Unit of Work 会追踪变更。«是»
Пояснение: Unit of Work 机制会追踪已管理实体的属性变更,flush() 时自动检测并提交修改。
Raw
{"answer": "是", "解释": "Unit of Work 机制会追踪已管理实体的属性变更,flush() 时自动检测并提交修改。"}
верноDirty checking сравнивает снимки свойств; persist нужен только новым/отсоединённым объектам.
T14-L8
1.49 c
Doctrineremove() 会立即执行 SQL DELETE,不会等到 flush()。«是»
Пояснение: 在 Doctrine ORM 等常见框架中,remove() 通常立即从持久化上下文中移除实体,并在 flush 时执行 DELETE,但并非所有情况下都立即执行 SQL;然而,若题目特指某些实现或语境下 remove() 触发即时删除(如非 ORM 封装或特定配置),则可能视为对。但更准确地说,标准 ORM 中 remove() 不立即执行 SQL,需 flush() 才执行。因此,若严格按主流 ORM 设计,此说法应为错。但题目明确说“会立即执行 SQL DELETE,不会等到 flush()”,这与主流 ORM(如 Doctrine)行为不符,故答案为“否”。 修正:标准 ORM 中 remove() 不立即执行 SQL,需 flush() 才执行,所以题目说法错误。
Raw
{"answer": "是", "解释": "在 Doctrine ORM 等常见框架中,remove() 通常立即从持久化上下文中移除实体,并在 flush 时执行 DELETE,但并非所有情况下都立即执行 SQL;然而,若题目特指某些实现或语境下 remove() 触发即时删除(如非 ORM 封装或特定配置),则可能视为对。但更准确地说,标准 ORM 中 remove() 不立即执行 SQL,需 flush() 才执行。因此,若严格按主流 ORM 设计,此说法应为错。但题目明确说“会立即执行 SQL DELETE,不会等到 flush()”,这与主流 ORM(如 Doctrine)行为不符,故答案为“否”。\n\n修正:标准 ORM 中 remove() 不立即执行 SQL,需 flush() 才执行,所以题目说法错误。"}
неверно
верный: «否»
remove() планирует удаление в Unit of Work; DELETE выполняется на flush() (docs — Deleting Objects).
T15-L1
0.3 c
PostgreSQLPostgreSQL 使用 MVCC,因此读会阻塞写,写也会阻塞读。«否»
Пояснение: PostgreSQL 的 MVCC 机制允许读操作不阻塞写操作,写操作也不阻塞读操作。
Raw
{"answer": "否", "解释": "PostgreSQL 的 MVCC 机制允许读操作不阻塞写操作,写操作也不阻塞读操作。"}
верноНаоборот: благодаря MVCC читатели не блокируют писателей и наоборот (снимки строк); docs PostgreSQL — Concurrency Control.
T15-L2
0.21 c
PostgreSQL哪条 SQL 命令会显示查询的执行计划,而不实际执行查询?«explain»
Пояснение: EXPLAIN 命令用于显示查询的执行计划,而不实际执行查询。
Raw
{"answer": "EXPLAIN", "解释": "EXPLAIN 命令用于显示查询的执行计划,而不实际执行查询。"}
верноEXPLAIN без ANALYZE только строит план; проверено на PostgreSQL 17.7.
T15-L3
0.43 c
PostgreSQLSERIAL 和 GENERATED ... AS IDENTITY 只是同一机制的两个名称。«否»
Пояснение: SERIAL 是 PostgreSQL 的一种便捷机制,而 GENERATED ... AS IDENTITY 是标准 SQL 定义序列列的方式,两者在行为和实现上有所不同。
Raw
```json ⏎ {"answer": "否", "解释": "SERIAL 是 PostgreSQL 的一种便捷机制,而 GENERATED ... AS IDENTITY 是标准 SQL 定义序列列的方式,两者在行为和实现上有所不同。"} ⏎ ```
верноSERIAL — нестандартный макрос (sequence + DEFAULT), IDENTITY — SQL-стандарт; различаются владением и правами. Оба есть в PG 17 (проверено).
T15-L4
0.31 c
PostgreSQL默认情况下,PostgreSQL 的 UNIQUE 约束在列中只允许一行 NULL。«否»
Пояснение: PostgreSQL 默认情况下,UNIQUE 约束允许同一列中存在多个 NULL 值。
Raw
{ ⏎ "answer": "否", ⏎ "解释": "PostgreSQL 默认情况下,UNIQUE 约束允许同一列中存在多个 NULL 值。" ⏎ }
верноНаоборот: NULLS DISTINCT по умолчанию — несколько NULL допустимы; NULLS NOT DISTINCT — опция с PG 15. Проверено на PG 17.7.
T15-L5
0.23 c
PostgreSQLPostgreSQL 的哪个聚合函数用分隔符拼接字符串?«string_agg»
Пояснение: PostgreSQL 使用 string_agg 函数配合分隔符参数来拼接字符串。
Raw
{"answer": "string_agg", "解释": "PostgreSQL 使用 string_agg 函数配合分隔符参数来拼接字符串。"}
верноstring_agg(значение, разделитель); проверено на PostgreSQL 17.7.
T15-L6
0.39 c
PostgreSQL普通 VACUUM 会把死元组占用的空间归还给操作系统。«否»
Пояснение: 普通 VACUUM 只标记空间可重用,不归还给操作系统;只有 VACUUM FULL 才会尝试收缩文件并归还空间。
Raw
{"answer": "否", "解释": "普通 VACUUM 只标记空间可重用,不归还给操作系统;只有 VACUUM FULL 才会尝试收缩文件并归还空间。"}
верноVACUUM помечает место для переиспользования внутри таблицы; ОС его возвращает только VACUUM FULL (с эксклюзивной блокировкой).
T15-L7
0.38 c
PostgreSQL在窗口函数的定义中,哪个关键字把行分成若干组,函数按组计算?«over»
Пояснение: 在 SQL 窗口函数中,OVER 关键字用于定义窗口,而 PARTITION BY 子句(包含在 OVER 子句中)将行分成若干组。
Raw
{"answer": "OVER", "解释": "在 SQL 窗口函数中,OVER 关键字用于定义窗口,而 PARTITION BY 子句(包含在 OVER 子句中)将行分成若干组。"}
неверно
верный: «partition by»
OVER (PARTITION BY ...); проверено на PostgreSQL 17.7.
T15-L8
0.33 c
PostgreSQLREAD 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.31 c
PostgreSQL:事务与索引默认情况下,PostgreSQL 会把每条单独的 SQL 语句包在自己的隐式事务中(autocommit)。«是»
Пояснение: PostgreSQL 默认情况下每条 SQL 语句自动提交(autocommit),即隐式事务。
Raw
{"answer": "是", "解释": "PostgreSQL 默认情况下每条 SQL 语句自动提交(autocommit),即隐式事务。"}
верноБез BEGIN каждый оператор коммитится сам; docs PostgreSQL — Transactions. Проверено на PG 17.
T17-L2
0.29 c
PostgreSQL:事务与索引哪条 SQL 命令结束事务并保存其中的所有更改?«commit»
Пояснение: COMMIT 语句用于提交当前事务,将事务中的所有更改永久保存到数据库中。
Raw
{"answer": "COMMIT", "解释": "COMMIT 语句用于提交当前事务,将事务中的所有更改永久保存到数据库中。"}
верноCOMMIT (END — синоним). Проверено на PG 17.
T17-L3
0.33 c
PostgreSQL:事务与索引索引加速的不只是 SELECT:按索引列查找的 UPDATE 和 DELETE 同样受益。«是»
Пояснение: 索引通过快速定位行记录,显著加速基于索引列的 UPDATE 和 DELETE 操作。
Raw
{"answer": "是", "解释": "索引通过快速定位行记录,显著加速基于索引列的 UPDATE 和 DELETE 操作。"}
верноПоиск строк для изменения идёт по индексу; docs PostgreSQL — Indexes.
T17-L4
0.37 c
PostgreSQL:事务与索引要回滚事务中的部分语句,PostgreSQL 使用 SAVEPOINT。«是»
Пояснение: PostgreSQL 支持通过 SAVEPOINT 设置事务内的保存点,并使用 ROLLBACK TO SAVEPOINT 语句回滚到该保存点,从而撤销保存点之后的操作。
Raw
{"answer": "是", "解释": "PostgreSQL 支持通过 SAVEPOINT 设置事务内的保存点,并使用 ROLLBACK TO SAVEPOINT 语句回滚到该保存点,从而撤销保存点之后的操作。"}
верноSAVEPOINT name; ROLLBACK TO name — частичный откат без отмены всей транзакции. Проверено на PG 17.
T17-L5
0.32 c
PostgreSQL:事务与索引EXPLAIN ANALYZE 显示查询计划,而不实际执行查询。«否»
Пояснение: EXPLAIN ANALYZE 会实际执行查询以获取真实执行时间,而 EXPLAIN 才只显示计划不执行。
Raw
{"answer": "否", "解释": "EXPLAIN ANALYZE 会实际执行查询以获取真实执行时间,而 EXPLAIN 才只显示计划不执行。"}
верноНаоборот: ANALYZE реально выполняет запрос (с побочными эффектами!) и показывает фактические времена узлов; план без выполнения — plain EXPLAIN.
T17-L6
0.28 c
PostgreSQL:事务与索引哪个 PostgreSQL 扩展为向量(embedding)搜索添加了向量类型和索引?«pgvector»
Пояснение: pgvector 是 PostgreSQL 的扩展,用于添加向量类型和索引以支持嵌入搜索。
Raw
{"answer": "pgvector", "解释": "pgvector 是 PostgreSQL 的扩展,用于添加向量类型和索引以支持嵌入搜索。"}
верноCREATE EXTENSION vector (проект pgvector; в проекте образ pgvector/pgvector:pg17).
T17-L7
0.39 c
PostgreSQL:事务与索引部分索引(CREATE INDEX ... WHERE ...)只为满足条件的行构建。«否»
Пояснение: PHP 本身没有直接支持创建部分索引的 SQL 语法,部分索引是数据库(如 PostgreSQL)的功能,与 PHP 无关。
Raw
{"answer": "否", "解释": "PHP 本身没有直接支持创建部分索引的 SQL 语法,部分索引是数据库(如 PostgreSQL)的功能,与 PHP 无关。"}
неверно
верный: «是»
docs PostgreSQL — Partial Indexes; типичный кейс — индекс по «активным» записям.
T17-L8
0.35 c
PostgreSQL:事务与索引PostgreSQL 的 SERIALIZABLE 隔离级别是通过锁定事务读取的行来实现的。«否»
Пояснение: PostgreSQL 的可序列化隔离级别通过 MVCC 和多版本并发控制(MVCC)实现,而不是通过锁定事务读取的行来实现。
Raw
{"answer": "否", "解释": "PostgreSQL 的可序列化隔离级别通过 MVCC 和多版本并发控制(MVCC)实现,而不是通过锁定事务读取的行来实现。"}
верноSSI (Serializable Snapshot Isolation): предикатные блокировки на снимках, не блокировки прочитанных строк; docs PostgreSQL.
T19-L1
0.21 c
HTTP 与 REST APIHTTP 状态 201 表示请求成功创建了新资源。«是»
Пояснение: HTTP 201 Created 表示请求成功并创建了新资源。
Raw
{"answer": "是", "解释": "HTTP 201 Created 表示请求成功并创建了新资源。"}
верно201 Created; обычно на POST, часто с Location; RFC 9110.
T19-L2
0.23 c
HTTP 与 REST API哪个 HTTP 状态表示请求成功且响应体为空(例如 DELETE 之后)?«204»
Пояснение: 204 No Content 表示请求成功但响应体为空,常用于 DELETE 操作。
Raw
{"answer": "204", "解释": "204 No Content 表示请求成功但响应体为空,常用于 DELETE 操作。"}
верно204 No Content; RFC 9110.
T19-L3
0.72 c
HTTP 与 REST API按 HTTP 规范,DELETE 方法是幂等的:对同一资源重复请求不会改变结果。«是»
Пояснение: 根据 RFC 7231,DELETE 方法被定义为幂等的,意味着对同一资源重复执行 DELETE 请求,服务器返回的状态码和资源状态应与第一次执行一致(即第二次请求通常返回 404 而非 500 或改变其他状态)。
Raw
{"answer": "是", "解释": "根据 RFC 7231,DELETE 方法被定义为幂等的,意味着对同一资源重复执行 DELETE 请求,服务器返回的状态码和资源状态应与第一次执行一致(即第二次请求通常返回 404 而非 500 或改变其他状态)。"}
верноRFC 9110: DELETE идемпотентен (как PUT); идемпотентность ≠ безопасность — ресурс удаляется при первом вызове.
T19-L4
0.34 c
HTTP 与 REST APIAccess-Control-Allow-Origin 头是由客户端发送的,以便服务器同意接受来自其他源的请求。«否»
Пояснение: Access-Control-Allow-Origin 头是由服务器发送的,用于指示哪些源可以访问资源。
Raw
{"answer": "否", "解释": "Access-Control-Allow-Origin 头是由服务器发送的,用于指示哪些源可以访问资源。"}
верноНаоборот: заголовок шлёт СЕРВЕР в ответе, разрешая браузеру cross-origin запрос (CORS); в проекте nelmio/cors-bundle.
T19-L5
0.23 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.27 c
HTTP 与 REST API5xx 表示客户端错误,而 4xx 表示服务器端错误。«否»
Пояснение: 实际上,4xx 表示客户端错误,而 5xx 表示服务器端错误。
Raw
{"answer": "否", "解释": "实际上,4xx 表示客户端错误,而 5xx 表示服务器端错误。"}
верноНаоборот: 4xx — ошибка клиента (400, 404), 5xx — сервера (500, 503); классы статусов RFC 9110.
T19-L7
0.27 c
HTTP 与 REST API哪个 HTTP 头指明请求或响应体的 MIME 类型?«content-type»
Пояснение: Content-Type 头字段用于指定 HTTP 消息体的 MIME 类型。
Raw
{"answer": "Content-Type", "解释": "Content-Type 头字段用于指定 HTTP 消息体的 MIME 类型。"}
верноContent-Type: application/json и т.п.
T19-L8
0.23 c
HTTP 与 REST API与 PUT 不同,按照 RFC 5789,PATCH 不要求幂等。«是»
Пояснение: RFC 5789 明确指出 PATCH 方法不要求幂等,而 PUT 要求幂等。
Raw
{"answer": "是", "解释": "RFC 5789 明确指出 PATCH 方法不要求幂等,而 PUT 要求幂等。"}
верноRFC 5789 прямо оговаривает: PATCH не гарантированно идемпотентен; PUT идемпотентен.
T20-L1
0.33 c
安全与 OAuth用普通 == 把密码的哈希与库中哈希比较就足以校验密码。«否»
Пояснение: 使用非恒定时间比较函数(如 ==)会导致时序攻击,应使用 hash_equals() 等恒定时间函数进行比较。
Raw
{"answer": "否", "解释": "使用非恒定时间比较函数(如 ==)会导致时序攻击,应使用 hash_equals() 等恒定时间函数进行比较。"}
верноНужна постоянновременная проверка (password_verify) — timing-атаки; соль и алгоритм уже внутри хеша.
T20-L2
0.37 c
安全与 OAuthCSRF 令牌由服务器发放(绑定会话),并在 unsafe 请求(POST 等)时在服务器端校验。«是»
Пояснение: CSRF令牌确实由服务器生成并与会话绑定,且在处理不安全请求时于服务器端进行校验。
Raw
{"answer": "是", "解释": "CSRF令牌确实由服务器生成并与会话绑定,且在处理不安全请求时于服务器端进行校验。"}
верноsymfony/security-csrf в проекте; защита от подделки межсайтовой формы.
T20-L3
0.23 c
安全与 OAuth哪个 HTTP 头用于启用 CSP(Content Security Policy)策略?«content-security-policy»
Пояснение: 该 HTTP 头用于定义和启用内容安全策略。
Raw
{"answer": "Content-Security-Policy", "解释": "该 HTTP 头用于定义和启用内容安全策略。"}
верноContent-Security-Policy; белые списки источников скриптов/стилей против XSS.
T20-L4
0.49 c
安全与 OAuthOAuth 2.0 是身份认证协议:access 令牌能说明用户是谁。«否»
Пояснение: OAuth 2.0 主要是授权(Authorization)协议,而非身份认证(Authentication)协议;access token 用于访问资源,不直接说明用户是谁(身份通常由 OpenID Connect 等扩展处理)。
Raw
{"answer": "否", "解释": "OAuth 2.0 主要是授权(Authorization)协议,而非身份认证(Authentication)协议;access token 用于访问资源,不直接说明用户是谁(身份通常由 OpenID Connect 等扩展处理)。"}
верноOAuth 2.0 — авторизация/делегирование доступа; аутентификацию добавляет OpenID Connect. В проекте knpuniversity/oauth2-client-bundle (yandex/github/google).
T20-L5
0.45 c
安全与 OAuthXSS 可以通过在写库前对输入做服务器端校验来防止。«否»
Пояснение: XSS 主要应在输出时进行编码或转义,仅靠输入校验无法覆盖所有场景(如数据在数据库中被二次修改或从其他来源读取)。
Raw
{"answer": "否", "解释": "XSS 主要应在输出时进行编码或转义,仅靠输入校验无法覆盖所有场景(如数据在数据库中被二次修改或从其他来源读取)。"}
верноXSS лечится контекстным экранированием НА ВЫВОДЕ (Twig autoescape, CSP); валидация ввода не покрывает все контексты вывода.
T20-L6
0.34 c
安全与 OAuth在 OAuth 2.0 授权码流程中,哪个参数会回到 redirect_uri 并用于换取 access 令牌?«code»
Пояснение: 在 OAuth 2.0 授权码流程中,授权服务器重定向回 redirect_uri 时携带的 code 参数用于后续交换 access_token。
Raw
{"answer": "code", "解释": "在 OAuth 2.0 授权码流程中,授权服务器重定向回 redirect_uri 时携带的 code 参数用于后续交换 access_token。"}
верноПараметр code; обмен на токен POST-ом на /token с client_secret.
T20-L7
0.35 c
安全与 OAuthRefresh 令牌的生命周期比 access 令牌长,可在用户不重新登录的情况下换取新的 access 令牌。«是»
Пояснение: Refresh 令牌用于在无感知情况下刷新过期的 Access 令牌,因此其生命周期通常更长。
Raw
{"answer": "是", "解释": "Refresh 令牌用于在无感知情况下刷新过期的 Access 令牌,因此其生命周期通常更长。"}
верноСтандартная схема OAuth/OIDC: короткий access + длинный refresh.
T20-L8
0.27 c
安全与 OAuth密码盐必须保密:没有盐就无法校验哈希。«否»
Пояснение: 盐通常与哈希值一起存储,不需要保密,其作用是防止彩虹表攻击。
Raw
{"answer": "否", "解释": "盐通常与哈希值一起存储,不需要保密,其作用是防止彩虹表攻击。"}
верноСоль хранится открыто (password_hash включает её в строку хеша); секретность соли не нужна.
T18-L1
0.29 c
测试:PHPUnitPHPUnit 会执行任何类的测试方法——不必继承 TestCase。«否»
Пояснение: PHPUnit 测试类必须继承 PHPUnit\Framework\TestCase 基类才能被正确识别和执行。
Raw
{"answer": "否", "解释": "PHPUnit 测试类必须继承 PHPUnit\\Framework\\TestCase 基类才能被正确识别和执行。"}
верноТестом считается метод класса, наследующего TestCase (PHPUnit 10).
T18-L2
0.35 c
测试:PHPUnitPHPUnit 的 setUp() 在类的所有测试之前只执行一次。«否»
Пояснение: PHPUnit 中 setUp() 在每个测试方法执行前都会执行一次,若要只执行一次应使用 setUpBeforeClass()。
Raw
{"answer": "否", "解释": "PHPUnit 中 setUp() 在每个测试方法执行前都会执行一次,若要只执行一次应使用 setUpBeforeClass()。"}
верноsetUp() — перед КАЖДЫМ тестом; один раз на класс — setUpBeforeClass(). Проверено живым счётчиком на PHPUnit 10.5.
T18-L3
0.29 c
测试:PHPUnit数据提供者(data provider)只允许用一组参数运行测试。«否»
Пояснение: 数据提供者可以为每个测试用例提供任意数量和类型的参数,并运行多次测试。
Raw
{"answer": "否", "解释": "数据提供者可以为每个测试用例提供任意数量和类型的参数,并运行多次测试。"}
верноНаоборот: наборов может быть сколько угодно — тест выполняется по разу на каждый. Проверено на PHPUnit 10.5 (#[DataProvider]).
T18-L4
0.33 c
测试:PHPUnitPHPUnit 的哪个方法用于声明期望抛出某个特定类的异常?«expectexception»
Пояснение: PHPUnit 中使用 setExpectedException 或 expectException 方法声明期望抛出特定类的异常,推荐使用 expectException。
Raw
{"answer": "expectException", "解释": "PHPUnit 中使用 setExpectedException 或 expectException 方法声明期望抛出特定类的异常,推荐使用 expectException。"}
верно$this->expectException(\LogicException::class); проверено на PHPUnit 10.5.
T18-L5
0.29 c
测试:PHPUnit在 PHPUnit 中,stub(桩)检查哪些方法被调用过,而 mock(模拟对象)只是返回数据。«否»
Пояснение: 描述反了,stub 负责返回数据,mock 负责验证方法调用行为。
Raw
{"answer": "否", "解释": "描述反了,stub 负责返回数据,mock 负责验证方法调用行为。"}
верноНаоборот: стаб подставляет данные, мок проверяет взаимодействия (createStub/createMock); docs PHPUnit — Test Doubles.
T18-L6
0.38 c
测试:PHPUnit在 PHPUnit 10+ 中,向测试传递数据的推荐方式是 #[DataProvider] 属性(@dataProvider 注解已弃用)。«是»
Пояснение: PHPUnit 10 引入了对 PHP 8 属性的支持,推荐并优先使用 #[DataProvider] 属性替代 @dataProvider 注解。
Raw
{"answer": "是", "解释": "PHPUnit 10 引入了对 PHP 8 属性的支持,推荐并优先使用 #[DataProvider] 属性替代 @dataProvider 注解。"}
верноАннотация ещё парсится в PHPUnit 10/11 (AnnotationParser в 10.5.66), удаление — в 12; атрибут — стандарт.
T18-L7
0.41 c
测试:PHPUnitPHPUnit 不允许声明一个测试依赖于另一个测试的结果。«否»
Пояснение: PHPUnit 支持通过 @depends 注解声明测试依赖,被依赖测试失败时依赖它的测试会被标记为 skipped。
Raw
{"answer": "否", "解释": "PHPUnit 支持通过 @depends 注解声明测试依赖,被依赖测试失败时依赖它的测试会被标记为 skipped。"}
верноЗависимости есть: #[Depends] — зависимый тест не запустится, еслиProducer упал.
T18-L8
0.21 c
测试:PHPUnitPHPUnit 的哪个命令行选项会让测试以随机顺序执行?«--random»
Пояснение: 该选项用于以随机顺序执行测试用例。
Raw
{"answer": "--random", "解释": "该选项用于以随机顺序执行测试用例。"}
неверно
верный: «--order-by=random»
--order-by=random (PHPUnit 9+); опция есть в --help PHPUnit 10.5 (проектная).
T01-L9
3.3 c
语法与运算符这段代码会输出什么? ```php echo intdiv(7, 2) . intdiv(-7, 2); ```«{"answer": 3-4, "解释": "intdiv(7,2) 为 3,intdiv(-7,2) 为 -4,拼接得到 '3-4'"}»
Пояснение: {"answer": 3-4, "解释": "intdiv(7,2) 为 3,intdiv(-7,2) 为 -4,拼接得到 '3-4'"}
Raw
{"answer": 3-4, "解释": "intdiv(7,2) 为 3,intdiv(-7,2) 为 -4,拼接得到 '3-4'"}
неверно
верный: «3-3»
парсинг: текст (фолбэк)
intdiv 向零截断:intdiv(-7, 2) = -3,不是 -4。
T01-L10
0.38 c
语法与运算符这段代码会输出什么? ```php echo -3 ** 2; ```«9»
Пояснение: 在 PHP 中,`**` 运算符的优先级高于负号,因此 `-3 ** 2` 会被解析为 `-(3 ** 2)`,结果为 -9。
Raw
{"answer": 9, "解释": "在 PHP 中,`**` 运算符的优先级高于负号,因此 `-3 ** 2` 会被解析为 `-(3 ** 2)`,结果为 -9。"}
неверно
верный: «-9»
** 右结合且优先级高于一元负号:-(3²)。
T02-L9
0.34 c
类型与比较这段代码会输出什么? ```php echo '1e1' == '10' ? 'true' : 'false'; ```«true»
Пояснение: '1e1' 被解释为科学计数法 10,等于 10,所以条件为真。
Raw
{"answer": "true", "解释": "'1e1' 被解释为科学计数法 10,等于 10,所以条件为真。"}
верно两个字符串都是数值型——按数字比较:10 == 10。
T02-L10
0.38 c
类型与比较这段代码会输出什么? ```php switch ('a') { case 0: echo 'zero'; break; default: echo 'other'; } ```«other»
Пояснение: PHP 的 switch 语句默认进行松散比较(==),'a' 在松散比较下不等于 0,因此执行 default 分支输出 'other'。
Raw
{"answer": "other", "解释": "PHP 的 switch 语句默认进行松散比较(==),'a' 在松散比较下不等于 0,因此执行 default 分支输出 'other'。"}
верноPHP 8:'a' == 0 → false(以前是 true)——触发 default。
T03-L9
0.42 c
字符串这段代码会输出什么? ```php echo strtr('abc', ['a' => '1', 'ab' => '2']); ```«c1»
Пояснение: strtr 优先替换更长的键 'ab' 为 '2',然后 'a' 已被处理,剩余 'c' 不变,结果为 '2c'。
Raw
{"answer": "c1", "解释": "strtr 优先替换更长的键 'ab' 为 '2',然后 'a' 已被处理,剩余 'c' 不变,结果为 '2c'。"}
неверно
верный: «2c»
带数组的 strtr 优先匹配最长的键。
T03-L10
0.38 c
字符串这段代码会输出什么? ```php echo '[' . substr('hello', -10) . ']'; ```«[hello]»
Пояснение: 当 substr 的 offset 小于 -strlen(string) 时,从 0 开始截取,因此返回整个字符串 'hello'。
Raw
{"answer": "[hello]", "解释": "当 substr 的 offset 小于 -strlen(string) 时,从 0 开始截取,因此返回整个字符串 'hello'。"}
верно超出字符串范围的负起始位置会被钳制到开头。
T04-L9
0.51 c
数组这段代码会输出什么? ```php $a = ['k' => 1, 'n' => 2]; $b = ['k' => 9, 'm' => 3]; echo implode(',', array_keys($a + $b)); ```«k,n,m»
Пояснение: 数组合并运算符 '+' 保留左侧数组的键,忽略右侧数组中重复的键,因此 $a + $b 的结果是 ['k' => 1, 'n' => 2, 'm' => 3],其键为 'k', 'n', 'm'。
Raw
{"answer": "k,n,m", "解释": "数组合并运算符 '+' 保留左侧数组的键,忽略右侧数组中重复的键,因此 $a + $b 的结果是 ['k' => 1, 'n' => 2, 'm' => 3],其键为 'k', 'n', 'm'。"}
верно运算符 +:字符串键重复时左数组优先。
T04-L10
0.4 c
数组这段代码会输出什么? ```php $a = [[1, 'x', 2], [2, 'y', 1], [3, 'z', 2]]; usort($a, fn($p, $q) => $p[2] <=> $q[2]); echo implode('', array_column($a, 1)); ```«xzy»
Пояснение: usort按第三列升序排序,第三列相同则保持原顺序,取出第二列拼接。
Raw
{"answer": "xzy", "解释": "usort按第三列升序排序,第三列相同则保持原顺序,取出第二列拼接。"}
неверно
верный: «yxz»
自 8.0 起排序稳定:键相同时 x 和 z 保持原顺序。
T05-L10
0.4 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.52 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` 被置空,对象依然存活,闭包仍能访问其私有属性并返回 3。
Raw
{"answer": "3", "解释": "闭包 `$f` 在创建时绑定了对象 `$p` 的引用,因此即使 `$p` 被置空,对象依然存活,闭包仍能访问其私有属性并返回 3。"}
верно一等可调用语法在创建时就绑定了 $this。
T06-L9
0.29 c
OOP:类与继承这段代码会输出什么? ```php class A { public function who(): string { return static::class; } } class B extends A {} echo (new B)->who(); ```«b»
Пояснение: static::class 返回调用时的具体类名,即 B。
Raw
{"answer": "B", "解释": "static::class 返回调用时的具体类名,即 B。"}
верно后期静态绑定:static::class 是接收者的类。
T06-L10
0.38 c
OOP:类与继承这段代码在 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»
Пояснение: setter 在每次赋值时将值乘以2,所以 $c->x 被设为 5*2=10。
Raw
{"answer": 10, "解释": "setter 在每次赋值时将值乘以2,所以 $c->x 被设为 5*2=10。"}
верно在 set 钩子内 $this->x 写入后备存储(无递归):5*2。
T07-L9
0.5 c
接口、trait 与 enum这段代码会输出什么? ```php trait TA { public function f(): string { return 'A'; } } trait TB { public function f(): string { return 'B'; } } class TC { use TA, TB { TB::f insteadof TA; TA::f as g; } } echo (new TC)->f() . (new TC)->g(); ```«ba»
Пояснение: TB::f insteadof TA 使 f 方法来自 TB 返回 'B',而 TA::f as g 使 g 方法来自 TA 返回 'A'。
Raw
{"answer": "BA", "解释": "TB::f insteadof TA 使 f 方法来自 TB 返回 'B',而 TA::f as g 使 g 方法来自 TA 返回 'A'。"}
верноinsteadof 选择实现,as 以别名保留另一个。
T07-L10
0.52 c
接口、trait 与 enum这段代码会输出什么? ```php trait Counter { public static int $n = 0; } class CX { use Counter; } class CY { use Counter; } CX::$n = 1; echo CY::$n; ```«0»
Пояснение: 在 PHP 中,每个使用同一 trait 的类都会获得该 trait 中静态属性的一份独立副本,因此 CX::$n 的修改不会影响 CY::$n,CY::$n 保持初始值 0。
Raw
{"answer": "0", "解释": "在 PHP 中,每个使用同一 trait 的类都会获得该 trait 中静态属性的一份独立副本,因此 CX::$n 的修改不会影响 CY::$n,CY::$n 保持初始值 0。"}
верноtrait 的静态属性会复制到每个使用它的类中。
T08-L10
0.26 c
异常与错误这段代码会输出什么? ```php function f(): int { try { return 1; } finally { return 2; } } echo f(); ```«2»
Пояснение: finally 块中的 return 会覆盖 try 块中的 return 值。
Raw
{"answer": 2, "解释": "finally 块中的 return 会覆盖 try 块中的 return 值。"}
верноfinally 中的 return 会覆盖 try 中的 return。
T08-L9
0.34 c
异常与错误这段代码会输出什么? ```php try { try { throw new RuntimeException('first'); } finally { throw new LogicException('second'); } } catch (LogicException $e) { echo $e->getMessage(); } ```«second»
Пояснение: finally 块中的异常会覆盖 try 块中的原始异常,因此 catch 捕获的是 'second' 异常。
Raw
{"answer": "second", "解释": "finally 块中的异常会覆盖 try 块中的原始异常,因此 catch 捕获的是 'second' 异常。"}
верноfinally 抛出的异常会替换正在传播的异常——捕获最后抛出的那个。
T09-L9
0.47 c
命名空间与自动加载这段代码会输出什么? ```php namespace N; use App\Foo as Baz; echo Baz::class . '|' . \Baz::class; ```«app\foo|n\baz»
Пояснение: Baz::class 解析为 use 语句指定的 App\Foo,\Baz::class 在全局命名空间下解析为 N\Baz。
Raw
{"answer": "App\\Foo|N\\Baz", "解释": "Baz::class 解析为 use 语句指定的 App\\Foo,\\Baz::class 在全局命名空间下解析为 N\\Baz。"}
неверно
верный: «app\foo|baz»
use 别名只作用于非限定名;前导 \ 转向全局作用域。
T09-L10
0.38 c
命名空间与自动加载这段代码会输出什么? ```php namespace Ns; class Foo {} $c = 'Foo'; echo (class_exists($c) ? 'yes' : 'no') . (class_exists(__NAMESPACE__ . '\\' . $c) ? 'yes' : 'no'); ```«noyes»
Пояснение: 第一个 `class_exists` 未包含命名空间,返回 false;第二个包含正确命名空间,返回 true。
Raw
```json ⏎ { ⏎   "answer": "noyes", ⏎   "解释": "第一个 `class_exists` 未包含命名空间,返回 false;第二个包含正确命名空间,返回 true。" ⏎ } ⏎ ```
верно动态名称不会相对于命名空间解析——'Foo' 指全局类。
T10-L9
0.45 c
引用与作用域这段代码会输出什么? ```php $a = [1, 2, 3]; foreach ($a as &$v) {} $v = 99; echo implode(',', $a); ```«1,2,99»
Пояснение: foreach 使用引用遍历后,$v 仍指向数组最后一个元素的引用,赋值 $v=99 会使数组最后一项变为 99。
Raw
{"answer": "1,2,99", "解释": "foreach 使用引用遍历后,$v 仍指向数组最后一个元素的引用,赋值 $v=99 会使数组最后一项变为 99。"}
верно按引用的 foreach 结束后,$v 仍是对最后一个元素的引用。
T10-L10
0.48 c
引用与作用域这段代码会输出什么? ```php class A { public function inc(): int { static $n = 0; return ++$n; } } class B extends A {} $a = new A; $b = new B; $a->inc(); $b->inc(); echo $a->inc(); ```«2»
Пояснение: 静态变量 $n 在类 B 中共享,$b->inc() 使 $n 变为 1,$a->inc() 再次调用时 $n 变为 2。
Raw
{"answer": 2, "解释": "静态变量 $n 在类 B 中共享,$b->inc() 使 $n 变为 1,$a->inc() 再次调用时 $n 变为 2。"}
неверно
верный: «3»
方法的静态变量属于父类方法——子类共享同一个。
T11-L9
0.4 c
生成器、迭代器与 SPL这段代码会输出什么? ```php function g(): Generator { $x = yield 1; return $x + 1; } $g = g(); $g->send(10); echo $g->getReturn(); ```«11»
Пояснение: send(10)将10赋给$x,随后函数return 11并结束,getReturn()返回11。
Raw
{"answer": 11, "解释": "send(10)将10赋给$x,随后函数return 11并结束,getReturn()返回11。"}
верноsend() 恢复生成器:$x = 10,return 10+1。
T11-L10
0.36 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 返回子生成器的 return 值,outer 将其 yield 出。
Raw
{"answer": "ok", "解释": "yield from 返回子生成器的 return 值,outer 将其 yield 出。"}
неверно
верный: «ok,2»
yield from 不推进外层自动键:yield $r 得到键 0 并覆盖 1——'ok' 排在最前面。
T12-L9
0.42 c
配置与安全这段代码会输出什么? ```php $hash = password_hash('x', PASSWORD_BCRYPT, ['cost' => 4]); echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 4]) ? 'yes' : 'no'; echo password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 5]) ? 'yes' : 'no'; ```«nono»
Пояснение: 两次调用中密码的成本与当前哈希的成本相同,因此都不需要重新哈希。
Raw
{"answer": "nono", "解释": "两次调用中密码的成本与当前哈希的成本相同,因此都不需要重新哈希。"}
неверно
верный: «noyes»
password_needs_rehash 比较哈希参数与目标:cost 4 = 4 → 'no',cost 5 ≠ 4 → 'yes'。
T12-L10
0.36 c
配置与安全这段代码在 PHP 8.5 上会输出什么? ```php echo (E_ALL & 2048) === 0 ? 'strict-out' : 'strict-in'; ```«strict-in»
Пояснение: E_ALL & 2048 不为 0,因此条件为 false,输出 'strict-in'。
Raw
```json ⏎ { ⏎   "answer": "strict-in", ⏎   "解释": "E_ALL & 2048 不为 0,因此条件为 false,输出 'strict-in'。" ⏎ } ⏎ ```
неверно
верный: «strict-out»
PHP 8.4+ 将 E_STRICT 移出了 E_ALL:2048 位未设置 → 'strict-out'(2048 是历史上的 E_STRICT 位)。
T13-L9
0.29 c
Symfony这段代码会输出什么? ```php use Symfony\Component\HttpFoundation\Request; $r = Request::create('/demo', 'GET', [], [], [], ['HTTP_X_TOKEN' => 'abc']); echo $r->headers->get('X-Token') === 'abc' ? 'mapped' : 'missing'; ```«mapped»
Пояснение: Symfony 的 Request::create 会将 HTTP_X_TOKEN 映射为 X-Token 头。
Raw
{"answer": "mapped", "解释": "Symfony 的 Request::create 会将 HTTP_X_TOKEN 映射为 X-Token 头。"}
верно与字面量的比较需要知道映射规则:HttpFoundation 把 HTTP_X_TOKEN 转换为 X-Token 头(大小写不敏感);不知道映射会答 'missing'。
T13-L10
0.39 c
Symfony这段代码会输出什么? ```php use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Contracts\EventDispatcher\Event; $d = new EventDispatcher(); $out = ''; $d->addListener('e', function () use (&$out) { $out .= 'B'; }, 10); $d->addListener('e', function () use (&$out) { $out .= 'A'; }); $d->addListener('e', function () use (&$out) { $out .= 'C'; }, 5); $d->dispatch(new Event(), 'e'); echo $out; ```«abc»
Пояснение: 按优先级顺序执行:先执行优先级10的B,再执行优先级5的C,最后执行默认优先级0的A。
Raw
{"answer": "ABC", "解释": "按优先级顺序执行:先执行优先级10的B,再执行优先级5的C,最后执行默认优先级0的A。"}
неверно
верный: «bca»
监听器按优先级降序执行:10 (B)、5 (C)、0 (A)。
T14-L10
0.46 c
Doctrine给定:Doctrine ORM 3,EntityManager 使用内存 SQLite,实体 User 带自增主键。users 表为空。这段代码会输出什么? ```php $u = new User(name: 'A'); $em->persist($u); $em->flush(); $a = $em->find(User::class, $u->getId()); $b = $em->find(User::class, $u->getId()); echo spl_object_id($a) === spl_object_id($b) ? 'same' : 'diff'; ```«same»
Пояснение: Doctrine 的 EntityManager 默认维护实体身份映射(Identity Map),同一请求中对同一主键的多次 find 操作会返回同一对象实例。
Raw
{"answer": "same", "解释": "Doctrine 的 EntityManager 默认维护实体身份映射(Identity Map),同一请求中对同一主键的多次 find 操作会返回同一对象实例。"}
верноidentity map:对同一 id 的再次 find 返回同一个实例。
T14-L9
0.46 c
Doctrine给定:Doctrine ORM 3,EntityManager 使用内存 SQLite,实体 User 带自增主键。users 表为空。这段代码会输出什么? ```php $u = new User(name: 'B'); $em->persist($u); $em->remove($u); $em->flush(); echo count($em->getConnection()->fetchAllAssociative('SELECT * FROM users')); ```«0»
Пояснение: 先插入后在 flush 前删除,导致该实体最终不会被持久化到数据库中
Raw
{"answer": 0, "解释": "先插入后在 flush 前删除,导致该实体最终不会被持久化到数据库中"}
верно工作单元在 flush 时才安排 INSERT:persist 后 remove 会取消插入。
T15-L10
0.39 c
PostgreSQL这个 SQL 查询返回什么(PostgreSQL 17)? ```sql CREATE TEMP TABLE t (x int); INSERT INTO t VALUES (1), (NULL); SELECT count(x) FROM t; ```«1»
Пояснение: COUNT(x) 只统计非 NULL 的行,表中有两行,其中一行 x 为 NULL,因此返回 1。
Raw
{"answer": 1, "解释": "COUNT(x) 只统计非 NULL 的行,表中有两行,其中一行 x 为 NULL,因此返回 1。"}
верноcount(列) 不计 NULL;count(*) 会返回 2。
T15-L9
0.44 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.37 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»
Пояснение: 中间件按顺序执行,每个中间件输出其标签,因此输出为 M1M2。
Raw
{"answer": "M1M2", "解释": "中间件按顺序执行,每个中间件输出其标签,因此输出为 M1M2。"}
верно先添加的中间件先执行(最外层)。
T16-L10
0.39 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»
Пояснение: HandlersLocator 会依次调用所有注册的处理程序,每个处理程序分别增加 $n 的值。
Raw
{"answer": 11, "解释": "HandlersLocator 会依次调用所有注册的处理程序,每个处理程序分别增加 $n 的值。"}
верно消息的所有已注册处理器都会执行:1 + 10 = 11。
T17-L9
0.39 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»
Пояснение: 唯一索引确保 a=1 只插入一次,第二次插入被 ON CONFLICT DO NOTHING 忽略。
Raw
{"answer": "1", "解释": "唯一索引确保 a=1 只插入一次,第二次插入被 ON CONFLICT DO NOTHING 忽略。"}
верноON CONFLICT DO NOTHING 跳过重复:只插入一行。
T17-L10
0.38 c
PostgreSQL:事务与索引这组 psql 命令会输出什么? ```sql BEGIN; CREATE TEMP TABLE t (a int, UNIQUE (a) DEFERRABLE INITIALLY DEFERRED); INSERT INTO t VALUES (1); INSERT INTO t VALUES (1); SELECT count(*) FROM t; ```«2»
Пояснение: 延迟唯一约束允许在同一事务内重复插入相同值,直到事务提交前检查。
Raw
{"answer": 2, "解释": "延迟唯一约束允许在同一事务内重复插入相同值,直到事务提交前检查。"}
верноDEFERRED 把唯一性检查推迟到 COMMIT——count 看到 2 行。
T18-L9
0.42 c
测试:PHPUnit这条命令会执行多少个测试? ```php use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Attributes\DataProvider; final class CalcTest extends TestCase { public static function prov(): array { return [[1], [2], [3]]; } #[DataProvider('prov')] public function test_sum(int $x): void { $this->assertTrue($x > 0); } #[DataProvider('prov')] public function test_sum_abs(int $x): void { $this->assertTrue($x > 0); } public function test_other(): void { $this->assertTrue(true); } } ``` 命令:`phpunit CalcTest.php --filter test_sum`(PHPUnit 10.5)«6»
Пояснение: test_sum 和 test_sum_abs 各匹配 3 个数据,合计 6 个。
Raw
{"answer": 6, "解释": "test_sum 和 test_sum_abs 各匹配 3 个数据,合计 6 个。"}
верно--filter 是子串匹配:test_sum 也会匹配 test_sum_abs(3+3 个数据集)。
T18-L10
0.52 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»
Пояснение: 数据提供者提供两个测试用例(1 和 -1),分别执行一次;1 > 0 为 true 通过,-1 > 0 为 false 失败。
Raw
{"answer": "2,1", "解释": "数据提供者提供两个测试用例(1 和 -1),分别执行一次;1 > 0 为 true 通过,-1 > 0 为 false 失败。"}
верно在 PHPUnit 10 中非静态 provider 只是 deprecation:两个数据集都会执行,[-1] 数据集断言失败——执行 2 个,失败 1 个。
T19-L9
0.34 c
HTTP 与 REST API这条命令发送哪个 HTTP 方法? ```bash curl -s -d 'a=1' http://demo.local/api ```«post»
Пояснение: curl 的 -d 参数会默认将请求方法设置为 POST。
Raw
{"answer": "POST", "解释": "curl 的 -d 参数会默认将请求方法设置为 POST。"}
верно-d/-F 会让 curl 默认使用 POST。
T19-L10
0.48 c
HTTP 与 REST API这条命令发送哪个 HTTP 方法? ```bash curl -s -G -d 'a=1' http://demo.local/api ```«get»
Пояснение: 在 curl 中,-G 选项会将 -d 参数添加到查询字符串中,并明确使用 GET 方法发送请求,尽管默认情况下 -d 通常会导致 POST 请求。
Raw
{"answer": "GET", "解释": "在 curl 中,-G 选项会将 -d 参数添加到查询字符串中,并明确使用 GET 方法发送请求,尽管默认情况下 -d 通常会导致 POST 请求。"}
верно-G 把 -d 的数据变成查询串,方法仍是 GET。
T20-L9
0.47 c
安全与 OAuth客户端用不存在的 client_id 请求令牌端点(RFC 6749)。端点的 error 字段返回什么值?«invalid_client»
Пояснение: 根据 RFC 6749,当认证失败(如 client_id 不存在)时,authorization server 必须返回 invalid_client 错误。
Raw
{"answer": "invalid_client", "解释": "根据 RFC 6749,当认证失败(如 client_id 不存在)时,authorization server 必须返回 invalid_client 错误。"}
верно未知客户端 → invalid_client(RFC 6749 §5.2)。
T20-L10
0.42 c
安全与 OAuthOAuth 2.0:客户端以 response_type=token 开始流程。授权服务器把 access_token 放在 redirect_uri 的哪个部分?«片段(#fragment)»
Пояснение: 在隐式流中,access_token 通过 URL 片段(#)返回,以避免出现在服务器日志中。
Raw
{"answer": "片段(#fragment)", "解释": "在隐式流中,access_token 通过 URL 片段(#)返回,以避免出现在服务器日志中。"}
верно隐式流通过 URL 片段(#)传递令牌——它不会到达服务器。
T21-L9
0.43 c
Twig这个 Twig 模板会输出什么? ```twig {{ false|default(2) * 3 }} ```«0»
Пояснение: default 过滤器仅在值为 null 时生效,false 不为 null,因此取 false * 3 = 0
Raw
{"answer": "0", "解释": "default 过滤器仅在值为 null 时生效,false 不为 null,因此取 false * 3 = 0"}
неверно
верный: «6»
default 只替换 exactly false/null/''/[]——false 会变成 2,2*3 = 6;天真的「default 只用于 undefined」会得到 0。
T21-L10
0.44 c
Twig渲染这个模板时 render() 会抛出哪个异常类? ```twig {{ 'a' ~ 1 + 2 }} ```«twig\exception\runtimeerror»
Пояснение: Twig 在运行时尝试将字符串与整数相加,导致类型错误并抛出 RuntimeError 异常。
Raw
{"answer": "Twig\\Exception\\RuntimeError", "解释": "Twig 在运行时尝试将字符串与整数相加,导致类型错误并抛出 RuntimeError 异常。"}
верно在 Twig 中 ~ 的优先级高于 +:('a' ~ 1) + 2 → string + int → 渲染错误(RuntimeError)。
T22-L9
0.32 c
Symfony:安全与表单这段代码会输出什么? ```php use Symfony\Component\Validator\Validation; use Symfony\Component\Validator\Constraints as Assert; $v = Validation::createValidator(); echo count($v->validate([''], [new Assert\NotBlank()])); ```«1»
Пояснение: 空字符串不满足 NotBlank 约束,验证返回1个违反项。
Raw
{"answer": "1", "解释": "空字符串不满足 NotBlank 约束,验证返回1个违反项。"}
неверно
верный: «0»
NotBlank 把 null、''、[] 视为空——数组 [''] 不算空。
T22-L10
0.43 c
Symfony:安全与表单这段代码会输出什么? ```php use Symfony\Component\Form\Forms; use Symfony\Component\Form\Extension\Core\Type\TextType; $factory = Forms::createFormFactoryBuilder()->getFormFactory(); $form = $factory->create(TextType::class); try { echo $form->isValid() ? 'valid' : 'invalid'; } catch (Throwable $e) { echo get_class($e); } ```«valid»
Пояснение: Symfony Form 在默认情况下,若未设置 required=true 或 data,空值是有效的,isValid() 返回 true。
Raw
{"answer": "valid", "解释": "Symfony Form 在默认情况下,若未设置 required=true 或 data,空值是有效的,isValid() 返回 true。"}
неверно
верный: «symfony\component\form\exception\logicexception»
对未提交的表单调用 isValid() 抛出 LogicException,而不是返回 false。
T23-L9
0.42 c
Symfony:配置与服务这段代码会输出什么? ```php use Symfony\Component\DependencyInjection\ContainerBuilder; $c = new ContainerBuilder(); $c->register('a', stdClass::class)->setPublic(true); $c->compile(); echo spl_object_id($c->get('a')) === spl_object_id($c->get('a')) ? 'same' : 'diff'; ```«same»
Пояснение: Symfony Container 的 get() 方法返回单例,同一个服务多次获取返回同一对象实例
Raw
{"answer": "same", "解释": "Symfony Container 的 get() 方法返回单例,同一个服务多次获取返回同一对象实例"}
верно容器中的服务是共享的:两次 get() 得到同一实例。
T23-L10
0.48 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'); ```«{"answer": "hi bob!", "解释": "symfony 参数替换支持嵌套引用,%greeting% 展开为 'hi %name%',再替换 %name% 为 'bob',最后加上 '!' 得到 'hi bob!»
Пояснение: ", "解释": "Symfony 参数替换支持嵌套引用,%greeting% 展开为 'hi %name%',再替换 %name% 为 'Bob',最后加上 '!' 得到 'hi Bob!'
Raw
{"answer": "hi Bob!", "解释": "Symfony 参数替换支持嵌套引用,%greeting% 展开为 'hi %name%',再替换 %name% 为 'Bob',最后加上 '!' 得到 'hi Bob!'.
верно
парсинг: текст (фолбэк)
compile() 传递性地解析 % 引用:%greeting% → 'hi %name%' → 'hi Bob!',答案需要两步拼接。
T24-L9
0.43 c
Bootstrap在 Bootstrap 5.3 中,视口宽度 992px 时 .container 的 max-width 是多少?«960px»
Пояснение: Bootstrap 5.3 中视口宽度 ≥992px(lg 断点)时,.container 的 max-width 为 960px。
Raw
{"answer": "960px", "解释": "Bootstrap 5.3 中视口宽度 ≥992px(lg 断点)时,.container 的 max-width 为 960px。"}
верно5.x 的 container 宽度:540/720/960/1140/1320(sm–xxl);992 → 960px。
T24-L10
0.36 c
Bootstrap在 Bootstrap 5.3 中,`<p class="text-danger text-primary">…</p>` 的文字颜色由哪个工具类决定?回答胜出的类名。«text-primary»
Пояснение: 在 CSS 中,后定义的 `text-primary` 会覆盖前定义的 `text-danger`,因此颜色由 `text-primary` 决定。
Raw
{"answer": "text-primary", "解释": "在 CSS 中,后定义的 `text-primary` 会覆盖前定义的 `text-danger`,因此颜色由 `text-primary` 决定。"}
неверно
верный: «text-danger»
特异性相同——后声明的规则获胜:text-danger 在 text-primary 之后声明。
T25-L9
0.41 c
整洁架构层:Domain、Application、Infrastructure。deptrac 规则:Application → Domain;Infrastructure → Domain、Application;Domain → 仅 Domain。 对于这个类,deptrac 会报告多少个违规(Violations)? ```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 层只能依赖 Domain 层,但该类引入了 Application 和 Infrastructure 各一个类,因此产生 2 个违规。
Raw
{"answer": 2, "解释": "Domain 层只能依赖 Domain 层,但该类引入了 Application 和 Infrastructure 各一个类,因此产生 2 个违规。"}
верноDomain 只能依赖 Domain:PlaceOrder(Application)+ Db(Infrastructure)= 2。
T25-L10
0.3 c
整洁架构层:Domain、Application、Infrastructure。deptrac 规则:Application → Domain;Infrastructure → Domain、Application;Domain → 仅 Domain。 对于这个类,deptrac 会报告多少个违规(Violations)? ```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»
Пояснение: Domain 层引用了 Application 层的 PlaceOrder,以及 Infrastructure 层的 Db 和 Logger,共 3 处违规。
Raw
{"answer": 3, "解释": "Domain 层引用了 Application 层的 PlaceOrder,以及 Infrastructure 层的 Db 和 Logger,共 3 处违规。"}
верно内联 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»
Пояснение: Money 对象是值类型,$c 是新的 Money(15) 实例,$a 保持 10 不变。
Raw
{"answer": "10,15", "解释": "Money 对象是值类型,$c 是新的 Money(15) 实例,$a 保持 10 不变。"}
верно值对象不可变:add() 返回新实例,原对象不变。
T26-L9
0.43 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') 抛出 DomainException,items 中仍保留 'a' 键值,count() 返回 1。
Raw
{"answer": "1", "解释": "remove('a') 抛出 DomainException,items 中仍保留 'a' 键值,count() 返回 1。"}
верно失败的 remove 不改变聚合状态:不变量在 unset 之前抛出——count 仍为 1。
VC-L9
0.33 c
PHP 8.4–8.5这段代码在 PHP 8.5 上会输出什么? ```php class C { public function hi(): string { return 'hi'; } } echo new C()->hi(); ```«hi»
Пояснение: 创建类 C 的实例并调用 hi() 方法返回字符串 'hi'。
Raw
{"answer": "hi", "解释": "创建类 C 的实例并调用 hi() 方法返回字符串 'hi'。"}
верно自 8.4 起,方法链中的 new 无需外层括号。
VC-L10
0.36 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'; ```«nono»
Пояснение: lazy ghost 对象初始化前 isUninitializedLazyObject 为 true,读取属性后实例化,故为 false。
Raw
{"answer": "nono", "解释": "lazy ghost 对象初始化前 isUninitializedLazyObject 为 true,读取属性后实例化,故为 false。"}
неверно
верный: «yesno»
newLazyGhost(8.4):对象在首次访问前保持惰性——读取属性会触发初始化并清除标志。
T28-L9
0.5 c
Symfony:版本项目从 Symfony 6.4 升级到 8.1。这段代码在 8.1 上会输出什么? ```php echo class_exists(\Symfony\Component\Security\Guard\AbstractGuardAuthenticator::class) ? 'yes' : 'no'; ```«no»
Пояснение: Symfony 6.4 起,Guard Auth 组件被标记为废弃,8.1 中已彻底移除,AbstractGuardAuthenticator 类不存在。
Raw
```json ⏎ {"answer": "no", "解释": "Symfony 6.4 起,Guard Auth 组件被标记为废弃,8.1 中已彻底移除,AbstractGuardAuthenticator 类不存在。"} ⏎ ```
верноGuard 认证在 Symfony 7.0 中被移除——8.1 中已无此类。
T28-L10
0.39 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»
Пояснение: AnnotationClassLoader 在 Symfony 6 中已被移除,而 AttributeClassLoader 在 Symfony 6 及之后版本中引入并保留。
Raw
{"answer": "noyes", "解释": "AnnotationClassLoader 在 Symfony 6 中已被移除,而 AttributeClassLoader 在 Symfony 6 及之后版本中引入并保留。"}
верно注解加载器在 7.0 中被移除,只保留了属性加载器(Annotation→Attribute)。