一个字符串string就是由一系列的字符组成,其中每个字符等同于一个字节。
注:string最大可以达到2GB。
一个字符串可以用4种方式表达:
1、单引号
2、双引号
3、Heredoc语法结构
4、Nowdoc语法结构
定义一个字符串的最简单的方法是用单引号把它包围起来。
要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。要表达一个反斜线自身,则用两个反斜线(\\)。
注:不像双引号和heredoc语法结构,在单引号字符串中的变量和特殊字符转义序列将不会被替换。
echo 'this is a simple string';
// 可以录入多行
echo 'You can also have embedded newlines in
strings this way as it is
okay to do';
// 输出: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';
// 输出: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// 输出: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// 输出: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// 输出: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
如果字符串是包围在双引号(“)中,php将对一些特殊的字符进行解析:
转义字符 | |
序列 | 含义 |
\n | 换行(ASCII 字符集中的 LF 或 0x0A (10)) |
\r | 回车(ASCII 字符集中的 CR 或 0x0D (13)) |
\t | 水平制表符(ASCII 字符集中的 HT 或 0x09 (9)) |
\v | 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起) |
\e | Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起) |
\f | 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起) |
\\ | 反斜线 |
\$ | 美元标记 |
\" | 双引号 |
\[0-7]{1,3} | 符合该正则表达式序列的是一个以八进制方式来表达的字符 |
\x[0-9A-Fa-f]{1,2} | 符合该正则表达式序列的是一个以十六进制方式来表达的字符 |
用双引号定义的字符串最重要的特征是变量会被解析。
第三种表达字符串的方法是用heredoc语法结构:<<<。在该运算符之后要提供一个标识符,然后换行。接下来是字符串string本身,最后要用前面定义的标识符作为结束标志。
结束是引用的标识符必须在该列的第一列,而且,标识符的命名也要像其他标签一样遵循php的规则:只能包含字符、数字和下划线,并且必须以字母和下划线作为开头。
注:结束标识符这行除了可能有个分号(;)外,绝对不能包含其他字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或制表符。更重要的是结束符的前面必须是个被本地操作系统认可的换行。
注:heredoc结构不能用来初始化类的属性。自php5.3起,此限制仅对heredoc包含变量时有效。
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
/* 含有变量的更复杂示例 */
class foo
{
var $foo;
var $bar;
function foo()
{
$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 print a capital 'A': \x41
EOT;
?>
自php5.3.0以后,也可以用heredoc结构来初始化静态变量和类的属性和常量。
// 静态变量
function foo()
{
static $bar = <<<LABEL
Nothing in here...
LABEL;
}
// 类的常量、属性
class foo
{
const BAR = <<<FOOBAR
Constant example
FOOBAR;
public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>
就像heredoc结构类似于双引号字符串,nowdoc结构类似于单引号字符串。
一个nowdoc结构也用和heredoc结构一样的标记<<<,但是跟在后面的标识符要用单引号括起来,即<<<’EOT’。
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
/* 含有变量的更复杂的示例 */
class foo
{
public $foo;
public $bar;
function foo()
{
$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;
?>
当字符串用双引号或heredoc结构定义时,其中的变量将会被解析。
当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 {$juice}s.";
?>
类似的,一个array索引或一个object属性也可以被解析。数组索引要用方括号(])来表示索引结束的边际,对象属性则是和上述的变量规则相同。
<?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 juice made of {$juices[0]}s.".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->smith}s.";
?>
String中的字符可以通过一个从0开始的下标,用类似array结构中的方括号包含对应的数字来访问和修改。可以把string当成字符组成的array。
注:string也可用花括号访问,比如$str{0}。
// 取得字符串的第一个字符
$str = 'This is a test.';
$first = $str[0];
// 取得字符串的第三个字符
$third = $str[2];
// 取得字符串的最后一个字符
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
// 修改字符串的最后一个字符
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
echo $str;
?>
转换成字符串
一个值可以通过在其前面加上(string)或用strval()函数来转变成字符串。
一个布尔值boolean的true被转换成string的“1”。Boolean的false被转换成””(空字符串)。
一个整数integer或浮点数float被转换成为数字的字面样式的string(包括float中的指数部分)。
数组array总是转换成字符串”Array”。
在php4中对象object总是被转换成字符串”Object”。自php5起,适当时可以用__toString方法。
资源resource总是被转换成”Resource id# 1”这种结构的字符串。其中的1是php在运行时分配给该resource的唯一值。
NULL总是被转换成空字符串。
如果该字符串没有包含’.’,’e’或’E’并且其数字值在整数的范围之内,该字符串将被当成integer来取值。其他所有情况下都被作为float来取值。
该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为0。
$foo = 1 + "10.5"; // $foo is float (11.5)
$foo = 1 + "-1.3e3"; // $foo is float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
$foo = 1 + "bob3"; // $foo is integer (1)
$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1; // $foo is float (11)
$foo = "10.0 pigs " + 1.0; // $foo is float (11)
?>