Php 细枝假设标点/字符串,小数点前面没有数字值?

Php 细枝假设标点/字符串,小数点前面没有数字值?,php,symfony,types,twig,Php,Symfony,Types,Twig,考虑以下几点: A) {{ form.vars.attr.dimensions.width * .1875 }} B) {{ form.vars.attr.dimensions.width * 0.1875 }} 其中form.vars.attr.dimensions.width是一个整数 下面是form.vars.attr.dimensions的转储 array:2 [ "width" => 1600 "height" => 478 ] 示例A将引发以下异常: 值“”的

考虑以下几点:

A) {{ form.vars.attr.dimensions.width * .1875 }}
B) {{ form.vars.attr.dimensions.width * 0.1875 }}
其中
form.vars.attr.dimensions.width
是一个整数

下面是
form.vars.attr.dimensions
的转储

array:2 [
  "width" => 1600
  "height" => 478
]
示例A将引发以下异常:

值“”的意外标记“标点符号”

示例B工作正常并输出
300.0

我知道它很可能将值解释为字符串,但我的问题是为什么?我认为既然它是无引号的,就不应该被看作是字面意思。我意识到我可以用数字格式、前面的零等来解决这个问题。我只是真的很好奇为什么Twig不能正确识别那个十进制数。或者我错过了别的什么

此外,香草PHP中应用的相同逻辑不会产生这种情况:

<?php
  $val = 1600;
  var_dump($val * .1875);
  // float(300)
?>


在模板呈现的第一步中,
.1875
中的
已被标识为标点符号

细枝文档在中介绍了此过程。第一步:

lexer将模板源代码标记为标记流

在文档部分,它展示了将一些源代码转换为令牌流的方法。如果我们用你的两个例子:

$ex1 = '{{ form.vars.attr.dimensions.width * 0.1875 }}';
$ex2 = '{{ form.vars.attr.dimensions.width * .1875 }}';

$stream1 = $twig->tokenize(new Twig_Source($ex1, 'example1'));
$stream2 = $twig->tokenize(new Twig_Source($ex2, 'example2'));
输出如下:

示例1:示例2:
VAR_START_TYPE()VAR_START_TYPE()
名称\类型(表格)名称\类型(表格)
标点符号类型(.)标点符号类型(.)
名称\类型(vars)名称\类型(vars)
标点符号类型(.)标点符号类型(.)
名称类型(attr)名称类型(attr)
标点符号类型(.)标点符号类型(.)
名称\类型(尺寸)名称\类型(尺寸)
标点符号类型(.)标点符号类型(.)
名称\类型(宽度)名称\类型(宽度)
运算符类型(*)运算符类型(*)

数字类型(0.1875)标点符号类型(.)很可能是因为实现了
twig
。您可以在上看到完整的列表。您需要向下滚动一点以实现这正是我想要的。非常感谢您的详细解释!是的,这更像是一件好奇的事情,而不是试图找出任何解决办法。谢谢你!!不客气。谢谢你问了一个有趣的问题。:)
'/[0-9]+(?:\.[0-9]+)?/A'