PHP的字符串表示方法:它是魔鬼!

表示字符串是PHP的第一关。没有一个程序能离开字符串。但是你知道字符串的表示方法的有多少种方式,有多么魔幻吗?如果你仔细看过这篇文章,必将能给你的PHP之旅带来帮助。

字符串可以用三种字面上的方法定义,
单引号
双引号
定界符(HERE文档)

单引号

指定一个简单字符串的最简单的方法是用单引号(’)括起来。 例如:

echo 'We are letters!';
echo '也可以有中文';
echo '也能直接包含换行
这是第二行了
第三行
...';

当然,你需要点击浏览器的“查看源代码”才能看出换行的效果“。

单引号里不能再出现单引号。要在单引号里表示一个单引号,需要用反斜线(\)转义,和很多其它语言一样。如果在单引号之前或字符串结尾需要出现一个反斜线,需要用两个反斜线表示。注意如果试图转义任何其它字符(即除了\和’),反斜线本身也会被显示出来!所以通常不需要转义反斜线本身。

echo '这里有一个单引号\',呵呵';
echo '两个反斜杠表示一个反斜杠\\,嘿嘿';
echo '如果反斜杠后边不是单引号或者反斜杠,这个反斜杠会直接显示出来\,\n, \t恩...';

埋伏一句,和其他两种语法不同,单引号字符串中出现的变量和转义序列不会被变量的值替代。

双引号

如果用双引号(”)括起字符串,PHP有更强大的功能。
双引号中支持更多的转义序列:

序列 含义
\n 换行(LF 或 ASCII 字符 0x0A(10))
\r 回车(CR 或 ASCII 字符 0x0D(13))
\t 水平制表符(HT 或 ASCII 字符 0x09(9))
\\ 反斜线
\$ 美元符号
\” 双引号
\[0-7]{1,3} 此正则表达式序列匹配一个用八进制符号表示的字符
\x[0-9A-Fa-f]{1,2} 此正则表达式序列匹配一个用十六进制符号表示的字符

此外,和单引号一样,如果试图转义任何其它字符,反斜线本身也会被显示出来!在 PHP 5.1.1 之前,\{$var} 中的反斜线不会被显示出来。

双引号中要出现双引号必须用\”

双引号更为强大的功能是其中的变量名可以被变量值替换!

如果遇到美元符号($),解析器会尽可能多地取得后面的字符以组成一个合法的变量名。如果想明示指定名字的结束,用花括号把变量名括起来。

$beer = 'Heineken';
echo "$beer's taste is great"; // 工作,? $beer被替换成Heineken,双引号里可以出现单引号
echo "He drank some $beers";   // 工作,但是没有$beers这个变量,所以$beers被替换成空
echo "He drank some ${beer}s"; //工作
echo "He drank some {$beer}s"; // 工作
echo "<a href=\"http://www.bnet.cm.cn\" target=\"_blank\" title=\"商业英才网\">BNET</a>"; //有很多双引号,这时用定界符就比较方便了

同样也可以解析数组索引或者对象属性。对于数组索引,右方括号(])标志着索引的结束。

error_reporting(E_ALL);

$fruits = array('strawberry' => 'red', 'banana' => 'yellow');
//工作,但是banana首先是被当做一个常量,当没有定义这个常量是以字符串看待,所以,这种方式存在隐患
echo "A banana is $fruits[banana]";
// 工作,这是数组标准的写法,推荐
echo "A banana is {$fruits['banana']}.";

// 不工作,这是必须用{}括起来
echo "A banana is $fruits['banana'].";

// 工作

echo "This square is $square->width meters broad.";

//变量替换可以将很多语法化简,例如:

echo "我的名字是" . $name . ",你的呢?";

定界符(HERE文档)

另一种给字符串定界的方法使用定界符语法(”<<<“)。应该在 <<< 之后提供一个标识符,然后是字符串,然后是同样的标识符结束字符串。

结束标识符必须从行的第一列开始。同样,标识符也必须遵循 PHP 中其它任何标签的命名规则:只能包含字母数字下划线,而且必须以下划线或非数字字符开始。

例如:

$outstr = <<<EOF
这里可以有单引号和双引号和同于双引号的转义序列
'
"
\n
\\
EOF;

定界符优与双引号的一点就是可以包含双引号和单引号。

很重要的一点必须指出,结束标识符所在的行不能包含任何其它字符,可能除了一个分号(;)之外。这尤其意味着该标识符不能被缩进,而且在分号之前和之后都不能有任何空格或制表符。同样重要的是要意识到在结束标识符之前的第一个字符必须是你的操作系统中定义的换行符。例如在 Macintosh 系统中是 \r。

如果破坏了这条规则使得结束标识符不”干净”,则它不会被视为结束标识符,PHP 将继续寻找下去。如果在这种情况下找不到合适的结束标识符,将会导致一个在脚本最后一行出现的语法错误。

不能用定界符语法初始化类成员。用其它字符串语法替代。

定界符文本表现的就和双引号字符串一样,只是没有双引号。这意味着在定界符文本中不需要转义引号,不过仍然可以用以上列出来的转义代码。变量会被展开,但当在定界符文本中表达复杂变量时和字符串一样同样也要注意。

One Reply to “PHP的字符串表示方法:它是魔鬼!”

  1. 如果这个网页是你写的,那你的修为好高,我不知要学倒什么时候才能有你这种修为

发表评论

电子邮件地址不会被公开。

*