Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有人知道为什么Symfony ChoiceType选项列表将标签保留为数组键而不是值吗?_Php_Symfony_Choice - Fatal编程技术网

Php 有人知道为什么Symfony ChoiceType选项列表将标签保留为数组键而不是值吗?

Php 有人知道为什么Symfony ChoiceType选项列表将标签保留为数组键而不是值吗?,php,symfony,choice,Php,Symfony,Choice,有人知道为什么Symfony ChoiceType选项列表将标签保留为数组键而不是值吗 我看了看,但找不到那个决定背后的原因。由于选项标签可能包含很多特殊字符,并且相当长,然而,在大多数情况下,选择值是一个int或一个用于枚举类型的小字符串。这背后的原因与PHP如何处理某些值有关,如null和布尔值作为数组键。这将导致不一致的行为: php > $a = [true => 'Yes', false => 'No', null => 'Empty']; php > v

有人知道为什么Symfony ChoiceType选项列表将标签保留为数组键而不是值吗


我看了看,但找不到那个决定背后的原因。由于选项标签可能包含很多特殊字符,并且相当长,然而,在大多数情况下,选择值是一个int或一个用于枚举类型的小字符串。

这背后的原因与PHP如何处理某些值有关,如
null
和布尔值作为数组键。这将导致不一致的行为:

php > $a = [true => 'Yes', false => 'No', null => 'Empty'];
php > var_dump($a);
array(3) {
  [1]=>
  string(3) "Yes"
  [0]=>
  string(2) "No"
  [""]=>
  string(8) "Empty"
}

php > $a = [false => 'Empty', 0 => 'No', 1 => 'Yes', 2 => 'Maybe'];
php > var_dump($a);
array(3) {
  [0]=>
  string(2) "No"
  [1]=>
  string(3) "Yes"
  [2]=>
  string(5) "Maybe"
}
正如您在第二个示例中看到的,这甚至可能导致密钥被意外覆盖。为了避免这些问题,Symfony决定将值/标签映射反向到标签/值,因为标签几乎总是字符串,因此可以比值更可靠地处理


如果您遇到长标签名称的问题,您可以使用短翻译键,然后使用翻译组件将其扩展为长版本。

此处回答:谢谢,我看到了这个答案,但我不能完全理解。由于ChoiceType用于创建下拉列表、复选框或单选按钮,这些值可以是字符串或整数,因此添加将值作为其他类型对象(如布尔或对象)传递的可能性有何意义?如果可能的话,HTML不会把它们转换成int或字符串吗?您可能会很高兴地发现,在S2中,数组键实际上就是值。然后有人觉得无聊,就把它们翻了。Symfony在保持一致性和避免bc中断方面做得很好,但有时快乐的小丑们会赢。这个答案似乎很投机。在php中,有许多情况下,尝试混合布尔、null、整数和空字符串会导致有趣的边缘情况。尝试使用你的例子的人会很快意识到问题并相应地调整。请记住,value=>label多年来一直运行良好。任何关于它为什么会突然翻转的解释都必须解决这个事实。如果你进一步看我的例子,它会更有意义。您可能希望有一个可调用的或对象,例如一个值为
\uu toString()
的实体,但这些不能用作选项数组中的数组键。我对以前使用value=>label数组的原因的解释是,可调用函数在当时并不是一种东西,面向对象的PHP也是相当新的,尽管不可否认,当Symfony表单使用另一种数组样式时,它已经是一种东西了。非常感谢:)