首页 > 技术文章 > String字符串

zhouguowei 2016-02-18 14:58 原文

一个字符串string就是由一系列的字符组成,其中每个字符等同于一个字节。

注:string最大可以达到2GB。

 

一个字符串可以用4种方式表达:

1、单引号

2、双引号

3、Heredoc语法结构

4、Nowdoc语法结构

 

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

要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。要表达一个反斜线自身,则用两个反斜线(\\)。

 

注:不像双引号和heredoc语法结构,在单引号字符串中的变量和特殊字符转义序列将不会被替换。

 

<?php
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包含变量时有效。

 

<?php
$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结构来初始化静态变量和类的属性和常量。

 

<?php
// 静态变量
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

<?php
$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解析器遇到一个美元符号($)时,它会和其他很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量的界限。

<?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}。

<?php
// 取得字符串的第一个字符
$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总是被转换成空字符串。

 

如果该字符串没有包含.eE并且其数字值在整数的范围之内,该字符串将被当成integer来取值。其他所有情况下都被作为float来取值。

 

该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为0。

<?php
$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)     
?>

推荐阅读