做(zuò)自(zì)由與創造的先行(xíng)者

String 字符串

PHP中文手冊

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

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

語法 ¶

一(yī)個字符串可(kě)以用 4 種方式表達:

單引号

雙引号

heredoc 語法結構

nowdoc 語法結構

單引号 ¶

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

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

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

<?php

echo 'this is a simple string';

// 可(kě)以錄入多行(xíng)

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

?>

雙引号 ¶

如(rú)果字符串是包圍在雙引号(")中, PHP 将對以下(xià)特殊的字符進行(xíng)解析:

轉義字符

轉義字符
序列 含義
\n 換行(xíng)(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} 符合該正則表達式序列的是一(yī)個以八進制方式來表達的字符,which silently overflows to fit in a byte (e.g. "\400" === "\000")
\x[0-9A-Fa-f]{1,2} 符合該正則表達式序列的是一(yī)個以十六進制方式來表達的字符
\u{[0-9A-Fa-f]+} 匹配正則表達式的字符序列是 unicode 碼位, 該碼位能(néng)作(zuò)為(wèi) UTF-8 的表達方式輸出字符串

和(hé)單引号字符串一(yī)樣,轉義任何其它字符都(dōu)會導緻反斜線被顯示出來。

用雙引号定義的字符串最重要(yào)的特征是變量會被解析,詳見(jiàn)變量解析。

Heredoc 結構 ¶

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

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

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

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

<?php

// 無縮進

echo <<<END

a

b

c

\n

END;

// 4 空格縮進

echo <<<END

a

b

c

END;

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

a

b

c

a

b

c

如(rú)果結束标識符的縮進超過內(nèi)容的任何一(yī)行(xíng)的縮進,則将抛出 ParseError 異常:

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

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

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

示例 #3 內(nèi)容(空白)和(hé)結束标識符的不同縮進

<?php

// 以下(xià)所有代碼都(dōu)不起作(zuò)用。

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

{

echo <<<END

a

END;

}

// 在正文中混合空格和(hé)制表符

{

echo <<<END

a

END;

}

// 在結束标記中混合空格和(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

內(nèi)容字符串的結束标識符後面不需要(yào)跟分号或者換行(xíng)符。 例如(rú),從(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"

}

警告

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

示例 #5 字符串內(nèi)容中的結束标識符往往會導緻 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

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

警告

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

如(rú)果不遵守該規則導緻結束标識不“幹淨”,PHP 将認為(wèi)它不是結束标識符而繼續尋找。如(rú)果在文件結束前也沒有找到一(yī)個正确的結束标識符,PHP 将會在最後一(yī)行(xíng)産生一(yī)個解析錯誤。

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

<?php

class foo {

public $bar = <<<EOT

bar

EOT;

}

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

?>

示例 #7 即使在 PHP 7.3.0 之前也合法的示例

<?php

class foo {

public $bar = <<<EOT

bar

EOT;

}

?>

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

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

示例 #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)例程會輸出:

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

Now, I am printing some Bar2.

This should print a capital 'A': A

也可(kě)以把 Heredoc 結構用在函數(shù)參數(shù)中來傳遞數(shù)據:

示例 #9 Heredoc 結構在參數(shù)中的示例

<?php

var_dump(array(<<<EOD

foobar!

EOD

));

?>

可(kě)以用 Heredoc 結構來初始化靜态變量和(hé)類的屬性和(hé)常量:

示例 #10 使用 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;

}

?>

還可(kě)以在 Heredoc 結構中用雙引号來聲明(míng)标識符:

示例 #11 在 heredoc 結構中使用雙引号

<?php

echo <<<"FOOBAR"

Hello World!

FOOBAR;

?>

Nowdoc 結構 ¶

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

一(yī)個 nowdoc 結構也用和(hé) heredocs 結構一(yī)樣的标記 <<<, 但(dàn)是跟在後面的标識符要(yào)用單引号括起來,即 <<<'EOT'。Heredoc 結構的所有規則也同樣适用于 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)例程會輸出:

Example of string spanning multiple lines

using nowdoc syntax. Backslashes are always treated literally,

e.g. \\ and \'.

示例 #13 含變量引用的 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)例程會輸出:

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 靜态數(shù)據的示例

<?php

class foo {

public $bar = <<<'EOT'

bar

EOT;

}

?>

注意:

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

變量解析 ¶

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

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

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

簡單語法

當 PHP 解析器遇到一(yī)個美元符号($)時(shí),它會和(hé)其它很(hěn)多解析器一(yī)樣,去組合盡量多的标識以形成一(yī)個合法的變量名。可(kě)以用花括号來明(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)例程會輸出:

He drank some apple juice.

He drank some juice made of .

He drank some juice made of apples.

類似的,一(yī)個 array 索引或一(yī)個 object 屬性也可(kě)被解析。數(shù)組索引要(yào)用方括号(])來表示索引結束的邊際,對象屬性則是和(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)例程會輸出:

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 起,還支持負數(shù)字索引。

示例 #16 負數(shù)索引

<?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)例程會輸出:

The character at index -2 is n.

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

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

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

複雜(zá)語法不是因為(wèi)其語法複雜(zá)而得名,而是因為(wèi)它可(kě)以使用複雜(zá)的表達式。

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

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

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

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

// 有效

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

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

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

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

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

// 有效,當在字符串中使用多重數(shù)組時(shí),一(yī)定要(yào)用括号将它括起來

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"

?>

也可(kě)以在字符串中用此語法通(tō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)例程會輸出:

I am bar.

I am bar.

注意:

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

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

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

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

?>

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

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

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

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

警告

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

警告

PHP 的字符串在內(nèi)部是字節組成的數(shù)組。因此用花括号訪問(wèn)或修改字符串對多字節字符集很(hěn)不安全。僅應對單字節編碼例如(rú) ISO-8859-1 的字符串進行(xíng)此類操作(zuò)。

注意: 從(cóng) PHP 7.1.0 開(kāi)始,對空字符串應用空索引運算符會引發緻命錯誤。 以前是空字符串會被靜默轉為(wèi)數(shù)組。

示例 #17 一(yī)些字符串示例

<?php

// 取得字符串的第一(yī)個字符

$str = 'This is a test.';

$first = $str[0];

// 取得字符串的第三個字符

$third = $str[2];

// 取得字符串的最後一(yī)個字符

$str = 'This is still a test.';

$last = $str[strlen($str)-1];

// 修改字符串的最後一(yī)個字符

$str = 'Look at the sea';

$str[strlen($str)-1] = 'e';

?>

字符串下(xià)标必須為(wèi)整數(shù)或可(kě)轉換為(wèi)整數(shù)的字符串,否則會發出警告。之前類似 "foo" 的下(xià)标會無聲地(dì)轉換成 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)例程會輸出:

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)

注意:

用 [] 或 {} 訪問(wèn)任何其它類型(不包括數(shù)組或具有相應接口的對象實現)的變量隻會無聲地(dì)返回 null。

注意:

可(kě)以直接在字符串原型中用 [] 或 {} 訪問(wèn)字符。

注意:

PHP 7.4 中棄用在字符串字面量中使用 {} 來訪問(wèn)字符。 PHP 8.0 已移除。

有用的函數(shù)和(hé)運算符 ¶

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

對于 string 的操作(zuò)有很(hěn)多有用的函數(shù)。

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

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

最後,可(kě)以參考字符類型函數(shù)。

轉換成字符串 ¶

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

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

一(yī)個整數(shù) int 或浮點數(shù) float 被轉換為(wèi)數(shù)字的字面樣式的 string(包括 float 中的指數(shù)部分)。使用指數(shù)計數(shù)法的浮點數(shù)(4.1E+6)也可(kě)轉換。

注意:

PHP 8.0.0 起,十進制小數(shù)點字符都(dōu)是一(yī)個句号(.)。 而在此之前的版本,在腳本的區(qū)域(category LC_NUMERIC) 中定義了(le)十進制小數(shù)點字符。參見(jiàn) setlocale()。

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

必須使用魔術(shù)方法 __toString 才能(néng)将 object 轉換為(wèi) string。

資源 Resource 總會被轉變成 "Resource id #1" 這(zhè)種結構的字符串,其中的 1 是 PHP 在運行(xíng)時(shí)分配給該 resource 的資源數(shù)字。 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. 要(yào)得到一(yī)個 resource 的類型,可(kě)以用函數(shù) get_resource_type()。

null 總是被轉變成空字符串。

如(rú)上(shàng)面所說的,直接把 array,object 或 resource 轉換成 string 不會得到除了(le)其類型之外(wài)的任何有用信息。可(kě)以使用函數(shù) print_r() 和(hé) var_dump() 列出這(zhè)些類型的內(nèi)容。

大部分的 PHP 值可(kě)以轉變成 string 來永久保存,這(zhè)被稱作(zuò)串行(xíng)化,可(kě)以用函數(shù) serialize() 來實現。

字符串類型詳解 ¶

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

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

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

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

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

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

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

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

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

網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發
下(xià)一(yī)篇:數(shù)字字符串
上(shàng)一(yī)篇:Float 浮點型