支付宝扫一扫付款
微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
ExpressionLanguage组件使用了一种特殊的语法,即基于Twig的表达式语法。在本文档中,你可以找到所有受支持的语法。
表达式组件支持:
'hello'
)103
[1, 2]
){ foo: 'bar' }
)true
and false
null
在字符串中,反斜杠(\
)必须通过4个反斜杠(\\\\
)来转义,而在正则表达式中,需要用8个反斜杠(\\\\\\\\
)来转义:
1 2 | echo $language->evaluate('"\\\\"'); // prints \
$language->evaluate('"a\\\\b" matches "/^a\\\\\\\\b$/"'); // returns true |
表达式中的控制符(control characters,比如\n
)将被空格替代。为避免出现这种情况,使用单斜杠来转义(如\\n
)
当把对象传到表达式中时,你可以使用不同的方法在对象中访问属性和调用方法。
使用 .
语法可以访问对象的公有属性,类似于JavaScript:
这将输出 Honeycrisp
。
.
语法也可以调用对象方法,类似于JavaScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
这将输出 Hi Hi Hi!
。
使用与PHP和JavaScript相同的语法,你可以在表达式中使用已注册的函数。ExpressionLanguage组件内置了一个默认函数:constant()
,它将返回PHP常量的值:
它会输出root
。
要了解如何注册你自己的函数,参考 扩展ExpressionLanguage类。
如果你传递一个数组到表达式中,使用 []
语法来访问数组的键,类似于JavaScript:
这将输出 42
。
+
(加)-
(减)*
(乘)/
(除)%
(模)**
(幂)例如:
这将输出 42
。
&
(和)|
(或)^
(异或)==
(等于)===
(全等)!=
(不等于)!==
(不全等)<
(小于)>
(大于)<=
(小于等于)>=
(大于等于)matches
(正则匹配)
要测试一个字符串不 与某个正则相匹配,使用逻辑not
运算符,配合matches
操作符:
1 | $language->evaluate('not ("foo" matches "/bar/")'); // returns true |
你必须使用括号,因为一元运算符not
拥有高于二元操作符matches
的优先级。
例程:
两个变量都将被设置为false
。
not
或 !
and
或 &&
or
或 ||
1 2 3 4 5 6 7 8 | $ret = $language->evaluate(
'life < universe or life < everything',
array(
'life' => 10,
'universe' => 10,
'everything' => 22,
)
); |
$ret
变量将被设置为true
。
~
(连接)例程:
这将输出Arthur Dent
。
in
(包含)not in
(不包含)例程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class User
{
public $group;
}
$user = new User();
$user->group = 'human_resources';
$inGroup = $language->evaluate(
'user.group in ["human_resources", "marketing"]',
array(
'user' => $user,
)
); |
$inGroup
变量将被计算成true
。
..
(范围)例程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class User
{
public $age;
}
$user = new User();
$user->age = 34;
$language->evaluate(
'user.age in 18..45',
array(
'user' => $user,
)
); |
这将被计算成 true
,因为 user.age
是一个从 18
以 45
的范围。
foo ? 'yes' : 'no'
foo ?: 'no'
(equal to foo ? foo : 'no'
)foo ? 'yes'
(equal to foo ? 'yes' : ''
)本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。