所属分类:php教程
有4种定义方式:1、用单引号包裹字符,语法“'字符内容'”;2、用双引号包裹字符,语法“"字符内容"”;3、用heredoc结构,语法“<<<EOF 字符内容 EOF;”;4、用nowdoc结构,语法“<<<'EOD' 字符内容 EOD;”。Nowdoc和heredoc类似,但它中不进行变量解析操作;这种结构很适合用于嵌入PHP代码或其它大段文本而无需对其中的特殊字符进行转义。
php零基础到就业直播视频课:进入学习
程序员必备接口测试调试工具:立即使用
本教程操作环境:windows7系统、PHP8.1版、DELL G3电脑
字符串是连续的字符序列,在其它语言中,字符和字符串是两种不同的数据类型,但在 PHP 中,统一将字符和字符串当作字符串数据类型。
在 PHP 中,定义字符串有4种方式,分别是单引号方式、双引号方式、Heredoc 方式、nowdoc 方式。
“单引号”定义方式
定义一个字符串的最简单的方法是用单引号把它包围起来(字符 ')。
要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。要表达一个反斜线自身,则用两个反斜线(\\)。其它任何方式的反斜线都会被当成反斜线本身:也就是说如果想使用其它转义序列例如 \r 或者 \n,并不代表任何特殊含义,就单纯是这两个字符本身。
注意: 不像双引号和 heredoc 语法结构,在单引号字符串中的变量和特殊字符的转义序列将不会被替换。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?php echo 'this is a simple string' ; echo '<br>' ; // 可以录入多行 echo 'You can also have embedded newlines in strings this way as it is okay to do '; echo '<br>' ; // 输出: Arnold once said: "I'll be back" echo 'Arnold once said: "I\'ll be back"' ; echo '<br>' ; // 输出: You deleted C:\*.*? echo 'You deleted C:\\*.*?' ; echo '<br>' ; // 输出: You deleted C:\*.*? echo 'You deleted C:\*.*?' ; echo '<br>' ; // 输出: This will not expand: \n a newline echo 'This will not expand: \n a newline' ; echo '<br>' ; // 输出: Variables do not $expand $either echo 'Variables do not $expand $either' ; echo '<br>' ; ?> |
“双引号”定义方式
如果字符串是包围在双引号(")中, PHP 将对以下特殊的字符进行解析:
序列 | 含义 |
---|---|
\n | 换行(ASCII 字符集中的 LF 或 0x0A (10)) |
\r | 回车(ASCII 字符集中的 CR 或 0x0D (13)) |
\t | 水平制表符(ASCII 字符集中的 HT 或 0x09 (9)) |
\v | 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11)) |
\e | Escape(ASCII 字符集中的 ESC 或 0x1B (27)) |
\f | 换页(ASCII 字符集中的 FF 或 0x0C (12)) |
\\ | 反斜线 |
\$ | 美元标记 |
\" | 双引号 |
\[0-7]{1,3} | 符合该正则表达式序列的是一个以八进制方式来表达的字符,which silently overflows to fit in a byte (e.g. "\400" === "\000") |
\x[0-9A-Fa-f]{1,2} | 符合该正则表达式序列的是一个以十六进制方式来表达的字符 |
\u{[0-9A-Fa-f]+} | 匹配正则表达式的字符序列是 unicode 码位, 该码位能作为 UTF-8 的表达方式输出字符串 |
和单引号字符串一样,转义任何其它字符都会导致反斜线被显示出来。
用双引号定义的字符串最重要的特征是变量会被解析,即变量解析。
示例:
1 2 3 4 5 6 7 8 9 | <?php echo "this is a simple string" ; echo "<br>" ; // 也可以录入多行 echo "You can also have embedded newlines in strings this way as it is okay to do "; ?> |
“Heredoc”定义方式
第三种表达字符串的方法是用 heredoc 句法结构:<<<。在该运算符之后要提供一个标识符,然后换行。接下来是字符串 string 本身,最后要用前面定义的标识符作为结束标志。
结束标识符可以使用空格或制表符(tab)缩进,此时文档字符串会删除所有缩进。 在 PHP 7.3.0 之前的版本中,结束时所引用的标识符必须在该行的第一列。
而且,标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。
1 2 3 4 5 6 7 | <?php $str = <<<EOF url: https: //www.php.cn/ EOF; echo $str ; ?> |
PHP 7.3.0 之后的基础 Heredoc 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php // 无缩进 echo <<< END a b c \n END ; // 4 空格缩进 echo <<< END a b c END ; |
如果结束标识符的缩进超过内容的任何一行的缩进,则将抛出 ParseError 异常:
示例:结束标识符的缩进不能超过正文的任何一行
1 2 3 4 5 6 | <?php echo <<< END a b c END ; |
以上例程在 PHP 7.3 中的输出:
1 | PHP Parse error: Invalid body indentation level (expecting an indentation level of at least 3) in example.php on line 4 |
制表符也可以缩进结束标识符,但是,关于缩进结束标识符和内容, 制表符和空格不能混合使用。在以上任何情况下, 将会抛出 ParseError 异常。 之所以包含这些空白限制,是因为混合制表符和空格来缩进不利于易读性。
示例:内容(空白)和结束标识符的不同缩进
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php // 以下所有代码都不起作用。 // 正文(空格)和结束标记(制表符),不同的缩进 { echo <<< END a END ; } // 在正文中混合空格和制表符 { echo <<< END a END ; } // 在结束标记中混合空格和制表符 { echo <<< END a END ; } |
以上例程在 PHP 7.3 中的输出:
1 | PHP Parse error: Invalid indentation - tabs and spaces cannot be mixed in example.php line 8 |
内容字符串的结束标识符后面不需要跟分号或者换行符。 例如,从 PHP 7.3.0 开始允许以下代码:
示例:在结束标识符后继续表达式
1 2 3 4 5 6 7 | <?php $values = [<<< END a b c END , 'd e f' ]; var_dump( $values ); |
以上例程在 PHP 7.3 中的输出:
1 2 3 4 5 6 7 8 | array (2) { [0] => string(11) "a b c" [1] => string(5) "d e f" } |
“Nowdoc”定义方式
就象 heredoc 结构类似于双引号字符串,Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。与 SGML 的 <![CDATA[ ]]> 结构是用来声明大段的不用解析的文本类似,nowdoc 结构也有相同的特征。
一个 nowdoc 结构也用和 heredocs 结构一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<'EOT'。Heredoc 结构的所有规则也同样适用于 nowdoc 结构,尤其是结束标识符的规则。
示例:
1 2 3 4 5 6 | <?php echo <<< 'EOD' Example of string spanning multiple lines using nowdoc syntax. Backslashes are always treated literally, e.g. \\ and \'. EOD; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php /* 含有变量的更复杂的示例 */ class foo { public $foo ; public $bar ; function __construct() { $this ->foo = 'Foo' ; $this ->bar = array ( 'Bar1' , 'Bar2' , 'Bar3' ); } } $foo = new foo(); $name = 'MyName' ; echo <<< 'EOT' My name is "$name" . I am printing some $foo ->foo. Now, I am printing some { $foo ->bar[1]}. This should not print a capital 'A' : \x41 EOT; ?> |
注意:
Nowdoc 结构是在 PHP 5.3.0 中加入的。
扩展知识:变量解析
当字符串用双引号或 heredoc 结构定义时,其中的变量将会被解析。
这里共有两种语法规则:一种简单规则,一种复杂规则。简单的语法规则是最常用和最方便的,它可以用最少的代码在一个 string 中嵌入一个变量,一个 array 的值,或一个 object 的属性。
复杂规则语法的显著标记是用花括号包围的表达式。
简单语法
当 PHP 解析器遇到一个美元符号($)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线。
1 2 3 4 5 6 7 8 9 | <?php $juice = "apple" ; echo "He drank some $juice juice." .PHP_EOL; // Invalid. "s" is a valid character for a variable name, but the variable is $juice. echo "He drank some juice made of $juices." ; // Valid. Explicitly specify the end of the variable name by enclosing it in braces: echo "He drank some juice made of ${juice}s." ; ?> |
类似的,一个 array 索引或一个 object 属性也可被解析。数组索引要用方括号(])来表示索引结束的边际,对象属性则是和上述的变量规则相同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php $juices = array ( "apple" , "orange" , "koolaid1" => "purple" ); echo "He drank some $juices[0] juice." .PHP_EOL; echo "He drank some $juices[1] juice." .PHP_EOL; echo "He drank some $juices[koolaid1] juice." .PHP_EOL; class people { public $john = "John Smith" ; public $jane = "Jane Smith" ; public $robert = "Robert Paulsen" ; public $smith = "Smith" ; } $people = new people(); echo "$people->john drank some $juices[0] juice." .PHP_EOL; echo "$people->john then said hello to $people->jane." .PHP_EOL; echo "$people->john's wife greeted $people->robert." .PHP_EOL; echo "$people->robert greeted the two $people->smiths." ; // Won't work ?> |
从 PHP 7.1.0 起,还支持负数字索引。
1 2 3 4 5 6 | <?php $string = 'string' ; echo "The character at index -2 is $string[-2]." , PHP_EOL; $string [-3] = 'o' ; echo "Changing the character at index -3 to o gives $string." , PHP_EOL; ?> |
如果想要表达更复杂的结构,请用复杂语法。
复杂(花括号)语法
复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式。
任何具有 string 表达的标量变量,数组单元或对象属性都可使用此语法。 表达式的书写方式与在 string 以外的方式相同, 然后用花括号 { 和 } 把它括起来即可。由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别。可以用 {\$ 来表达 {$。下面的示例可以更好的解释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?php // 显示所有错误 error_reporting (E_ALL); $great = 'fantastic' ; // 无效,输出: This is { fantastic} echo "This is { $great}" ; // 有效,输出: This is fantastic echo "This is {$great}" ; // 有效 echo "This square is {$square->width}00 centimeters broad." ; // 有效,只有通过花括号语法才能正确解析带引号的键名 echo "This works: {$arr['key']}" ; // 有效 echo "This works: {$arr[4][3]}" ; // 这是错误的表达式,因为就象 $foo[bar] 的格式在字符串以外也是错的一样。 // 换句话说,只有在 PHP 能找到常量 foo 的前提下才会正常工作;这里会产生一个 // E_NOTICE (undefined constant) 级别的错误。 echo "This is wrong: {$arr[foo][3]}" ; // 有效,当在字符串中使用多重数组时,一定要用括号将它括起来 echo "This works: {$arr['foo'][3]}" ; // 有效 echo "This works: " . $arr [ 'foo' ][3]; echo "This works too: {$obj->values[3]->name}" ; echo "This is the value of the var named $name: {${$name}}" ; echo "This is the value of the var named by the return value of getName(): {${getName()}}" ; echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}" ; // 无效,输出: This is the return value of getName(): {getName()} echo "This is the return value of getName(): {getName()}" ; // 无效, 输出: C:\folder\{fantastic}.txt echo "C:\folder\{$great}.txt" // 有效, 输出: C:\folder\fantastic.txt echo "C:\\folder\\{$great}.txt" ?> |
也可以在字符串中用此语法通过变量来调用类的属性。
1 2 3 4 5 6 7 8 9 10 11 | <?php class foo { var $bar = 'I am bar.' ; } $foo = new foo(); $bar = 'bar' ; $baz = array ( 'foo' , 'bar' , 'baz' , 'quux' ); echo "{$foo->$bar}\n" ; echo "{$foo->{$baz[1]}}\n" ; ?> |
注意:
函数、方法、静态类变量和类常量可使用 {$} ,在该字符串被定义的命名空间中将其值作为变量名来访问。只单一使用花括号 ({}) 无法处理从函数或方法的返回值或者类常量以及类静态变量的值。
推荐学习:《PHP视频教程》
以上就是php字符串有哪几种定义方式的详细内容,更多请关注zzsucai.com其它相关文章!