Source Code Fundamentals: Literals

布尔字面量

字面量 truefalse 分别表示布尔值“真”和“假”,布尔字面量的类型是 bool。比如:

$val = true;
if ($val === false) ...

整数字面量

整数字面量可被写作十进制数、十六进制数(以 0x 或者 0X 作为前缀,包含有字母 A-F 或者是 a-f)、八进制数(以 0 开头),又或者是二进制数(以 0b 或者 0B 开头)。整数字面量的类型是 int。例如:

$count = 10      // decimal 10
0b101010 >> 4    // binary 101010 and decimal 4
0XAf << 012      // hexadecimal Af and octal 12

浮点字面量

浮点字面量通常包含整数部分、小数点以及小数部分,也有可能会有指数部分。它们是用十进制数字来表示的。浮点字面量的类型是 float。例如:

123.456 + 0.6E27 + 2.34e-3

预定义的常量 INFNAN 分别提供对无穷大浮点值和非数字浮点值的访问。

String Literals

字符串字面量可以是以下的任意一种形式:

字符串是以某种方式分隔的有零至多个字符组成的序列,分隔符不属于字符串的内容。字符串字面量的类型是 string

Single-Quoted String Literals

单引号字符串是由单引号(')分隔的字符串文字,它允许包含除单引号(')和反斜线(\)以外的所有字符,单引号和反斜线需要用它们相应的转义字符,\' 和 \\ 来表示。例如:

'Welcome to Hack!'
'可以像这样嵌入单引号(\")和反斜线(\\)'

Double-Quoted String Literals

双引号字符串是由双引号(")分隔的字符串文字,它允许包含除双引号(")和反斜线(\)以外的所有字符,双引号和反斜线需要用它们相应的转义字符,\" 和 \\ 来表示。例如:

"Welcome to Hack!"
"可以像这样嵌入双引号(\")和反斜线(\\)"

其他某些(有时是不可打印的)字符也可以表示为转义序列。 转义序列表示的是单字符编码。 例如:

"第一行1\n第二行2\n\n第四行\n"
"像这样就可以可以包含双引号(\")和反斜线(\\)"

以下是受支持的转义序列:

转义序列 字符名 Unicode 字符
$ 美元符 U+0024
" 双引号 U+0022
\\ 反斜线 U+005C
\e 逃逸 U+001B
\f 换页 U+000C
\n 换行 U+000A
\r 回车 U+000D
\t 水平制表符 U+0009
\v 垂直制表符 U+000B
\ooo 1-3位八进制数字值 ooo
\xhh or \Xhh 1-2位十六进制数字值 hh U+00hh
\u{xxxxxx} UTF-8 编码的 Unicode 码点 U+xxxxxx U+xxxxxx

在双引号字符串中,没有被反斜线(\)转义的美元符($)将用如下变量替换规则来处理。

当双引号字符串中遇到变量名时,它将会被求值并转换成字符串然后被替代到表达式中。下标或属性访问将分别根据下标运算符成员选择运算符的规则进行解析。 如果 $ 后面的字符序列没有解析为可识别的名称,则 $ 字符将逐字解释,并且不执行变量替换。

参考以下示例:

class C {
  public int $p1 = 2;
}

<<__EntryPoint>>
function main(): void {
  $x = 123;
  echo ">\$x.$x"."<\n";

  $myC = new C();
  echo "\$myC->p1 = >$myC->p1<\n";
}
Output
>$x.123<
$myC->p1 = >2<

Heredoc 字符串

Heredoc 是一个由 “<<< id” 和 “id” 包括的字符串,它可以包含任意的原始字符, 其他某些(有时是不可打印的)字符也可以表示为转义序列。Heredoc 支持对双引号字符串中的变量进行替换。 举例:

<<__EntryPoint>>
function main(): void {
  $v = 123;
  $s = <<<    ID
S'o'me "\"t e\txt; \$v = $v"
Some more text
ID;
  echo ">$s<\n";
}
Output
>S'o'me "\"t e	xt; $v = 123"
Some more text<

开始标记和结束标记必须是一样的,且 <<< 和开始标记之间只允许有水平方向的空格,开始标记到换行符之间不允许有空格;换行符和结束标记之间也不允许有空格。结束标记这行代码除了可选的分号(;)外,不允许有其他的字符——甚至哪怕是注释或者是空格。

Nowdoc 字符串

Nowdoc 跟 Heredoc 长得很像,除了前者的开始标记是包含在单引号(')中的。两种形式的字符串具有相同的语义和约束,只是 Nowdoc 不受变量替换规则的约束,例如:

<<__EntryPoint>>
function main(): void {
  $v = 123;
  $s = <<<    'ID'
S'o'me "\"t e\txt; \$v = $v"
Some more text
ID;
  echo ">$s<\n\n";
}
Output
>S'o'me "\"t e\txt; \$v = $v"
Some more text<

开始标记和单引号(')之间不允许有空格。

空字面量

有一个空字面量,null,其类型为 null。例如:

function log(num $arg, ?num $base = null): float { ... }

在这里,null 被用作函数 log 的默认参数值。

在下面的例子中:

type IdSet = shape('id' => ?string, 'url' => ?string, 'count' => int);

function get_IdSet(): IdSet {
  return shape('id' => null, 'url' => null, 'count' => 0);
}

null 被用于初始化 shape 中的两个数据域。


本节由 Y!an 翻译