String 字符串

定义一个字符串的最简单的方法是用单引号 '' 把它包围起来。

<?php

$foo = 'foo';

要表达一个单引号自身,需在它的前面加个反斜线 \ 来转义。要表达一个反斜线自身,则用两个反斜线 \\ 。其它任何方式的反斜线都会被当成反斜线本身。也就是说如果想使用其它转义序列例如 \r 或者 \n ,并不代表任何特殊含义,就单纯是这两个字符本身。

<?php

$foo = '\'';
$bar = '\\';

如果字符串是包围在双引号 "" 中, PHP 将对一些特殊的字符进行解析。

<?php

$foo = 'foo';
$bar = "$foo\r\nbar";

另一种表达字符串的方法是用 Heredoc 句法结构: <<< 。在该运算符之后要提供一个标识符,然后换行。接下来是字符串本身,最后要用前面定义的标识符作为结束标志。标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。 Heredoc 结构就像是没有使用双引号的双引号字符串,这就是说在 Heredoc 结构中单引号不用被转义,但是转义序列还可以使用。变量将被替换,但在 Heredoc 结构中含有复杂的变量时要格外小心。

<?php

$foo = 'foo';
$bar = <<<EOT
          $foo
          \r\n
          bar
          EOT;

就像 Heredoc 结构类似于双引号字符串, Nowdoc 结构是类似于单引号字符串的。 Nowdoc 结构很像 Heredoc 结构,但是 Nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。一个 Nowdoc 结构也和 Heredoc 结构用一样的标记 <<< ,但是跟在后面的标识符要用单引号括起来,即 <<<'EOT'Heredoc 结构的所有规则也同样适用于 Nowdoc 结构。

<?php

$foo = 'foo';
$bar = <<<'EOT'
           $foo
           \r\n
           bar
           EOT;

当 PHP 解析器遇到一个美元符号 $ 时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。

<?php

$foo = 'foo';
var_dump("foo bar $foo baz qux"); // string(19) "foo bar foo baz qux"
var_dump("foo bar $foobaz qux");  // string(12) "foo bar  qux"

一个数组索引也可以被解析,数组索引要用方括号 ] 来表示索引结束的边际。

<?php

$foo = ['foo' => 'cat', 'dog', 'bird'];
var_dump("foo bar $foo[foo]baz qux"); // string(18) "foo bar catbaz qux"
var_dump("foo bar $foo[0] baz qux");  // string(19) "foo bar dog baz qux"
var_dump("foo bar $foo[1] baz qux");  // string(20) "foo bar bird baz qux"
var_dump("foo bar $foo[0]baz qux");   // string(18) "foo bar dogbaz qux"
var_dump("foo bar $foo[1]baz qux");   // string(19) "foo bar birdbaz qux"

一个对象属性也可被解析,对象属性则是和上述的变量规则相同。

<?php

class Foo
{
    /**
     * Just a test property.
     *
     * @var string
     */
    public string $property = 'foo';
}

$foo = new Foo();
var_dump("foo bar $foo->property baz qux"); // string(19) "foo bar foo baz qux"
var_dump("foo bar $foo->propertybaz qux");  // string(12) "foo bar  qux"

复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式。只需简单地像在字符串以外的地方那样写出表达式,然后用花括号 {} 把它括起来即可。由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别。可以用 {\$ 来表达 {$

<?php

$foo = 'foo';
var_dump("foo bar { $foo} baz qux"); // string(22) "foo bar { foo} baz qux"
var_dump("foo bar {$foo} baz qux");  // string(19) "foo bar foo baz qux"
var_dump("foo bar ${foo} baz qux");  // string(19) "foo bar foo baz qux"
var_dump("foo bar {$foo}baz qux");   // string(18) "foo bar foobaz qux"

数组索引可以使用复杂语法解析。

<?php

$foo = ['foo' => 'cat', 'dog', 'bird'];
var_dump("foo bar {$foo['foo']}baz qux"); // string(18) "foo bar catbaz qux"
var_dump("foo bar {$foo[0]} baz qux");    // string(19) "foo bar dog baz qux"
var_dump("foo bar {$foo[1]} baz qux");    // string(20) "foo bar bird baz qux"
var_dump("foo bar {$foo[0]}baz qux");     // string(18) "foo bar dogbaz qux"
var_dump("foo bar {$foo[1]}baz qux");     // string(19) "foo bar birdbaz qux"

对象属性也可以使用复杂语法解析。

<?php

class Foo
{
    /**
     * Just a test property.
     *
     * @var string
     */
    public string $property = 'foo';
}

$foo = new Foo();
var_dump("foo bar {$foo->property} baz qux"); // string(19) "foo bar foo baz qux"
var_dump("foo bar {$foo->property}baz qux");  // string(18) "foo bar foobaz qux"

字符串中的字符可以通过一个从 0 开始的下标,用类似数组结构中的方括号包含对应的数字来访问。

<?php

$foo = 'foo';
var_dump($foo[0]); // string(1) "f"
var_dump($foo[1]); // string(1) "o"
var_dump($foo[2]); // string(1) "o"

也可以用类似数组结构中的方括号包含对应的数字来修改。

<?php

$foo = 'foo';
$foo[strlen($foo) - 1] = '0';
var_dump($foo); // string(3) "fo0"

字符串下标必须为整数或可转换为整数的字符串,否则会发出警告并转换成 0 。

<?php

$foo = 'foo';
var_dump($foo['1']);          // string(1) "o"
var_dump(isset($foo['1']));   // bool(true)
var_dump($foo['1.0']);        // string(1) "o"
var_dump(isset($foo['1.0'])); // bool(false)
var_dump($foo['x']);          // string(1) "f"
var_dump(isset($foo['x']));   // bool(false)
var_dump($foo['1x']);         // string(1) "o"
var_dump(isset($foo['1x']));  // bool(false)

转换为字符串:

<?php

var_dump((string) -10);    // string(3) "-10"
var_dump((string) 0);      // string(1) "0"
var_dump((string) 0.0001); // string(6) "0.0001"
var_dump((string) true);   // string(1) "1"
var_dump((string) false);  // string(0) ""
var_dump((string) 1e7);    // string(8) "10000000"

results matching ""

    No results matching ""