支付宝扫一扫付款
微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
ExpressionLanguage组件使用了一种特殊的语法,即基于Twig的表达式语法。在本文档中,你可以找到所有受支持的语法。
表达式组件支持:
'hello')103[1, 2]){ foo: 'bar' })true and falsenull
在字符串中,反斜杠(\)必须通过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 创作共用授权。