做自(zì)由與創造的先行者

String 字符串

PHP中文(wén)手冊

一個字符串 string 就是由一系列的字符組成,其中每個字符等同于一個字節。這(zhè)意味着 PHP 隻能(néng)支持 256 的字符集,因此不支持 Unicode 。詳見字符串類型詳解。

注意: 在 32 位版本中,string 最大(dà)可以達到(dào) 2GB(最多 2147483647 字節)。

語法 ¶

一個字符串可以用(yòng) 4 種方式表達:

單引号

雙引号

heredoc 語法結構

nowdoc 語法結構

單引号 ¶

定義一個字符串的最簡單的方法是用(yòng)單引号把它包圍起來(lái)(字符 ')。

要表達一個單引号自(zì)身,需在它的前面加個反斜線(\)來(lái)轉義。要表達一個反斜線自(zì)身,則用(yòng)兩個反斜線(\\)。其它任何方式的反斜線都會(huì)被當成反斜線本身:也(yě)就是說如果想使用(yòng)其它轉義序列例如 \r 或者 \n,并不代表任何特殊含義,就單純是這(zhè)兩個字符本身。

注意: 不像雙引号和(hé) heredoc 語法結構,在單引号字符串中的變量和(hé)特殊字符的轉義序列将不會(huì)被替換。

<?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 将對(duì)以下(xià)特殊的字符進行解析:

轉義字符

轉義字符
序列 含義
\n 換行(ASCII 字符集中的 LF 或 0x0A (10))
\r 回車(ASCII 字符集中的 CR 或 0x0D (13))
\t 水(shuǐ)平制表符(ASCII 字符集中的 HT 或 0x09 (9))
\v 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))
\e Escape(ASCII 字符集中的 ESC 或 0x1B (27))
\f 換頁(ASCII 字符集中的 FF 或 0x0C (12))
\\ 反斜線
\$ 美(měi)元标記
\" 雙引号
\[0-7]{1,3} 符合該正則表達式序列的是一個以八進制方式來(lái)表達的字符,which silently overflows to fit in a byte (e.g. "\400" === "\000")
\x[0-9A-Fa-f]{1,2} 符合該正則表達式序列的是一個以十六進制方式來(lái)表達的字符
\u{[0-9A-Fa-f]+} 匹配正則表達式的字符序列是 unicode 碼位, 該碼位能(néng)作(zuò)爲 UTF-8 的表達方式輸出字符串

和(hé)單引号字符串一樣,轉義任何其它字符都會(huì)導緻反斜線被顯示出來(lái)。

用(yòng)雙引号定義的字符串最重要的特征是變量會(huì)被解析,詳見變量解析。

Heredoc 結構 ¶

第三種表達字符串的方法是用(yòng) heredoc 句法結構:<<<。在該運算(suàn)符之後要提供一個标識符,然後換行。接下(xià)來(lái)是字符串 string 本身,最後要用(yòng)前面定義的标識符作(zuò)爲結束标志。

結束标識符可以使用(yòng)空(kōng)格或制表符(tab)縮進,此時(shí)文(wén)檔字符串會(huì)删除所有縮進。 在 PHP 7.3.0 之前的版本中,結束時(shí)所引用(yòng)的标識符必須在該行的第一列。

而且,标識符的命名也(yě)要像其它标簽一樣遵守 PHP 的規則:隻能(néng)包含字母、數字和(hé)下(xià)劃線,并且必須以字母和(hé)下(xià)劃線作(zuò)爲開(kāi)頭。

示例 #1 PHP 7.3.0 之後的基礎 Heredoc 示例

<?php

// 無縮進

echo <<<END

a

b

c

\n

END;

// 4 空(kōng)格縮進

echo <<<END

a

b

c

END;

以上(shàng)例程在 PHP 7.3 中的輸出:

a

b

c

a

b

c

如果結束标識符的縮進超過内容的任何一行的縮進,則将抛出 ParseError 異常:

示例 #2 結束标識符的縮進不能(néng)超過正文(wén)的任何一行

<?php

echo <<<END

a

b

c

END;

以上(shàng)例程在 PHP 7.3 中的輸出:

PHP Parse error: Invalid body indentation level (expecting an indentation level of at least 3) in example.php on line 4

制表符也(yě)可以縮進結束标識符,但(dàn)是,關于縮進結束标識符和(hé)内容, 制表符和(hé)空(kōng)格不能(néng)混合使用(yòng)。在以上(shàng)任何情況下(xià), 将會(huì)抛出 ParseError 異常。 之所以包含這(zhè)些(xiē)空(kōng)白(bái)限制,是因爲混合制表符和(hé)空(kōng)格來(lái)縮進不利于易讀性。

示例 #3 内容(空(kōng)白(bái))和(hé)結束标識符的不同縮進

<?php

// 以下(xià)所有代碼都不起作(zuò)用(yòng)。

// 正文(wén)(空(kōng)格)和(hé)結束标記(制表符),不同的縮進

{

echo <<<END

a

END;

}

// 在正文(wén)中混合空(kōng)格和(hé)制表符

{

echo <<<END

a

END;

}

// 在結束标記中混合空(kōng)格和(hé)制表符

{

echo <<<END

a

END;

}

以上(shàng)例程在 PHP 7.3 中的輸出:

PHP Parse error: Invalid indentation - tabs and spaces cannot be mixed in example.php line 8

内容字符串的結束标識符後面不需要跟分号或者換行符。 例如,從(cóng) PHP 7.3.0 開(kāi)始允許以下(xià)代碼:

示例 #4 在結束标識符後繼續表達式

<?php

$values = [<<<END

a

b

c

END, 'd e f'];

var_dump($values);

以上(shàng)例程在 PHP 7.3 中的輸出:

array(2) {

[0] =>

string(11) "a

b

c"

[1] =>

string(5) "d e f"

}

警告

如果在某一行的開(kāi)頭找到(dào)了(le)結束标識符,那麽不管它是否是另外(wài)一個單詞的一部分, 它都可能(néng)看(kàn)作(zuò)結束标識符并引起 ParseError。

示例 #5 字符串内容中的結束标識符往往會(huì)導緻 ParseError

<?php

$values = [<<<END

a

b

END ING

END, 'd e f'];

以上(shàng)例程在 PHP 7.3 中的輸出:

PHP Parse error: syntax error, unexpected identifier "ING", expecting "]" in example.php on line 6

爲了(le)避免這(zhè)個問題,遵循以下(xià)簡單的規則較爲安全: 不要選擇正文(wén)内容中出現(xiàn)的詞作(zuò)爲結束标識符。

警告

在 PHP 7.3.0 之前,請(qǐng)務必注意,帶有結束标識符的行不能(néng)包含除 (;)外(wài)的任何其他(tā)字符。 這(zhè)意味着标識符不能(néng)縮進,分号的前後也(yě)不能(néng)有任何空(kōng)白(bái)或制表符。更重要的是結束标識符的前面必須是個被本地操作(zuò)系統認可的換行,比如在 UNIX 和(hé) macOS 系統中是 \n,而結束定界符之後也(yě)必須緊跟一個換行。

如果不遵守該規則導緻結束标識不“幹淨”,PHP 将認爲它不是結束标識符而繼續尋找。如果在文(wén)件結束前也(yě)沒有找到(dào)一個正确的結束标識符,PHP 将會(huì)在最後一行産生一個解析錯誤。

示例 #6 PHP 7.3.0 之前的錯誤示例

<?php

class foo {

public $bar = <<<EOT

bar

EOT;

}

// 不能(néng)縮進标識符

?>

示例 #7 即使在 PHP 7.3.0 之前也(yě)合法的示例

<?php

class foo {

public $bar = <<<EOT

bar

EOT;

}

?>

Heredocs 結構不能(néng)用(yòng)來(lái)初始化類的屬性。

Heredoc 結構就象是沒有雙引号的 string,這(zhè)就是說在 heredoc 結構中單引号不用(yòng)被轉義,但(dàn)是上(shàng)文(wén)中列出的轉義序列還可以使用(yòng)。變量将被替換,但(dàn)在 heredoc 結構中含有複雜(zá)的變量時(shí)要像 string 一樣格外(wài)小(xiǎo)心。

示例 #8 Heredoc 結構的字符串示例

<?php

$str = <<<EOD

Example of string

spanning multiple lines

using heredoc syntax.

EOD;

/* 含有變量的更複雜(zá)示例 */

class foo

{

var $foo;

var $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 print a capital 'A': \x41

EOT;

?>

以上(shàng)例程會(huì)輸出:

My name is "MyName". I am printing some Foo.

Now, I am printing some Bar2.

This should print a capital 'A': A

也(yě)可以把 Heredoc 結構用(yòng)在函數參數中來(lái)傳遞數據:

示例 #9 Heredoc 結構在參數中的示例

<?php

var_dump(array(<<<EOD

foobar!

EOD

));

?>

可以用(yòng) Heredoc 結構來(lái)初始化靜态變量和(hé)類的屬性和(hé)常量:

示例 #10 使用(yòng) Heredoc 結構來(lái)初始化靜态值

<?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 結構中用(yòng)雙引号來(lái)聲明(míng)标識符:

示例 #11 在 heredoc 結構中使用(yòng)雙引号

<?php

echo <<<"FOOBAR"

Hello World!

FOOBAR;

?>

Nowdoc 結構 ¶

就象 heredoc 結構類似于雙引号字符串,Nowdoc 結構是類似于單引号字符串的。Nowdoc 結構很(hěn)象 heredoc 結構,但(dàn)是 nowdoc 中不進行解析操作(zuò)。這(zhè)種結構很(hěn)适合用(yòng)于嵌入 PHP 代碼或其它大(dà)段文(wén)本而無需對(duì)其中的特殊字符進行轉義。與 SGML 的 <![CDATA[ ]]> 結構是用(yòng)來(lái)聲明(míng)大(dà)段的不用(yòng)解析的文(wén)本類似,nowdoc 結構也(yě)有相同的特征。

一個 nowdoc 結構也(yě)用(yòng)和(hé) heredocs 結構一樣的标記 <<<, 但(dàn)是跟在後面的标識符要用(yòng)單引号括起來(lái),即 <<<'EOT'。Heredoc 結構的所有規則也(yě)同樣适用(yòng)于 nowdoc 結構,尤其是結束标識符的規則。

示例 #12 Nowdoc 結構字符串示例

<?php

echo <<<'EOD'

Example of string spanning multiple lines

using nowdoc syntax. Backslashes are always treated literally,

e.g. \\ and \'.

EOD;

以上(shàng)例程會(huì)輸出:

Example of string spanning multiple lines

using nowdoc syntax. Backslashes are always treated literally,

e.g. \\ and \'.

示例 #13 含變量引用(yòng)的 Nowdoc 字符串示例

<?php

/* 含有變量的更複雜(zá)的示例 */

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;

?>

以上(shàng)例程會(huì)輸出:

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

示例 #14 靜态數據的示例

<?php

class foo {

public $bar = <<<'EOT'

bar

EOT;

}

?>

注意:

Nowdoc 結構是在 PHP 5.3.0 中加入的。

變量解析 ¶

當字符串用(yòng)雙引号或 heredoc 結構定義時(shí),其中的變量将會(huì)被解析。

這(zhè)裏共有兩種語法規則:一種簡單規則,一種複雜(zá)規則。簡單的語法規則是最常用(yòng)和(hé)最方便的,它可以用(yòng)最少的代碼在一個 string 中嵌入一個變量,一個 array 的值,或一個 object 的屬性。

複雜(zá)規則語法的顯著标記是用(yòng)花(huā)括号包圍的表達式。

簡單語法

當 PHP 解析器遇到(dào)一個美(měi)元符号($)時(shí),它會(huì)和(hé)其它很(hěn)多解析器一樣,去組合盡量多的标識以形成一個合法的變量名。可以用(yòng)花(huā)括号來(lái)明(míng)确變量名的界線。

<?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.";

?>

以上(shàng)例程會(huì)輸出:

He drank some apple juice.

He drank some juice made of .

He drank some juice made of apples.

類似的,一個 array 索引或一個 object 屬性也(yě)可被解析。數組索引要用(yòng)方括号(])來(lái)表示索引結束的邊際,對(duì)象屬性則是和(hé)上(shàng)述的變量規則相同。

示例 #15 簡單語法示例

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

?>

以上(shàng)例程會(huì)輸出:

He drank some apple juice.

He drank some orange juice.

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 .

從(cóng) PHP 7.1.0 起,還支持負數字索引。

示例 #16 負數索引

<?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;

?>

以上(shàng)例程會(huì)輸出:

The character at index -2 is n.

Changing the character at index -3 to o gives strong.

如果想要表達更複雜(zá)的結構,請(qǐng)用(yòng)複雜(zá)語法。

複雜(zá)(花(huā)括号)語法

複雜(zá)語法不是因爲其語法複雜(zá)而得名,而是因爲它可以使用(yòng)複雜(zá)的表達式。

任何具有 string 表達的标量變量,數組單元或對(duì)象屬性都可使用(yòng)此語法。 表達式的書寫方式與在 string 以外(wài)的方式相同, 然後用(yòng)花(huā)括号 { 和(hé) } 把它括起來(lái)即可。由于 { 無法被轉義,隻有 $ 緊挨着 { 時(shí)才會(huì)被識别。可以用(yòng) {\$ 來(lái)表達 {$。下(xià)面的示例可以更好(hǎo)的解釋:

<?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.";

// 有效,隻有通過花(huā)括号語法才能(néng)正确解析帶引号的鍵名

echo "This works: {$arr['key']}";

// 有效

echo "This works: {$arr[4][3]}";

// 這(zhè)是錯誤的表達式,因爲就象 $foo[bar] 的格式在字符串以外(wài)也(yě)是錯的一樣。

// 換句話(huà)說,隻有在 PHP 能(néng)找到(dào)常量 foo 的前提下(xià)才會(huì)正常工(gōng)作(zuò);這(zhè)裏會(huì)産生一個

// E_NOTICE (undefined constant) 級别的錯誤。

echo "This is wrong: {$arr[foo][3]}";

// 有效,當在字符串中使用(yòng)多重數組時(shí),一定要用(yòng)括号将它括起來(lái)

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"

?>

也(yě)可以在字符串中用(yòng)此語法通過變量來(lái)調用(yòng)類的屬性。

<?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";

?>

以上(shàng)例程會(huì)輸出:

I am bar.

I am bar.

注意:

函數、方法、靜态類變量和(hé)類常量可使用(yòng) {$} ,在該字符串被定義的命名空(kōng)間中将其值作(zuò)爲變量名來(lái)訪問。隻單一使用(yòng)花(huā)括号 ({}) 無法處理(lǐ)從(cóng)函數或方法的返回值或者類常量以及類靜态變量的值。

<?php

// 顯示所有錯誤

error_reporting(E_ALL);

class beers {

const softdrink = 'rootbeer';

public static $ale = 'ipa';

}

$rootbeer = 'A & W';

$ipa = 'Alexander Keith\'s';

// 有效,輸出: I'd like an A & W

echo "I'd like an {${beers::softdrink}}\n";

// 也(yě)有效,輸出: I'd like an Alexander Keith's

echo "I'd like an {${beers::$ale}}\n";

?>

存取和(hé)修改字符串中的字符 ¶

string 中的字符可以通過一個從(cóng) 0 開(kāi)始的下(xià)标,用(yòng)類似 array 結構中的方括号包含對(duì)應的數字來(lái)訪問和(hé)修改,比如 $str[42]。可以把 string 當成字符組成的 array。函數 substr() 和(hé) substr_replace() 可用(yòng)于操作(zuò)多于一個字符的情況。

注意: 從(cóng) PHP 7.1.0 開(kāi)始,還支持 string 負偏移量。從(cóng) string 尾部到(dào)指定位置的偏移量。 以前,負偏移量讀取時(shí)(返回空(kōng) string)會(huì)發出 E_NOTICE, 寫入時(shí)(string 保持不變)會(huì)發出 E_WARNING。

注意: PHP 8.0.0 之前, 出于同樣的目的,可以使用(yòng)大(dà)括号訪問 string,例如 $str{42}。 從(cóng) PHP 7.4.0 起,此大(dà)括号語法被棄用(yòng),自(zì) PHP 8.0.0 開(kāi)始不再受支持。

警告

用(yòng)超出字符串長度的下(xià)标寫入将會(huì)拉長該字符串并以空(kōng)格填充。非整數類型下(xià)标會(huì)被轉換成整數。非法下(xià)标類型會(huì)産生一個 E_WARNING 級别錯誤。 寫入時(shí)隻用(yòng)到(dào)了(le)賦值字符串的第一個字符。 PHP 7.1.0 開(kāi)始,用(yòng)空(kōng)字符串賦值會(huì)導緻 fatal 錯誤;在之前賦給的值是 NULL 字符。

警告

PHP 的字符串在内部是字節組成的數組。因此用(yòng)花(huā)括号訪問或修改字符串對(duì)多字節字符集很(hěn)不安全。僅應對(duì)單字節編碼例如 ISO-8859-1 的字符串進行此類操作(zuò)。

注意: 從(cóng) PHP 7.1.0 開(kāi)始,對(duì)空(kōng)字符串應用(yòng)空(kōng)索引運算(suàn)符會(huì)引發緻命錯誤。 以前是空(kōng)字符串會(huì)被靜默轉爲數組。

示例 #17 一些(xiē)字符串示例

<?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';

?>

字符串下(xià)标必須爲整數或可轉換爲整數的字符串,否則會(huì)發出警告。之前類似 "foo" 的下(xià)标會(huì)無聲地轉換成 0。

示例 #18 字符串無效下(xià)标的例子

<?php

$str = 'abc';

var_dump($str['1']);

var_dump(isset($str['1']));

var_dump($str['1.0']);

var_dump(isset($str['1.0']));

var_dump($str['x']);

var_dump(isset($str['x']));

var_dump($str['1x']);

var_dump(isset($str['1x']));

?>

以上(shàng)例程會(huì)輸出:

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)

注意:

用(yòng) [] 或 {} 訪問任何其它類型(不包括數組或具有相應接口的對(duì)象實現(xiàn))的變量隻會(huì)無聲地返回 null。

注意:

可以直接在字符串原型中用(yòng) [] 或 {} 訪問字符。

注意:

PHP 7.4 中棄用(yòng)在字符串字面量中使用(yòng) {} 來(lái)訪問字符。 PHP 8.0 已移除。

有用(yòng)的函數和(hé)運算(suàn)符 ¶

字符串可以用(yòng) '.'(點)運算(suàn)符連接起來(lái),注意 '+'(加号)運算(suàn)符沒有這(zhè)個功能(néng)。更多信息參考字符串運算(suàn)符。

對(duì)于 string 的操作(zuò)有很(hěn)多有用(yòng)的函數。

可以參考字符串函數了(le)解大(dà)部分函數,高(gāo)級的查找與替換功能(néng)可以參考 Perl 兼容正則表達式函數。

另外(wài)還有 URL 字符串函數,也(yě)有加密/解密字符串的函數(Sodium 和(hé) Hash)。

最後,可以參考字符類型函數。

轉換成字符串 ¶

一個值可以通過在其前面加上(shàng) (string) 或用(yòng) strval() 函數來(lái)轉變成字符串。在一個需要字符串的表達式中,會(huì)自(zì)動轉換爲 string。比如在使用(yòng)函數 echo 或 print 時(shí),或在一個變量和(hé)一個 string 進行比較時(shí),就會(huì)發生這(zhè)種轉換。類型和(hé)類型轉換可以更好(hǎo)的解釋下(xià)面的事(shì)情,也(yě)可參考函數 settype()。

一個布爾值 bool 的 true 被轉換成 string 的 "1"。bool 的 false 被轉換成 ""(空(kōng)字符串)。這(zhè)種轉換可以在 bool 和(hé) string 之間相互進行。

一個整數 int 或浮點數 float 被轉換爲數字的字面樣式的 string(包括 float 中的指數部分)。使用(yòng)指數計(jì)數法的浮點數(4.1E+6)也(yě)可轉換。

注意:

PHP 8.0.0 起,十進制小(xiǎo)數點字符都是一個句号(.)。 而在此之前的版本,在腳本的區(qū)域(category LC_NUMERIC) 中定義了(le)十進制小(xiǎo)數點字符。參見 setlocale()。

數組 array 總是轉換成字符串 "Array",因此,echo 和(hé) print 無法顯示出該數組的内容。要顯示某個單元,可以用(yòng) echo $arr['foo'] 這(zhè)種結構。要顯示整個數組内容見下(xià)文(wén)。

必須使用(yòng)魔術方法 __toString 才能(néng)将 object 轉換爲 string。

資源 Resource 總會(huì)被轉變成 "Resource id #1" 這(zhè)種結構的字符串,其中的 1 是 PHP 在運行時(shí)分配給該 resource 的資源數字。 While the exact structure of this string should not be relied on and is subject to change, it will always be unique for a given resource within the lifetime of a script being executed (ie a Web request or CLI process) and won't be reused. 要得到(dào)一個 resource 的類型,可以用(yòng)函數 get_resource_type()。

null 總是被轉變成空(kōng)字符串。

如上(shàng)面所說的,直接把 array,object 或 resource 轉換成 string 不會(huì)得到(dào)除了(le)其類型之外(wài)的任何有用(yòng)信息。可以使用(yòng)函數 print_r() 和(hé) var_dump() 列出這(zhè)些(xiē)類型的内容。

大(dà)部分的 PHP 值可以轉變成 string 來(lái)永久保存,這(zhè)被稱作(zuò)串行化,可以用(yòng)函數 serialize() 來(lái)實現(xiàn)。

字符串類型詳解 ¶

PHP 中的 string 的實現(xiàn)方式是一個由字節組成的數組再加上(shàng)一個整數指明(míng)緩沖區(qū)長度。并無如何将字節轉換成字符的信息,由程序員來(lái)決定。字符串由什(shén)麽值來(lái)組成并無限制;特别的,其值爲 0(“NUL bytes”)的字節可以處于字符串任何位置(不過有幾個函數,在本手冊中被稱爲非“二進制安全”的,也(yě)許會(huì)把 NUL 字節之後的數據全都忽略)。

字符串類型的此特性解釋了(le)爲什(shén)麽 PHP 中沒有單獨的“byte”類型 - 已經用(yòng)字符串來(lái)代替了(le)。返回非文(wén)本值的函數 - 例如從(cóng)網絡套接字讀取的任意數據 - 仍會(huì)返回字符串。

由于 PHP 并不特别指明(míng)字符串的編碼,那字符串到(dào)底是怎樣編碼的呢(ne)?例如字符串 "á" 到(dào)底是等于 "\xE1"(ISO-8859-1),"\xC3\xA1"(UTF-8,C form),"\x61\xCC\x81"(UTF-8,D form)還是任何其它可能(néng)的表達呢(ne)?答(dá)案是字符串會(huì)被按照該腳本文(wén)件相同的編碼方式來(lái)編碼。因此如果一個腳本的編碼是 ISO-8859-1,則其中的字符串也(yě)會(huì)被編碼爲 ISO-8859-1,以此類推。不過這(zhè)并不适用(yòng)于激活了(le) Zend Multibyte 時(shí);此時(shí)腳本可以是以任何方式編碼的(明(míng)确指定或被自(zì)動檢測)然後被轉換爲某種内部編碼,然後字符串将被用(yòng)此方式編碼。注意腳本的編碼有一些(xiē)約束(如果激活了(le) Zend Multibyte 則是其内部編碼)- 這(zhè)意味着此編碼應該是 ASCII 的兼容超集,例如 UTF-8 或 ISO-8859-1。不過要注意,依賴狀态的編碼其中相同的字節值可以用(yòng)于首字母和(hé)非首字母而轉換狀态,這(zhè)可能(néng)會(huì)造成問題。

當然了(le),要做到(dào)有用(yòng),操作(zuò)文(wén)本的函數必須假定字符串是如何編碼的。不幸的是,PHP 關于此的函數有很(hěn)多變種:

某些(xiē)函數假定字符串是以單字節編碼的,但(dàn)并不需要将字節解釋爲特定的字符。例如 substr(),strpos(),strlen() 和(hé) strcmp()。理(lǐ)解這(zhè)些(xiē)函數的另一種方法是它們作(zuò)用(yòng)于内存緩沖區(qū),即按照字節和(hé)字節下(xià)标操作(zuò)。

某些(xiē)函數被傳遞入了(le)字符串的編碼方式,也(yě)可能(néng)會(huì)假定默認無此信息。例如 htmlentities() 和(hé) mbstring 擴展中的大(dà)部分函數。

其它函數使用(yòng)了(le)當前區(qū)域(見 setlocale()),但(dàn)是逐字節操作(zuò)。

最後一些(xiē)函數會(huì)假定字符串是使用(yòng)某特定編碼的,通常是 UTF-8。intl 擴展和(hé) PCRE(上(shàng)例中僅在使用(yòng)了(le) u 修飾符時(shí))擴展中的大(dà)部分函數都是這(zhè)樣。

最後,要書寫能(néng)夠正确使用(yòng) Unicode 的程序依賴于很(hěn)小(xiǎo)心地避免那些(xiē)可能(néng)會(huì)損壞數據的函數。要使用(yòng)來(lái)自(zì)于 intl 和(hé) mbstring 擴展的函數。不過使用(yòng)能(néng)處理(lǐ) Unicode 編碼的函數隻是個開(kāi)始。不管用(yòng)何種語言提供的函數,最基本的還是了(le)解 Unicode 規格。例如一個程序如果假定隻有大(dà)寫和(hé)小(xiǎo)寫,那可是大(dà)錯特錯。

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:數字字符串
上(shàng)一篇:Float 浮點型