有人知道为什么Symfony ChoiceType选择列表将标签作为数组键而不是值吗?我看了看,但没能找到这个决定背后的原因,因为选项标签可能包含很多特殊字符,而且相当长,而选择值,在大多数情况下,要么是一个整型,要么是一个用于枚举类型的小字符串。
xytpbqjk1#
这背后的原因与PHP如何处理某些值如null和布尔值作为数组键有关,这将导致不一致的行为:
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决定将值/标签Map反转为标签/值,因为标签几乎总是字符串,因此可以比值更可靠地处理。如果遇到长标签名的问题,可以使用短转换键,而这些短转换键通过转换组件扩展为长版本。
1条答案
按热度按时间xytpbqjk1#
这背后的原因与PHP如何处理某些值如
null
和布尔值作为数组键有关,这将导致不一致的行为:正如你在第二个例子中看到的,这什至会导致键被意外覆盖。为了避免这些问题,Symfony决定将值/标签Map反转为标签/值,因为标签几乎总是字符串,因此可以比值更可靠地处理。
如果遇到长标签名的问题,可以使用短转换键,而这些短转换键通过转换组件扩展为长版本。