七月
08
2016

表达式语法

表达式语言组件使用了一种特殊的基于 Twig 的表达式语法。在这一章中,你可以了解到所有支持的语法。

支持的值

组件支持下面这些值:

  • 字符串 - 用单引号或双引号包围的值(例如 'PHP博客'
  • 数字 - 例如:108
  • 数组 - 使用 JSON 样式的数组值(例如 [1, 'PHP博客']
  • 散列 - 使用 JSON 样式的散列值(例如 {iphp8: 'PHP博客'}
  • 布尔值 - truefalse
  • 空值 - null

注意:表达式的字符串值中,一个反斜杠(\)必须转换为 4 个反斜杠(\\\\),正则表达式中则必须转换为 8 个反斜杠(\\\\\\\\)

echo $language->evaluate('"\\\\"'); // 结果输出 \
$language->evaluate('"a\\\\b" matches "/^a\\\\\\\\b$/"'); // 结果返回 true

转义字符(例如:\n)在表达式中默认会被替换为空白。要阻止这个默认处理方式,需要将转义字符中的反斜杠通过多添加一个反斜杠进行转义(例如:\\n)。

使用对象

当需要在表达式中使用对象时,你可以通过使用不同的语法访问对象的属性和调用的方法。

访问公共属性

Javascript 类似,对象的公共属性可以通过点语法(.)来进行访问:

class Apple
{
    public $variety;
}

$apple = new Apple();
$apple->variety = 'Honeycrisp';

var_dump($language->evaluate(
    'fruit.variety',
    array(
        'fruit' => $apple,
    )
));

以上程序将输出Honeycrisp

调用方法

依然和 Javascript 类似,你也可以通过点语法来调用一个对象的方法:

class Robot
{
    public function sayHi($times)
    {
        $greetings = array();
        for ($i = 0; $i < $times; $i++) {
            $greetings[] = 'Hi';
        }

        return implode(' ', $greetings).'!';
    }
}

$robot = new Robot();

var_dump($language->evaluate(
    'robot.sayHi(3)',
    array(
        'robot' => $robot,
    )
));

以上程序将输出 Hi Hi Hi!

使用函数

PHPJavascript 的函数使用语法一样,你也可以在表达式中使用已经注册过的函数。表达式语言组件默认附带了一个函数:constant()站内参考),该函数会返回 PHP 常量的值。

define('DB_USER', 'root');

var_dump($language->evaluate(
    'constant("DB_USER")'
));

以上程序将输出 root

想了解怎样在表达式中注册使用自己的函数,参考章节:扩展表达式语言(英文

使用数组

如果要在表达式中传递数组,与 Javascript 语法类似,需要使用 [] 语法来访问数组的键:

$data = array('life' => 10, 'universe' => 10, 'everything' => 22);

var_dump($language->evaluate(
    'data["life"] + data["universe"] + data["everything"],
    array(
        'data' => $data,
    )
));

以上程序将输出 42

支持的操作

组件支持大量的操作:

运算操作

  • +(加法运算)
  • -(减法运算)
  • *(乘法运算)
  • /(除法运算)
  • %(求余运算)
  • **(幂运算)

例如:

var_dump($language->evaluate(
    'life + universe + everything',
    array(
        'life' => 10,
        'universe' => 10,
        'everything' => 22,
    )
));

以上程序将输出 42

按位操作

  • &(按位与运算)
  • |(按位或运算)
  • ^(按位取反运算)

比较操作

  • ==(等于比较)
  • ===(全等于比较)
  • !=(不等比较)
  • !==(不全等比较)
  • <(小于比较)
  • >(大于比较)
  • <=(小于等于比较)
  • >=(大于等于比较)
  • matches(正则匹配)

要测试是否一个字符串不能匹配某个正则,可以使用与 matches运算符相结合的 not 逻辑运算符:

$language->evaluate('not ("foo" matches "/bar/")'); // 结果为 true

由于一元运算符 not 的优先级高于二元运算符 matches,所以必须在 not 运算符后使用括号

例子:

$ret1 = $language->evaluate(
    'life == everything',
    array(
        'life' => 10,
        'universe' => 10,
        'everything' => 22,
    )
);

$rets = $language->evaluate(
    'life > everything',
    array(
        'life' => 10,
        'universe' => 10,
        'everything' => 22,
    )
);

以上程序的两个变量都将被赋值为 false

逻辑运算符

  • not!
  • and&&
  • or||

例子:

$ret = $language->evaluate(
    'life < universe or life < everything',
    array(
        'life' => 10,
        'universe' => 10,
        'everything' => 22,
    )
);

以上程序的 $ret 变量将被设置为 true

字符串运算符

  • ~(连字符)

例子:

var_dump($language->evaluate(
    'firstName~" "~lastName',
    array(
        'firstName' => 'PHP',
        'lastName' => '博客',
    )
));

以上程序将输出 PHP 博客

数组运算符

  • in(包含运算符)
  • not in(不包含运算符)

例子:

class User
{
    public $group;
}

$user = new User();
$user->group = 'iphp8.com';

$inGroup = $language->evaluate(
    'user.group in ["iphp8.com", "PHP blog"],
    array(
        'user` => $user,
    )
);

以上程序,$inGroup 变量将会被赋值为 true

数字运算符

  • ..(范围运算符)

例子:

class User
{
    public $age;
}

$user = new User();
$user->age = 34;

$language->evaluate(
    'user.age in 18..45',
    array(
        'user' => $user,
    )
);

以上程序将得到 true,因为 user.age1845 这个范围之间。

三元运算符

  • foo ? 'yes' : 'no'
  • foo ?: 'no'(等效于 foo ? foo : 'no'
  • foo ? 'yes'(等效于 foo ? 'yes' : ''

原文地址:The Expression Syntax

非特殊注明博文为 爱PHP吧(www.iphp8.com)原创内容,转载请注明原文地址:http://www.iphp8.com/?post=94

评论

发表评论:

(选填)

(选填)