mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-18 05:26:57 +08:00
828 lines
72 KiB
HTML
828 lines
72 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
<html>
|
||
<head>
|
||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||
<title>String 字符串</title>
|
||
</head>
|
||
<div id="layout">
|
||
<div id="layout-content"><div id="language.types.string" class="sect1">
|
||
<h2 class="title">String 字符串</h2>
|
||
|
||
|
||
<p class="para">
|
||
一个字符串 <span class="type"><a href="language.types.string.html" class="type string">string</a></span> 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着
|
||
PHP 只能支持 256 的字符集,因此不支持 Unicode 。详见<a href="language.types.string.html#language.types.string.details" class="link">字符串类型详解</a>。
|
||
</p>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<span class="simpara">
|
||
<span class="type"><a href="language.types.string.html" class="type string">string</a></span> 最大可以达到 2GB。
|
||
</span>
|
||
</p></blockquote>
|
||
|
||
<div class="sect2" id="language.types.string.syntax">
|
||
<h3 class="title">语法</h3>
|
||
|
||
<p class="para">
|
||
一个字符串可以用 4 种方式表达:
|
||
</p>
|
||
|
||
<ul class="itemizedlist">
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
<a href="language.types.string.html#language.types.string.syntax.single" class="link">单引号</a>
|
||
</span>
|
||
</li>
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
<a href="language.types.string.html#language.types.string.syntax.double" class="link">双引号</a>
|
||
</span>
|
||
</li>
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
<a href="language.types.string.html#language.types.string.syntax.heredoc" class="link">heredoc 语法结构</a>
|
||
</span>
|
||
</li>
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
<a href="language.types.string.html#language.types.string.syntax.nowdoc" class="link">nowdoc 语法结构</a>(自 PHP 5.3.0 起)
|
||
</span>
|
||
</li>
|
||
</ul>
|
||
|
||
<div class="sect3" id="language.types.string.syntax.single">
|
||
<h4 class="title">单引号</h4>
|
||
|
||
<p class="para">
|
||
定义一个字符串的最简单的方法是用单引号把它包围起来(字符 <em>'</em>)。
|
||
</p>
|
||
|
||
<p class="para">
|
||
要表达一个单引号自身,需在它的前面加个反斜线(<em>\</em>)来转义。要表达一个反斜线自身,则用两个反斜线(<em>\\</em>)。其它任何方式的反斜线都会被当成反斜线本身:也就是说如果想使用其它转义序列例如
|
||
<em>\r</em> 或者 <em>\n</em>,并不代表任何特殊含义,就单纯是这两个字符本身。
|
||
</p>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<span class="simpara">
|
||
不像<a href="language.types.string.html#language.types.string.syntax.double" class="link">双引号</a>和
|
||
<a href="language.types.string.html#language.types.string.syntax.heredoc" class="link">heredoc</a>
|
||
语法结构,在单引号字符串中的<a href="language.variables.html" class="link">变量</a>和特殊字符的转义序列将<em class="emphasis">不会</em>被替换。
|
||
</span>
|
||
</p></blockquote>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'this is a simple string'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 可以录入多行<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'You can also have embedded newlines in <br />strings this way as it is<br />okay to do'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 输出: Arnold once said: "I'll be back"<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Arnold once said: "I\'ll be back"'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 输出: You deleted C:\*.*?<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'You deleted C:\\*.*?'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 输出: You deleted C:\*.*?<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'You deleted C:\*.*?'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 输出: This will not expand: \n a newline<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'This will not expand: \n a newline'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 输出: Variables do not $expand $either<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Variables do not $expand $either'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="sect3" id="language.types.string.syntax.double">
|
||
<h4 class="title">双引号</h4>
|
||
|
||
<p class="para">
|
||
如果字符串是包围在双引号(")中, PHP 将对一些特殊的字符进行解析:
|
||
</p>
|
||
|
||
<table class="doctable table">
|
||
<caption><strong>转义字符</strong></caption>
|
||
|
||
|
||
<thead>
|
||
<tr>
|
||
<th>序列</th>
|
||
<th>含义</th>
|
||
</tr>
|
||
|
||
</thead>
|
||
|
||
|
||
<tbody class="tbody">
|
||
<tr>
|
||
<td><em>\n</em></td>
|
||
<td>换行(ASCII 字符集中的 LF 或 0x0A (10))</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td><em>\r</em></td>
|
||
<td>回车(ASCII 字符集中的 CR 或 0x0D (13))</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td><em>\t</em></td>
|
||
<td>水平制表符(ASCII 字符集中的 HT 或 0x09 (9))</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td><em>\v</em></td>
|
||
<td>垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td><em>\e</em></td>
|
||
<td>Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td><em>\f</em></td>
|
||
<td>换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td><em>\\</em></td>
|
||
<td>反斜线</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td><em>\$</em></td>
|
||
<td>美元标记</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td><em>\"</em></td>
|
||
<td>双引号</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td><em>\[0-7]{1,3}</em></td>
|
||
<td>
|
||
符合该正则表达式序列的是一个以八进制方式来表达的字符
|
||
</td>
|
||
</tr>
|
||
|
||
<tr>
|
||
<td><em>\x[0-9A-Fa-f]{1,2}</em></td>
|
||
<td>
|
||
符合该正则表达式序列的是一个以十六进制方式来表达的字符
|
||
</td>
|
||
</tr>
|
||
|
||
</tbody>
|
||
|
||
</table>
|
||
|
||
|
||
<p class="para">
|
||
和单引号字符串一样,转义任何其它字符都会导致反斜线被显示出来。PHP 5.1.1
|
||
以前,<em>\{$var}</em> 中的反斜线还不会被显示出来。
|
||
</p>
|
||
|
||
<p class="para">
|
||
用双引号定义的字符串最重要的特征是变量会被解析,详见<a href="language.types.string.html#language.types.string.parsing" class="link">变量解析</a>。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="sect3" id="language.types.string.syntax.heredoc">
|
||
<h4 class="title">Heredoc 结构</h4>
|
||
|
||
<p class="simpara">
|
||
第三种表达字符串的方法是用 heredoc
|
||
句法结构:<em><<<</em>。在该运算符之后要提供一个标识符,然后换行。接下来是字符串
|
||
<span class="type"><a href="language.types.string.html" class="type string">string</a></span> 本身,最后要用前面定义的标识符作为结束标志。
|
||
</p>
|
||
|
||
<p class="simpara">
|
||
结束时所引用的标识符<em class="emphasis">必须</em>在该行的第一列,而且,标识符的命名也要像其它标签一样遵守
|
||
PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。
|
||
</p>
|
||
|
||
<div class="warning"><strong class="warning">Warning</strong>
|
||
<p class="simpara">
|
||
要注意的是结束标识符这行除了<em class="emphasis">可能</em>有一个分号(<em>;</em>)外,绝对不能包含其它字符。这意味着标识符<em class="emphasis">不能缩进</em>,分号的前后也不能有任何空白或制表符。更重要的是结束标识符的前面必须是个被本地操作系统认可的换行,比如在
|
||
UNIX 和 Mac OS X 系统中是 <em>\n</em>,而结束定界符(可能其后有个分号)之后也必须紧跟一个换行。
|
||
</p>
|
||
|
||
<p class="simpara">
|
||
如果不遵守该规则导致结束标识不“干净”,PHP
|
||
将认为它不是结束标识符而继续寻找。如果在文件结束前也没有找到一个正确的结束标识符,PHP
|
||
将会在最后一行产生一个解析错误。
|
||
</p>
|
||
|
||
<p class="para">
|
||
Heredocs 结构不能用来初始化类的属性。自 PHP 5.3 起,此限制仅对 heredoc 包含变量时有效。
|
||
</p>
|
||
|
||
<div class="example" id="example-61">
|
||
<p><strong>Example #1 非法的示例</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo </span><span style="color: #007700">{<br /> public </span><span style="color: #0000BB">$bar </span><span style="color: #007700">= <<<EOT<br /></span><span style="color: #DD0000">bar<br /> EOT;<br />}<br />?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<p class="para">
|
||
Heredoc 结构就象是没有使用双引号的双引号字符串,这就是说在 heredoc
|
||
结构中单引号不用被转义,但是上文中列出的转义序列还可以使用。变量将被替换,但在 heredoc
|
||
结构中含有复杂的变量时要格外小心。
|
||
</p>
|
||
|
||
<div class="example" id="example-62">
|
||
<p><strong>Example #2 Heredoc 结构的字符串示例</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$str </span><span style="color: #007700">= <<<EOD<br /></span><span style="color: #DD0000">Example of string<br />spanning multiple lines<br />using heredoc syntax.<br /></span><span style="color: #007700">EOD;<br /><br /></span><span style="color: #FF8000">/* 含有变量的更复杂示例 */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo<br /></span><span style="color: #007700">{<br /> var </span><span style="color: #0000BB">$foo</span><span style="color: #007700">;<br /> var </span><span style="color: #0000BB">$bar</span><span style="color: #007700">;<br /><br /> function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br /> {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">foo </span><span style="color: #007700">= </span><span style="color: #DD0000">'Foo'</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bar </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'Bar1'</span><span style="color: #007700">, </span><span style="color: #DD0000">'Bar2'</span><span style="color: #007700">, </span><span style="color: #DD0000">'Bar3'</span><span style="color: #007700">);<br /> }<br />}<br /><br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= new </span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$name </span><span style="color: #007700">= </span><span style="color: #DD0000">'MyName'</span><span style="color: #007700">;<br /><br />echo <<<EOT<br /></span><span style="color: #DD0000">My name is "</span><span style="color: #0000BB">$name</span><span style="color: #DD0000">". I am printing some </span><span style="color: #0000BB">$foo</span><span style="color: #007700">-></span><span style="color: #0000BB">foo</span><span style="color: #DD0000">.<br />Now, I am printing some </span><span style="color: #007700">{</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-></span><span style="color: #0000BB">bar</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]}</span><span style="color: #DD0000">.<br />This should print a capital 'A': \x41<br /></span><span style="color: #007700">EOT;<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
<p class="para">以上例程会输出:</p>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
My name is "MyName". I am printing some Foo.
|
||
Now, I am printing some Bar2.
|
||
This should print a capital 'A': A</pre></div>
|
||
</div>
|
||
|
||
<p class="para">
|
||
也可以把 Heredoc 结构用在函数参数中来传递数据:
|
||
</p>
|
||
|
||
<div class="example" id="example-63">
|
||
<p><strong>Example #3 Heredoc 结构在参数中的示例</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />var_dump</span><span style="color: #007700">(array(<<<EOD<br /></span><span style="color: #DD0000">foobar!<br /></span><span style="color: #007700">EOD<br />));<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
在 PHP 5.3.0 以后,也可以用 Heredoc 结构来初始化静态变量和类的属性和常量:
|
||
</p>
|
||
|
||
<div class="example" id="example-64">
|
||
<p><strong>Example #4 使用 Heredoc 结构来初始化静态值</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// 静态变量<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />{<br /> static </span><span style="color: #0000BB">$bar </span><span style="color: #007700">= <<<LABEL<br /></span><span style="color: #DD0000">Nothing in here...<br /></span><span style="color: #007700">LABEL;<br />}<br /><br /></span><span style="color: #FF8000">// 类的常量、属性<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo<br /></span><span style="color: #007700">{<br /> const </span><span style="color: #0000BB">BAR </span><span style="color: #007700">= <<<FOOBAR<br /></span><span style="color: #DD0000">Constant example<br /></span><span style="color: #007700">FOOBAR;<br /><br /> public </span><span style="color: #0000BB">$baz </span><span style="color: #007700">= <<<FOOBAR<br /></span><span style="color: #DD0000">Property example<br /></span><span style="color: #007700">FOOBAR;<br />}<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
自 PHP 5.3.0 起还可以在 Heredoc 结构中用双引号来声明标识符:
|
||
</p>
|
||
|
||
<div class="example" id="example-65">
|
||
<p><strong>Example #5 在 heredoc 结构中使用双引号</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">echo <<<"FOOBAR"<br /></span><span style="color: #DD0000">Hello World!<br /></span><span style="color: #007700">FOOBAR;<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="sect3" id="language.types.string.syntax.nowdoc">
|
||
<h4 class="title">Nowdoc 结构</h4>
|
||
|
||
<p class="para">
|
||
就象 heredoc 结构类似于双引号字符串,Nowdoc 结构是类似于单引号字符串的。Nowdoc
|
||
结构很象 heredoc 结构,但是 nowdoc
|
||
中<em class="emphasis">不进行解析操作</em>。这种结构很适合用于嵌入 PHP
|
||
代码或其它大段文本而无需对其中的特殊字符进行转义。与 SGML 的
|
||
<em><![CDATA[ ]]></em> 结构是用来声明大段的不用解析的文本类似,nowdoc 结构也有相同的特征。
|
||
</p>
|
||
|
||
<p class="para">
|
||
一个 nowdoc 结构也用和 heredocs 结构一样的标记
|
||
<em><<<</em>, 但是跟在后面的标识符要用单引号括起来,即
|
||
<em><<<'EOT'</em>。Heredoc 结构的所有规则也同样适用于 nowdoc
|
||
结构,尤其是结束标识符的规则。
|
||
</p>
|
||
|
||
<div class="example" id="example-66">
|
||
<p><strong>Example #6 Nowdoc 结构字符串示例</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$str </span><span style="color: #007700">= <<<'EOD'<br /></span><span style="color: #DD0000">Example of string<br />spanning multiple lines<br />using nowdoc syntax.<br /></span><span style="color: #007700">EOD;<br /><br /></span><span style="color: #FF8000">/* 含有变量的更复杂的示例 */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo<br /></span><span style="color: #007700">{<br /> public </span><span style="color: #0000BB">$foo</span><span style="color: #007700">;<br /> public </span><span style="color: #0000BB">$bar</span><span style="color: #007700">;<br /><br /> function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br /> {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">foo </span><span style="color: #007700">= </span><span style="color: #DD0000">'Foo'</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bar </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'Bar1'</span><span style="color: #007700">, </span><span style="color: #DD0000">'Bar2'</span><span style="color: #007700">, </span><span style="color: #DD0000">'Bar3'</span><span style="color: #007700">);<br /> }<br />}<br /><br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= new </span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$name </span><span style="color: #007700">= </span><span style="color: #DD0000">'MyName'</span><span style="color: #007700">;<br /><br />echo <<<'EOT'<br /></span><span style="color: #DD0000">My name is "$name". I am printing some $foo->foo.<br />Now, I am printing some {$foo->bar[1]}.<br />This should not print a capital 'A': \x41<br /></span><span style="color: #007700">EOT;<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
<p class="para">以上例程会输出:</p>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
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</pre></div></div>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
不象 heredoc 结构,nowdoc 结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量:
|
||
</p>
|
||
|
||
<div class="example" id="example-67">
|
||
<p><strong>Example #7 静态数据的示例</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo </span><span style="color: #007700">{<br /> public </span><span style="color: #0000BB">$bar </span><span style="color: #007700">= <<<'EOT'<br /></span><span style="color: #DD0000">bar<br /></span><span style="color: #007700">EOT;<br />}<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
</p></blockquote>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
Nowdoc 结构是在 PHP 5.3.0 中加入的。
|
||
</p>
|
||
</p></blockquote>
|
||
|
||
</div>
|
||
|
||
<div class="sect3" id="language.types.string.parsing">
|
||
<h4 class="title">变量解析</h4>
|
||
|
||
<p class="simpara">
|
||
当<span class="type"><span class="type 字符串">字符串</span></span>用双引号或 heredoc 结构定义时,其中的<a href="language.variables.html" class="link">变量</a>将会被解析。
|
||
</p>
|
||
|
||
<p class="simpara">
|
||
这里共有两种语法规则:一种<a href="language.types.string.html#language.types.string.parsing.simple" class="link">简单</a>规则,一种<a href="language.types.string.html#language.types.string.parsing.complex" class="link">复杂</a>规则。简单的语法规则是最常用和最方便的,它可以用最少的代码在一个
|
||
<span class="type"><a href="language.types.string.html" class="type string">string</a></span> 中嵌入一个变量,一个 <span class="type"><a href="language.types.array.html" class="type array">array</a></span> 的值,或一个 <span class="type"><a href="language.types.object.html" class="type object">object</a></span> 的属性。
|
||
</p>
|
||
|
||
<p class="simpara">
|
||
复杂规则语法的显著标记是用花括号包围的表达式。
|
||
</p>
|
||
|
||
<div class="sect4" id="language.types.string.parsing.simple">
|
||
<h5 class="title">简单语法</h5>
|
||
|
||
<p class="simpara">
|
||
当 PHP 解析器遇到一个美元符号(<em>$</em>)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线。
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$juice </span><span style="color: #007700">= </span><span style="color: #DD0000">"apple"</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"He drank some </span><span style="color: #0000BB">$juice</span><span style="color: #DD0000"> juice."</span><span style="color: #007700">.</span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Invalid. "s" is a valid character for a variable name, but the variable is $juice.<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"He drank some juice made of </span><span style="color: #0000BB">$juices</span><span style="color: #DD0000">."</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<p class="para">以上例程会输出:</p>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
He drank some apple juice.
|
||
He drank some juice made of .
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
|
||
<p class="simpara">
|
||
类似的,一个 <span class="type"><a href="language.types.array.html" class="type array">array</a></span> 索引或一个 <span class="type"><a href="language.types.object.html" class="type object">object</a></span>
|
||
属性也可被解析。数组索引要用方括号(<em>]</em>)来表示索引结束的边际,对象属性则是和上述的变量规则相同。
|
||
</p>
|
||
|
||
<div class="example" id="example-68">
|
||
<p><strong>Example #8 简单语法示例</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$juices </span><span style="color: #007700">= array(</span><span style="color: #DD0000">"apple"</span><span style="color: #007700">, </span><span style="color: #DD0000">"orange"</span><span style="color: #007700">, </span><span style="color: #DD0000">"koolaid1" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"purple"</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">"He drank some </span><span style="color: #0000BB">$juices</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]</span><span style="color: #DD0000"> juice."</span><span style="color: #007700">.</span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"He drank some </span><span style="color: #0000BB">$juices</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]</span><span style="color: #DD0000"> juice."</span><span style="color: #007700">.</span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"He drank some juice made of </span><span style="color: #0000BB">$juice</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]</span><span style="color: #DD0000">s."</span><span style="color: #007700">.</span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">// Won't work<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"He drank some </span><span style="color: #0000BB">$juices</span><span style="color: #007700">[</span><span style="color: #0000BB">koolaid1</span><span style="color: #007700">]</span><span style="color: #DD0000"> juice."</span><span style="color: #007700">.</span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />class </span><span style="color: #0000BB">people </span><span style="color: #007700">{<br /> public </span><span style="color: #0000BB">$john </span><span style="color: #007700">= </span><span style="color: #DD0000">"John Smith"</span><span style="color: #007700">;<br /> public </span><span style="color: #0000BB">$jane </span><span style="color: #007700">= </span><span style="color: #DD0000">"Jane Smith"</span><span style="color: #007700">;<br /> public </span><span style="color: #0000BB">$robert </span><span style="color: #007700">= </span><span style="color: #DD0000">"Robert Paulsen"</span><span style="color: #007700">;<br /> <br /> public </span><span style="color: #0000BB">$smith </span><span style="color: #007700">= </span><span style="color: #DD0000">"Smith"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$people </span><span style="color: #007700">= new </span><span style="color: #0000BB">people</span><span style="color: #007700">();<br /><br />echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$people</span><span style="color: #007700">-></span><span style="color: #0000BB">john</span><span style="color: #DD0000"> drank some </span><span style="color: #0000BB">$juices</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]</span><span style="color: #DD0000"> juice."</span><span style="color: #007700">.</span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$people</span><span style="color: #007700">-></span><span style="color: #0000BB">john</span><span style="color: #DD0000"> then said hello to </span><span style="color: #0000BB">$people</span><span style="color: #007700">-></span><span style="color: #0000BB">jane</span><span style="color: #DD0000">."</span><span style="color: #007700">.</span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$people</span><span style="color: #007700">-></span><span style="color: #0000BB">john</span><span style="color: #DD0000">'s wife greeted </span><span style="color: #0000BB">$people</span><span style="color: #007700">-></span><span style="color: #0000BB">robert</span><span style="color: #DD0000">."</span><span style="color: #007700">.</span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$people</span><span style="color: #007700">-></span><span style="color: #0000BB">robert</span><span style="color: #DD0000"> greeted the two </span><span style="color: #0000BB">$people</span><span style="color: #007700">-></span><span style="color: #0000BB">smiths</span><span style="color: #DD0000">."</span><span style="color: #007700">; </span><span style="color: #FF8000">// Won't work<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>以上例程会输出:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
He drank some apple juice.
|
||
He drank some orange juice.
|
||
He drank some juice made of s.
|
||
He drank some purple juice.
|
||
John Smith drank some apple juice.
|
||
John Smith then said hello to Jane Smith.
|
||
John Smith's wife greeted Robert Paulsen.
|
||
Robert Paulsen greeted the two .
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
|
||
<p class="simpara">
|
||
如果想要表达更复杂的结构,请用复杂语法。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="sect4" id="language.types.string.parsing.complex">
|
||
<h5 class="title">复杂(花括号)语法</h5>
|
||
|
||
<p class="simpara">
|
||
复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式。
|
||
</p>
|
||
|
||
<p class="simpara">
|
||
任何具有 <span class="type"><a href="language.types.string.html" class="type string">string</a></span>
|
||
表达的标量变量,数组单元或对象属性都可使用此语法。只需简单地像在
|
||
<span class="type"><a href="language.types.string.html" class="type string">string</a></span> 以外的地方那样写出表达式,然后用花括号
|
||
<em>{</em> 和 <em>}</em> 把它括起来即可。由于
|
||
<em>{</em> 无法被转义,只有 <em>$</em>
|
||
紧挨着 <em>{</em> 时才会被识别。可以用
|
||
<em>{\$</em> 来表达 <em>{$</em>。下面的示例可以更好的解释:
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// 显示所有错误<br /></span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">(</span><span style="color: #0000BB">E_ALL</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$great </span><span style="color: #007700">= </span><span style="color: #DD0000">'fantastic'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 无效,输出: This is { fantastic}<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This is { </span><span style="color: #0000BB">$great</span><span style="color: #DD0000">}"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 有效,输出: This is fantastic<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This is </span><span style="color: #007700">{</span><span style="color: #0000BB">$great</span><span style="color: #007700">}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"This is </span><span style="color: #007700">${</span><span style="color: #0000BB">great</span><span style="color: #007700">}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 有效<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This square is </span><span style="color: #007700">{</span><span style="color: #0000BB">$square</span><span style="color: #007700">-></span><span style="color: #0000BB">width</span><span style="color: #007700">}</span><span style="color: #DD0000">00 centimeters broad."</span><span style="color: #007700">; <br /><br /></span><span style="color: #FF8000">// 有效,只有通过花括号语法才能正确解析带引号的键名<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This works: </span><span style="color: #007700">{</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">'key'</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 有效<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This works: </span><span style="color: #007700">{</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">4</span><span style="color: #007700">][</span><span style="color: #0000BB">3</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 这是错误的表达式,因为就象 $foo[bar] 的格式在字符串以外也是错的一样。<br />// 换句话说,只有在 PHP 能找到常量 foo 的前提下才会正常工作;这里会产生一个<br />// E_NOTICE (undefined constant) 级别的错误。<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This is wrong: </span><span style="color: #007700">{</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">foo</span><span style="color: #007700">][</span><span style="color: #0000BB">3</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">; <br /><br /></span><span style="color: #FF8000">// 有效,当在字符串中使用多重数组时,一定要用括号将它括起来<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This works: </span><span style="color: #007700">{</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">'foo'</span><span style="color: #007700">][</span><span style="color: #0000BB">3</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 有效<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This works: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">'foo'</span><span style="color: #007700">][</span><span style="color: #0000BB">3</span><span style="color: #007700">];<br /><br />echo </span><span style="color: #DD0000">"This works too: </span><span style="color: #007700">{</span><span style="color: #0000BB">$obj</span><span style="color: #007700">-></span><span style="color: #0000BB">values</span><span style="color: #007700">[</span><span style="color: #0000BB">3</span><span style="color: #007700">]-></span><span style="color: #0000BB">name</span><span style="color: #007700">}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"This is the value of the var named </span><span style="color: #0000BB">$name</span><span style="color: #DD0000">: </span><span style="color: #007700">{${</span><span style="color: #0000BB">$name</span><span style="color: #007700">}}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"This is the value of the var named by the return value of getName(): </span><span style="color: #007700">{${</span><span style="color: #0000BB">getName</span><span style="color: #007700">()}}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"This is the value of the var named by the return value of \$object->getName(): </span><span style="color: #007700">{${</span><span style="color: #0000BB">$object</span><span style="color: #007700">-></span><span style="color: #0000BB">getName</span><span style="color: #007700">()}}</span><span style="color: #DD0000">"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 无效,输出: This is the return value of getName(): {getName()}<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"This is the return value of getName(): {getName()}"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
也可以在字符串中用此语法通过变量来调用类的属性。
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">foo </span><span style="color: #007700">{<br /> var </span><span style="color: #0000BB">$bar </span><span style="color: #007700">= </span><span style="color: #DD0000">'I am bar.'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= new </span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$bar </span><span style="color: #007700">= </span><span style="color: #DD0000">'bar'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$baz </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'foo'</span><span style="color: #007700">, </span><span style="color: #DD0000">'bar'</span><span style="color: #007700">, </span><span style="color: #DD0000">'baz'</span><span style="color: #007700">, </span><span style="color: #DD0000">'quux'</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-></span><span style="color: #0000BB">$bar</span><span style="color: #007700">}</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">$foo</span><span style="color: #007700">->{</span><span style="color: #0000BB">$baz</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]}}</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<p class="para">以上例程会输出:</p>
|
||
<div class="example-contents screen"><br />
|
||
I am bar.<br />
|
||
I am bar.<br />
|
||
</div>
|
||
</div>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
函数、方法、静态类变量和类常量只有在 PHP 5 以后才可在 <em>{$}</em>
|
||
中使用。然而,只有在该字符串被定义的命名空间中才可以将其值作为变量名来访问。只单一使用花括号
|
||
(<em>{}</em>) 无法处理从函数或方法的返回值或者类常量以及类静态变量的值。
|
||
</p>
|
||
</p></blockquote>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// 显示所有错误<br /></span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">(</span><span style="color: #0000BB">E_ALL</span><span style="color: #007700">);<br /><br />class </span><span style="color: #0000BB">beers </span><span style="color: #007700">{<br /> const </span><span style="color: #0000BB">softdrink </span><span style="color: #007700">= </span><span style="color: #DD0000">'rootbeer'</span><span style="color: #007700">;<br /> public static </span><span style="color: #0000BB">$ale </span><span style="color: #007700">= </span><span style="color: #DD0000">'ipa'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$rootbeer </span><span style="color: #007700">= </span><span style="color: #DD0000">'A & W'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$ipa </span><span style="color: #007700">= </span><span style="color: #DD0000">'Alexander Keith\'s'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 有效,输出: I'd like an A & W<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"I'd like an </span><span style="color: #007700">{${</span><span style="color: #0000BB">beers</span><span style="color: #007700">::</span><span style="color: #0000BB">softdrink</span><span style="color: #007700">}}</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 也有效,输出: I'd like an Alexander Keith's<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"I'd like an </span><span style="color: #007700">{${</span><span style="color: #0000BB">beers</span><span style="color: #007700">::</span><span style="color: #0000BB">$ale</span><span style="color: #007700">}}</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sect3" id="language.types.string.substr">
|
||
<h4 class="title">存取和修改字符串中的字符</h4>
|
||
|
||
<p class="para">
|
||
<span class="type"><a href="language.types.string.html" class="type string">string</a></span> 中的字符可以通过一个从 0 开始的下标,用类似
|
||
<span class="type"><a href="language.types.array.html" class="type array">array</a></span> 结构中的方括号包含对应的数字来访问和修改,比如
|
||
<var class="varname"><var class="varname">$str[42]</var></var>。可以把 <span class="type"><a href="language.types.string.html" class="type string">string</a></span>
|
||
当成字符组成的 <span class="type"><a href="language.types.array.html" class="type array">array</a></span>。函数 <span class="function"><a href="substr.html" class="function">substr()</a></span> 和
|
||
<span class="function"><a href="substr_replace.html" class="function">substr_replace()</a></span> 可用于操作多于一个字符的情况。
|
||
</p>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<span class="simpara">
|
||
<span class="type"><a href="language.types.string.html" class="type string">string</a></span> 也可用花括号访问,比如 <var class="varname"><var class="varname">$str{42}</var></var>。
|
||
</span>
|
||
</p></blockquote>
|
||
|
||
<div class="warning"><strong class="warning">Warning</strong>
|
||
<p class="simpara">
|
||
用超出字符串长度的下标写入将会拉长该字符串并以空格填充。非整数类型下标会被转换成整数。非法下标类型会产生一个
|
||
<strong><code>E_NOTICE</code></strong> 级别错误。用负数下标写入字符串时会产生一个 <strong><code>E_NOTICE</code></strong>
|
||
级别错误,用负数下标读取字符串时返回空字符串。写入时只用到了赋值字符串的第一个字符。用空字符串赋值则赋给的值是
|
||
NULL 字符。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="warning"><strong class="warning">Warning</strong>
|
||
<p class="simpara">
|
||
PHP 的字符串在内部是字节组成的数组。因此用花括号访问或修改字符串对多字节字符集很不安全。仅应对单字节编码例如
|
||
ISO-8859-1 的字符串进行此类操作。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="example" id="example-69">
|
||
<p><strong>Example #9 一些字符串示例</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// 取得字符串的第一个字符<br /></span><span style="color: #0000BB">$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'This is a test.'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$first </span><span style="color: #007700">= </span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br /><br /></span><span style="color: #FF8000">// 取得字符串的第三个字符<br /></span><span style="color: #0000BB">$third </span><span style="color: #007700">= </span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">];<br /><br /></span><span style="color: #FF8000">// 取得字符串的最后一个字符<br /></span><span style="color: #0000BB">$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'This is still a test.'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$last </span><span style="color: #007700">= </span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">)-</span><span style="color: #0000BB">1</span><span style="color: #007700">]; <br /><br /></span><span style="color: #FF8000">// 修改字符串的最后一个字符<br /></span><span style="color: #0000BB">$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'Look at the sea'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">)-</span><span style="color: #0000BB">1</span><span style="color: #007700">] = </span><span style="color: #DD0000">'e'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
自 PHP 5.4 起字符串下标必须为整数或可转换为整数的字符串,否则会发出警告。之前类似
|
||
<em>"foo"</em> 的下标会无声地转换成 <em>0</em>。
|
||
</p>
|
||
|
||
<div class="example" id="example-70">
|
||
<p><strong>Example #10 PHP 5.3 和 PHP 5.4 的区别</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'abc'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #DD0000">'1'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(isset(</span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #DD0000">'1'</span><span style="color: #007700">]));<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #DD0000">'1.0'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(isset(</span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #DD0000">'1.0'</span><span style="color: #007700">]));<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #DD0000">'x'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(isset(</span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #DD0000">'x'</span><span style="color: #007700">]));<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #DD0000">'1x'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(isset(</span><span style="color: #0000BB">$str</span><span style="color: #007700">[</span><span style="color: #DD0000">'1x'</span><span style="color: #007700">]));<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>以上例程在PHP 5.3中的输出:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
string(1) "b"
|
||
bool(true)
|
||
string(1) "b"
|
||
bool(true)
|
||
string(1) "a"
|
||
bool(true)
|
||
string(1) "b"
|
||
bool(true)
|
||
</pre></div>
|
||
</div>
|
||
<div class="example-contents"><p>以上例程在PHP 5.4中的输出:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
string(1) "b"
|
||
bool(true)
|
||
|
||
Warning: Illegal string offset '1.0' in /tmp/t.php on line 7
|
||
string(1) "b"
|
||
bool(false)
|
||
|
||
Warning: Illegal string offset 'x' in /tmp/t.php on line 9
|
||
string(1) "a"
|
||
bool(false)
|
||
string(1) "b"
|
||
bool(false)
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
用 <em>[]</em> 或 <em>{}</em>
|
||
访问任何其它类型(不包括数组或具有相应接口的对象实现)的变量只会无声地返回 <strong><code>NULL</code></strong>。
|
||
</p>
|
||
</p></blockquote>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
PHP 5.5 增加了直接在字符串原型中用
|
||
<em>[]</em> 或 <em>{}</em> 访问字符的支持。
|
||
</p>
|
||
</p></blockquote>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sect2" id="language.types.string.useful-funcs">
|
||
<h3 class="title">有用的函数和运算符</h3>
|
||
|
||
<p class="para">
|
||
字符串可以用 '.'(点)运算符连接起来,注意
|
||
'+'(加号)运算符<em class="emphasis">没有</em>这个功能。更多信息参考<a href="language.operators.string.html" class="link">字符串运算符</a>。
|
||
</p>
|
||
|
||
<p class="para">
|
||
对于 <span class="type"><a href="language.types.string.html" class="type string">string</a></span> 的操作有很多有用的函数。
|
||
</p>
|
||
|
||
<p class="simpara">
|
||
可以参考<a href="ref.strings.html" class="link">字符串函数</a>了解大部分函数,高级的查找与替换功能可以参考<a href="ref.regex.html" class="link">正则表达式函数</a>或
|
||
<a href="ref.pcre.html" class="link">Perl 兼容正则表达式函数</a>。
|
||
</p>
|
||
|
||
<p class="simpara">
|
||
另外还有 <a href="ref.url.html" class="link">URL
|
||
字符串函数</a>,也有加密/解密字符串的函数(<a href="ref.mcrypt.html" class="link">mcrypt</a> 和
|
||
<a href="ref.mhash.html" class="link">mhash</a>)。
|
||
</p>
|
||
|
||
<p class="simpara">
|
||
最后,可以参考<a href="ref.ctype.html" class="link">字符类型函数</a>。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="sect2" id="language.types.string.casting">
|
||
<h3 class="title">转换成字符串</h3>
|
||
|
||
<p class="para">
|
||
一个值可以通过在其前面加上 <em>(string)</em> 或用 <span class="function"><a href="strval.html" class="function">strval()</a></span>
|
||
函数来转变成字符串。在一个需要字符串的表达式中,会自动转换为
|
||
<span class="type"><a href="language.types.string.html" class="type string">string</a></span>。比如在使用函数 <span class="function"><a href="echo.html" class="function">echo</a></span> 或 <span class="function"><a href="print.html" class="function">print</a></span>
|
||
时,或在一个变量和一个 <span class="type"><a href="language.types.string.html" class="type string">string</a></span> 进行比较时,就会发生这种转换。<a href="language.types.html" class="link">类型</a>和<a href="language.types.type-juggling.html" class="link">类型转换</a>可以更好的解释下面的事情,也可参考函数
|
||
<span class="function"><a href="settype.html" class="function">settype()</a></span>。
|
||
</p>
|
||
|
||
<p class="para">
|
||
一个布尔值 <span class="type"><a href="language.types.boolean.html" class="type boolean">boolean</a></span> 的 <strong><code>TRUE</code></strong> 被转换成 <span class="type"><a href="language.types.string.html" class="type string">string</a></span> 的
|
||
<em>"1"</em>。<span class="type"><a href="language.types.boolean.html" class="type Boolean">Boolean</a></span> 的 <strong><code>FALSE</code></strong> 被转换成
|
||
<em>""</em>(空字符串)。这种转换可以在 <span class="type"><a href="language.types.boolean.html" class="type boolean">boolean</a></span>
|
||
和 <span class="type"><a href="language.types.string.html" class="type string">string</a></span> 之间相互进行。
|
||
</p>
|
||
|
||
<p class="para">
|
||
一个整数 <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span> 或浮点数 <span class="type"><a href="language.types.float.html" class="type float">float</a></span> 被转换为数字的字面样式的
|
||
<span class="type"><a href="language.types.string.html" class="type string">string</a></span>(包括 <span class="type"><a href="language.types.float.html" class="type float">float</a></span>
|
||
中的指数部分)。使用指数计数法的浮点数(<em>4.1E+6</em>)也可转换。
|
||
</p>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
在脚本的区域(category LC_NUMERIC)中定义了十进制小数点字符。参见 <span class="function"><a href="setlocale.html" class="function">setlocale()</a></span>。
|
||
</p>
|
||
</p></blockquote>
|
||
|
||
<p class="para">
|
||
数组 <span class="type"><a href="language.types.array.html" class="type array">array</a></span> 总是转换成字符串
|
||
<em>"Array"</em>,因此,<span class="function"><a href="echo.html" class="function">echo</a></span> 和
|
||
<span class="function"><a href="print.html" class="function">print</a></span> 无法显示出该<span class="type"><span class="type 数组">数组</span></span>的内容。要显示某个单元,可以用
|
||
<em>echo $arr['foo']</em> 这种结构。要显示整个数组内容见下文。
|
||
</p>
|
||
|
||
<p class="para">
|
||
在 PHP 4 中对象 <span class="type"><a href="language.types.object.html" class="type object">object</a></span> 总是被转换成字符串
|
||
<em>"Object"</em>,如果为了调试原因需要打印出对象的值,请继续阅读下文。为了得到对象的类的名称,可以用
|
||
<span class="function"><a href="get_class.html" class="function">get_class()</a></span> 函数。自 PHP 5 起,适当时可以用 <a href="language.oop5.magic.html" class="link">__toString</a> 方法。
|
||
</p>
|
||
|
||
<p class="para">
|
||
资源 <span class="type"><a href="language.types.resource.html" class="type resource">resource</a></span> 总会被转变成 <em>"Resource id #1" </em>
|
||
这种结构的字符串,其中的 <em>1</em> 是 PHP
|
||
在运行时分配给该 <span class="type"><a href="language.types.resource.html" class="type resource">resource</a></span> 的唯一值。不要依赖此结构,可能会有变更。要得到一个
|
||
<span class="type"><a href="language.types.resource.html" class="type resource">resource</a></span> 的类型,可以用函数 <span class="function"><a href="get_resource_type.html" class="function">get_resource_type()</a></span>。
|
||
</p>
|
||
|
||
<p class="para">
|
||
<strong><code>NULL</code></strong> 总是被转变成空字符串。
|
||
</p>
|
||
|
||
<p class="para">
|
||
如上面所说的,直接把 <span class="type"><a href="language.types.array.html" class="type array">array</a></span>,<span class="type"><a href="language.types.object.html" class="type object">object</a></span> 或 <span class="type"><a href="language.types.resource.html" class="type resource">resource</a></span>
|
||
转换成 <span class="type"><a href="language.types.string.html" class="type string">string</a></span> 不会得到除了其类型之外的任何有用信息。可以使用函数
|
||
<span class="function"><a href="print_r.html" class="function">print_r()</a></span> 和 <span class="function"><a href="var_dump.html" class="function">var_dump()</a></span> 列出这些类型的内容。
|
||
</p>
|
||
|
||
<p class="para">
|
||
大部分的 PHP 值可以转变成 <span class="type"><a href="language.types.string.html" class="type string">string</a></span> 来永久保存,这被称作串行化,可以用函数
|
||
<span class="function"><a href="serialize.html" class="function">serialize()</a></span> 来实现。如果 PHP 引擎设定支持
|
||
<a href="ref.wddx.html" class="link">WDDX</a>,PHP 值也可被串行化为格式良好的 XML 文本。
|
||
</p>
|
||
|
||
</div>
|
||
|
||
<div class="sect2" id="language.types.string.conversion">
|
||
<h3 class="title">字符串转换为数值</h3>
|
||
|
||
<p class="simpara">
|
||
当一个字符串被当作一个数值来取值,其结果和类型如下:
|
||
</p>
|
||
|
||
<p class="simpara">
|
||
如果该字符串没有包含 '.','e' 或 'E'
|
||
并且其数字值在整型的范围之内(由 <strong><code>PHP_INT_MAX</code></strong>
|
||
所定义),该字符串将被当成 <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span>
|
||
来取值。其它所有情况下都被作为 <span class="type"><a href="language.types.float.html" class="type float">float</a></span> 来取值。
|
||
</p>
|
||
|
||
<p class="para">
|
||
该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为
|
||
0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由
|
||
'e' 或 'E' 后面跟着一个或多个数字构成。
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">1 </span><span style="color: #007700">+ </span><span style="color: #DD0000">"10.5"</span><span style="color: #007700">; </span><span style="color: #FF8000">// $foo is float (11.5)<br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">1 </span><span style="color: #007700">+ </span><span style="color: #DD0000">"-1.3e3"</span><span style="color: #007700">; </span><span style="color: #FF8000">// $foo is float (-1299)<br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">1 </span><span style="color: #007700">+ </span><span style="color: #DD0000">"bob-1.3e3"</span><span style="color: #007700">; </span><span style="color: #FF8000">// $foo is integer (1)<br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">1 </span><span style="color: #007700">+ </span><span style="color: #DD0000">"bob3"</span><span style="color: #007700">; </span><span style="color: #FF8000">// $foo is integer (1)<br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">1 </span><span style="color: #007700">+ </span><span style="color: #DD0000">"10 Small Pigs"</span><span style="color: #007700">; </span><span style="color: #FF8000">// $foo is integer (11)<br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">4 </span><span style="color: #007700">+ </span><span style="color: #DD0000">"10.2 Little Piggies"</span><span style="color: #007700">; </span><span style="color: #FF8000">// $foo is float (14.2)<br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #DD0000">"10.0 pigs " </span><span style="color: #007700">+ </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// $foo is float (11)<br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= </span><span style="color: #DD0000">"10.0 pigs " </span><span style="color: #007700">+ </span><span style="color: #0000BB">1.0</span><span style="color: #007700">; </span><span style="color: #FF8000">// $foo is float (11) <br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="simpara">
|
||
更多信息可以参考 Unix 手册中的 strtod(3)。
|
||
</p>
|
||
|
||
<p class="para">
|
||
本节中的示例可以通过复制/粘贴到下面的代码中来显示:
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"\$foo==</span><span style="color: #0000BB">$foo</span><span style="color: #DD0000">; type is " </span><span style="color: #007700">. </span><span style="color: #0000BB">gettype </span><span style="color: #007700">(</span><span style="color: #0000BB">$foo</span><span style="color: #007700">) . </span><span style="color: #DD0000">"<br />\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
不要想像在 C 语言中的那样,通过将一个字符转换成整数以得到其代码。使用函数
|
||
<span class="function"><a href="ord.html" class="function">ord()</a></span> 和 <span class="function"><a href="chr.html" class="function">chr()</a></span> 实现 ASCII 码和字符间的转换。
|
||
</p>
|
||
|
||
</div>
|
||
|
||
<div class="sect2" id="language.types.string.details">
|
||
|
||
<h3 class="title">字符串类型详解</h3>
|
||
|
||
<p class="para">
|
||
PHP 中的 <span class="type"><a href="language.types.string.html" class="type string">string</a></span>
|
||
的实现方式是一个由字节组成的数组再加上一个整数指明缓冲区长度。并无如何将字节转换成字符的信息,由程序员来决定。字符串由什么值来组成并无限制;特别的,其值为
|
||
<em>0</em>(“NUL bytes”)的字节可以处于字符串任何位置(不过有几个函数,在本手册中被称为非“二进制安全”的,也许会把
|
||
NUL 字节之后的数据全都忽略)。
|
||
</p>
|
||
<p class="para">
|
||
字符串类型的此特性解释了为什么 PHP 中没有单独的“byte”类型 -
|
||
已经用字符串来代替了。返回非文本值的函数 - 例如从网络套接字读取的任意数据
|
||
- 仍会返回字符串。
|
||
</p>
|
||
<p class="para">
|
||
由于 PHP 并不特别指明字符串的编码,那字符串到底是怎样编码的呢?例如字符串
|
||
<em>"á"</em> 到底是等于
|
||
<em>"\xE1"</em>(ISO-8859-1),<em>"\xC3\xA1"</em>(UTF-8,C
|
||
form),<em>"\x61\xCC\x81"</em>(UTF-8,D
|
||
form)还是任何其它可能的表达呢?答案是字符串会被按照该脚本文件相同的编码方式来编码。因此如果一个脚本的编码是
|
||
ISO-8859-1,则其中的字符串也会被编码为 ISO-8859-1,以此类推。不过这并不适用于激活了 Zend Multibyte
|
||
时;此时脚本可以是以任何方式编码的(明确指定或被自动检测)然后被转换为某种内部编码,然后字符串将被用此方式编码。注意脚本的编码有一些约束(如果激活了 Zend Multibyte 则是其内部编码)-
|
||
这意味着此编码应该是 ASCII 的兼容超集,例如
|
||
UTF-8 或 ISO-8859-1。不过要注意,依赖状态的编码其中相同的字节值可以用于首字母和非首字母而转换状态,这可能会造成问题。
|
||
</p>
|
||
<p class="para">
|
||
当然了,要做到有用,操作文本的函数必须假定字符串是如何编码的。不幸的是,PHP
|
||
关于此的函数有很多变种:
|
||
</p>
|
||
<ul class="itemizedlist">
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
某些函数假定字符串是以单字节编码的,但并不需要将字节解释为特定的字符。例如
|
||
<span class="function"><a href="substr.html" class="function">substr()</a></span>,<span class="function"><a href="strpos.html" class="function">strpos()</a></span>,<span class="function"><a href="strlen.html" class="function">strlen()</a></span> 和
|
||
<span class="function"><a href="strcmp.html" class="function">strcmp()</a></span>。理解这些函数的另一种方法是它们作用于内存缓冲区,即按照字节和字节下标操作。
|
||
</span>
|
||
</li>
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
某些函数被传递入了字符串的编码方式,也可能会假定默认无此信息。例如
|
||
<span class="function"><a href="htmlentities.html" class="function">htmlentities()</a></span> 和
|
||
<a href="book.mbstring.html" class="link">mbstring</a> 扩展中的大部分函数。
|
||
</span>
|
||
</li>
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
其它函数使用了当前区域(见 <span class="function"><a href="setlocale.html" class="function">setlocale()</a></span>),但是逐字节操作。例如
|
||
<span class="function"><a href="strcasecmp.html" class="function">strcasecmp()</a></span>,<span class="function"><a href="strtoupper.html" class="function">strtoupper()</a></span> 和
|
||
<span class="function"><a href="ucfirst.html" class="function">ucfirst()</a></span>。这意味着这些函数只能用于单字节编码,而且编码要与区域匹配。例如
|
||
<em>strtoupper("á")</em> 在区域设定正确并且 <em>á</em>
|
||
是单字节编码时会返回 <em>"Á"</em>。如果是用 UTF-8
|
||
编码则不会返回正确结果,其结果根据当前区域有可能返回损坏的值。
|
||
</span>
|
||
</li>
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
最后一些函数会假定字符串是使用某特定编码的,通常是
|
||
UTF-8。<a href="book.intl.html" class="link">intl</a> 扩展和
|
||
<a href="book.pcre.html" class="link">PCRE</a>(上例中仅在使用了
|
||
<em>u</em> 修饰符时)扩展中的大部分函数都是这样。尽管这是由于其特殊用途,<span class="function"><a href="utf8_decode.html" class="function">utf8_decode()</a></span>
|
||
会假定 UTF-8 编码而 <span class="function"><a href="utf8_encode.html" class="function">utf8_encode()</a></span> 会假定
|
||
ISO-8859-1 编码。
|
||
</span>
|
||
</li>
|
||
</ul>
|
||
|
||
<p class="para">
|
||
最后,要书写能够正确使用 Unicode 的程序依赖于很小心地避免那些可能会损坏数据的函数。要使用来自于
|
||
<a href="book.intl.html" class="link">intl</a> 和 <a href="book.mbstring.html" class="link">mbstring</a>
|
||
扩展的函数。不过使用能处理 Unicode 编码的函数只是个开始。不管用何种语言提供的函数,最基本的还是了解
|
||
Unicode 规格。例如一个程序如果假定只有大写和小写,那可是大错特错。
|
||
</p>
|
||
</div>
|
||
|
||
</div></div></div></body></html> |