成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP的8 種原始數(shù)據(jù)類型【基礎(chǔ)】

whataa / 1262人閱讀

摘要:如果給定的一個(gè)數(shù)超出了的范圍,將會(huì)被解釋為。從布爾值轉(zhuǎn)換將產(chǎn)生出零,將產(chǎn)生出壹。由于內(nèi)部表達(dá)方式的原因,比較兩個(gè)浮點(diǎn)數(shù)是否相等是有問(wèn)題的。和在小數(shù)點(diǎn)后五位精度內(nèi)都是相等的。這里共有兩種語(yǔ)法規(guī)則一種簡(jiǎn)單規(guī)則,一種復(fù)雜規(guī)則。

前言

搬運(yùn):PHP官方文檔

四種標(biāo)量類型 boolean(布爾型)

這是最簡(jiǎn)單的類型。boolean表達(dá)了真值,可以為TRUE或FLASE。
要指定一個(gè)布爾值,使用關(guān)鍵字 TRUE 或 FALSE。兩個(gè)都不區(qū)分大小寫。

通常運(yùn)算符所返回的 boolean 值結(jié)果會(huì)被傳遞給控制流程。


";
}

// ...因?yàn)榭梢允褂孟旅孢@種簡(jiǎn)單的方式:
if ($show_separators) {
    echo "
"; } ?>
要明確地將一個(gè)值轉(zhuǎn)換成 boolean,用 (bool) 或者 (boolean) 來(lái)強(qiáng)制轉(zhuǎn)換。但是很多情況下不需要用強(qiáng)制轉(zhuǎn)換,因?yàn)楫?dāng)運(yùn)算符,函數(shù)或者流程控制結(jié)構(gòu)需要一個(gè) boolean 參數(shù)時(shí),該值會(huì)被自動(dòng)轉(zhuǎn)換。

當(dāng)轉(zhuǎn)換為 boolean 時(shí),以下值被認(rèn)為是 FALSE:

- 布爾值 FALSE 本身
- 整型值 0(零)
- 浮點(diǎn)型值 0.0(零)
- 空字符串,以及字符串 "0"
- 不包括任何元素的數(shù)組
- 不包括任何成員變量的對(duì)象(僅 PHP 4.0 適用)
- 特殊類型 NULL(包括尚未賦值的變量)
- 從空標(biāo)記生成的 SimpleXML 對(duì)象

其它非零值(不論正負(fù))一樣,被認(rèn)為是 TRUE!

integer(整型)

一個(gè) integer 是集合 ? = {..., -2, -1, 0, 1, 2, ...} 中的一個(gè)數(shù)。

整型值可以使用十進(jìn)制,十六進(jìn)制,八進(jìn)制或二進(jìn)制表示,前面可以加上可選的符號(hào)(- 或者 +);二進(jìn)制表達(dá)的 integer 自 PHP 5.4.0 起可用;要使用八進(jìn)制表達(dá),數(shù)字前必須加上 0(零)。要使用十六進(jìn)制表達(dá),數(shù)字前必須加上 0x。要使用二進(jìn)制表達(dá),數(shù)字前必須加上 0b。

Example #1 整數(shù)文字表達(dá)

整型數(shù)的字長(zhǎng)和平臺(tái)有關(guān),盡管通常最大值是大約二十億(32 位有符號(hào))。64 位平臺(tái)下的最大值通常是大約 9E18。PHP 不支持無(wú)符號(hào)整數(shù)。Integer 值的字長(zhǎng)可以用常量 PHP_INT_SIZE來(lái)表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 來(lái)表示。

如果給定的一個(gè)數(shù)超出了 integer 的范圍,將會(huì)被解釋為 float。同樣如果執(zhí)行的運(yùn)算結(jié)果超出了 integer 范圍,也會(huì)返回 float。

Example #2 64 位系統(tǒng)下的整數(shù)溢出

PHP 中沒(méi)有整除的運(yùn)算符。1/2 產(chǎn)生出 float 0.5。值可以舍棄小數(shù)部分強(qiáng)制轉(zhuǎn)換為 integer,或者使用 round() 函數(shù)可以更好地進(jìn)行四舍五入。

轉(zhuǎn)換為整型
要明確地將一個(gè)值轉(zhuǎn)換為 integer,用 (int) 或 (integer) 強(qiáng)制轉(zhuǎn)換。不過(guò)大多數(shù)情況下都不需要強(qiáng)制轉(zhuǎn)換,因?yàn)楫?dāng)運(yùn)算符,函數(shù)或流程控制需要一個(gè) integer 參數(shù)時(shí),值會(huì)自動(dòng)轉(zhuǎn)換。還可以通過(guò)函數(shù) intval() 來(lái)將一個(gè)值轉(zhuǎn)換成整型。

從布爾值轉(zhuǎn)換
FALSE 將產(chǎn)生出 0(零),TRUE 將產(chǎn)生出 1(壹)。

從浮點(diǎn)型轉(zhuǎn)換
當(dāng)從浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù)時(shí),將向下取整。

float(浮點(diǎn)型,也稱作 double)

浮點(diǎn)型(也叫浮點(diǎn)數(shù) float,雙精度數(shù) double 或?qū)崝?shù) real)可以用以下任一語(yǔ)法定義:

浮點(diǎn)數(shù)的字長(zhǎng)和平臺(tái)相關(guān),盡管通常最大值是 1.8e308 并具有 14 位十進(jìn)制數(shù)字的精度(64 位 IEEE 格式)。
由于內(nèi)部表達(dá)方式的原因,比較兩個(gè)浮點(diǎn)數(shù)是否相等是有問(wèn)題的。不過(guò)還是有迂回的方法來(lái)比較浮點(diǎn)數(shù)值的;要測(cè)試浮點(diǎn)數(shù)是否相等,要使用一個(gè)僅比該數(shù)值大一丁點(diǎn)的最小誤差值。該值也被稱為機(jī)器極小值(epsilon)或最小單元取整數(shù),是計(jì)算中所能接受的最小的差別值。

$a$b 在小數(shù)點(diǎn)后五位精度內(nèi)都是相等的。

NaN
某些數(shù)學(xué)運(yùn)算會(huì)產(chǎn)生一個(gè)由常量 NAN 所代表的結(jié)果。此結(jié)果代表著一個(gè)在浮點(diǎn)數(shù)運(yùn)算中未定義或不可表述的值。任何拿此值與其它任何值進(jìn)行的松散或嚴(yán)格比較的結(jié)果都是 FALSE。
由于 NAN 代表著任何不同值,不應(yīng)拿 NAN 去和其它值進(jìn)行比較,包括其自身,應(yīng)該用 is_nan() 來(lái)檢查。

string(字符串)

一個(gè)字符串 string 就是由一系列的字符組成,其中每個(gè)字符等同于一個(gè)字節(jié)。這意味著 PHP 只能支持 256 的字符集,因此不支持 Unicode 。

Note: string 最大可以達(dá)到 2GB。

語(yǔ)法

一個(gè)字符串可以用 4 種方式表達(dá):

- 單引號(hào)
- 雙引號(hào)
- heredoc 語(yǔ)法結(jié)構(gòu)
- nowdoc 語(yǔ)法結(jié)構(gòu)(自 PHP 5.3.0 起)

單引號(hào)

定義一個(gè)字符串的最簡(jiǎn)單的方法是用單引號(hào)把它包圍起來(lái)(字符 ")。

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

Note: 不像雙引號(hào)和 heredoc 語(yǔ)法結(jié)構(gòu),在單引號(hào)字符串中的變量和特殊字符的轉(zhuǎn)義序列將不會(huì)被替換。

雙引號(hào)

轉(zhuǎn)義字符

序列                  含義

                    換行(ASCII 字符集中的 LF 或 0x0A (10))

                    回車(ASCII 字符集中的 CR 或 0x0D (13))
	                    水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
v                    垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
e                    Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
f                    換頁(yè)(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
                    反斜線
$                    美元標(biāo)記
"                    雙引號(hào)
[0-7]{1,3}           符合該正則表達(dá)式序列的是一個(gè)以八進(jìn)制方式來(lái)表達(dá)的字符
x[0-9A-Fa-f]{1,2}    符合該正則表達(dá)式序列的是一個(gè)以十六進(jìn)制方式來(lái)表達(dá)的字符

和單引號(hào)字符串一樣,轉(zhuǎn)義任何其它字符都會(huì)導(dǎo)致反斜線被顯示出來(lái)。PHP 5.1.1 以前,{$var} 中的反斜線還不會(huì)被顯示出來(lái);用雙引號(hào)定義的字符串最重要的特征是變量會(huì)被解析。

Heredoc 結(jié)構(gòu)

第三種表達(dá)字符串的方法是用 heredoc 句法結(jié)構(gòu):<<<。在該運(yùn)算符之后要提供一個(gè)標(biāo)識(shí)符,然后換行。接下來(lái)是字符串 string 本身,最后要用前面定義的標(biāo)識(shí)符作為結(jié)束標(biāo)志。

結(jié)束時(shí)所引用的標(biāo)識(shí)符必須在該行的第一列,而且,標(biāo)識(shí)符的命名也要像其它標(biāo)簽一樣遵守 PHP 的規(guī)則:只能包含字母、數(shù)字和下劃線,并且必須以字母和下劃線作為開(kāi)頭。

要注意的是結(jié)束標(biāo)識(shí)符這行除了可能有一個(gè)分號(hào)(;)外,絕對(duì)不能包含其它字符。這意味著標(biāo)識(shí)符不能縮進(jìn),分號(hào)的前后也不能有任何空白或制表符。更重要的是結(jié)束標(biāo)識(shí)符的前面必須是個(gè)被本地操作系統(tǒng)認(rèn)可的換行,比如在 UNIX 和 Mac OS X 系統(tǒng)中是 n,而結(jié)束定界符(可能其后有個(gè)分號(hào))之后也必須緊跟一個(gè)換行。
如果不遵守該規(guī)則導(dǎo)致結(jié)束標(biāo)識(shí)不“干凈”,PHP 將認(rèn)為它不是結(jié)束標(biāo)識(shí)符而繼續(xù)尋找。如果在文件結(jié)束前也沒(méi)有找到一個(gè)正確的結(jié)束標(biāo)識(shí)符,PHP 將會(huì)在最后一行產(chǎn)生一個(gè)解析錯(cuò)誤。
Heredocs 結(jié)構(gòu)不能用來(lái)初始化類的屬性。自 PHP 5.3 起,此限制僅對(duì) heredoc 包含變量時(shí)有效。
Example #1 非法的示例

Heredoc 結(jié)構(gòu)就象是沒(méi)有使用雙引號(hào)的雙引號(hào)字符串,這就是說(shuō)在 heredoc 結(jié)構(gòu)中單引號(hào)不用被轉(zhuǎn)義,但是上文中列出的轉(zhuǎn)義序列還可以使用。變量將被替換,但在 heredoc 結(jié)構(gòu)中含有復(fù)雜的變量時(shí)要格外小心。

Example #2 Heredoc 結(jié)構(gòu)的字符串示例

foo = "Foo";
        $this->bar = array("Bar1", "Bar2", "Bar3");
    }
}

$foo = new foo();
$name = "MyName";

echo <<foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital "A": x41
EOT;
?>

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

My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital "A": A

Example #3 Heredoc 結(jié)構(gòu)在參數(shù)中的示例

在 PHP 5.3.0 以后,也可以用 Heredoc 結(jié)構(gòu)來(lái)初始化靜態(tài)變量和類的屬性和常量:

Example #4 使用 Heredoc 結(jié)構(gòu)來(lái)初始化靜態(tài)值

自 PHP 5.3.0 起還可以在 Heredoc 結(jié)構(gòu)中用雙引號(hào)來(lái)聲明標(biāo)識(shí)符:
Example #5 在 heredoc 結(jié)構(gòu)中使用雙引號(hào)

Nowdoc 結(jié)構(gòu)

就象 heredoc 結(jié)構(gòu)類似于雙引號(hào)字符串,Nowdoc 結(jié)構(gòu)是類似于單引號(hào)字符串的。Nowdoc 結(jié)構(gòu)很象 heredoc 結(jié)構(gòu),但是 nowdoc 中不進(jìn)行解析操作。這種結(jié)構(gòu)很適合用于嵌入 PHP 代碼或其它大段文本而無(wú)需對(duì)其中的特殊字符進(jìn)行轉(zhuǎn)義。與 SGML 的 結(jié)構(gòu)是用來(lái)聲明大段的不用解析的文本類似,nowdoc 結(jié)構(gòu)也有相同的特征。

一個(gè) nowdoc 結(jié)構(gòu)也用和 heredocs 結(jié)構(gòu)一樣的標(biāo)記 <<<, 但是跟在后面的標(biāo)識(shí)符要用單引號(hào)括起來(lái),即 <<<"EOT"。Heredoc 結(jié)構(gòu)的所有規(guī)則也同樣適用于 nowdoc 結(jié)構(gòu),尤其是結(jié)束標(biāo)識(shí)符的規(guī)則。

Example #6 Nowdoc 結(jié)構(gòu)字符串示例

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

以上例程會(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
Note:
不象 heredoc 結(jié)構(gòu),nowdoc 結(jié)構(gòu)可以用在任意的靜態(tài)數(shù)據(jù)環(huán)境中,最典型的示例是用來(lái)初始化類的屬性或常量:
Nowdoc 結(jié)構(gòu)是在 PHP 5.3.0 中加入的。

Example #7 靜態(tài)數(shù)據(jù)的示例

變量解析

當(dāng)字符串用雙引號(hào)或 heredoc 結(jié)構(gòu)定義時(shí),其中的變量將會(huì)被解析。

這里共有兩種語(yǔ)法規(guī)則:一種簡(jiǎn)單規(guī)則,一種復(fù)雜規(guī)則。簡(jiǎn)單的語(yǔ)法規(guī)則是最常用和最方便的,它可以用最少的代碼在一個(gè) string 中嵌入一個(gè)變量,一個(gè) array 的值,或一個(gè) object 的屬性。

復(fù)雜規(guī)則語(yǔ)法的顯著標(biāo)記是用花括號(hào)包圍的表達(dá)式。

簡(jiǎn)單語(yǔ)法

當(dāng) PHP 解析器遇到一個(gè)美元符號(hào)($)時(shí),它會(huì)和其它很多解析器一樣,去組合盡量多的標(biāo)識(shí)以形成一個(gè)合法的變量名??梢杂没ɡㄌ?hào)來(lái)明確變量名的界線。

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

He drank some apple juice.
He drank some juice made of .

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

Example #8 簡(jiǎn)單語(yǔ)法示例

 "purple");

echo "He drank some $juices[0] juice.".PHP_EOL;
echo "He drank some $juices[1] juice.".PHP_EOL;
echo "He drank some juice made of $juice[0]s.".PHP_EOL; // Won"t work
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
?>

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

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 .

如果想要表達(dá)更復(fù)雜的結(jié)構(gòu),請(qǐng)用復(fù)雜語(yǔ)法。

復(fù)雜(花括號(hào))語(yǔ)法

復(fù)雜語(yǔ)法不是因?yàn)槠湔Z(yǔ)法復(fù)雜而得名,而是因?yàn)樗梢允褂脧?fù)雜的表達(dá)式。

任何具有 string 表達(dá)的標(biāo)量變量,數(shù)組單元或?qū)ο髮傩远伎墒褂么苏Z(yǔ)法。只需簡(jiǎn)單地像在 string 以外的地方那樣寫出表達(dá)式,然后用花括號(hào) { 和 } 把它括起來(lái)即可。由于 { 無(wú)法被轉(zhuǎn)義,只有 $ 緊挨著 { 時(shí)才會(huì)被識(shí)別。可以用 {$ 來(lái)表達(dá) {$。下面的示例可以更好的解釋:

width}00 centimeters broad."; 

// 有效,只有通過(guò)花括號(hào)語(yǔ)法才能正確解析帶引號(hào)的鍵名
echo "This works: {$arr["key"]}";

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

// 這是錯(cuò)誤的表達(dá)式,因?yàn)榫拖?$foo[bar] 的格式在字符串以外也是錯(cuò)的一樣。
// 換句話說(shuō),只有在 PHP 能找到常量 foo 的前提下才會(huì)正常工作;這里會(huì)產(chǎn)生一個(gè)
// E_NOTICE (undefined constant) 級(jí)別的錯(cuò)誤。
echo "This is wrong: {$arr[foo][3]}"; 

// 有效,當(dāng)在字符串中使用多重?cái)?shù)組時(shí),一定要用括號(hào)將它括起來(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()}}";

// 無(wú)效,輸出: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>

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

$bar}
";
echo "{$foo->$baz[1]}
";
?>

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

I am bar.
I am bar. 
函數(shù)、方法、靜態(tài)類變量和類常量只有在 PHP 5 以后才可在 {$} 中使用。然而,只有在該字符串被定義的命名空間中才可以將其值作為變量名來(lái)訪問(wèn)。只單一使用花括號(hào) ({}) 無(wú)法處理從函數(shù)或方法的返回值或者類常量以及類靜態(tài)變量的值。
轉(zhuǎn)換成字符串

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

一個(gè)布爾值 boolean 的 TRUE 被轉(zhuǎn)換成 string 的 "1"。Boolean 的 FALSE 被轉(zhuǎn)換成 ""(空字符串)。這種轉(zhuǎn)換可以在 boolean 和 string 之間相互進(jìn)行。

一個(gè)整數(shù) integer 或浮點(diǎn)數(shù) float 被轉(zhuǎn)換為數(shù)字的字面樣式的 string(包括 float 中的指數(shù)部分)。使用指數(shù)計(jì)數(shù)法的浮點(diǎn)數(shù)(4.1E+6)也可轉(zhuǎn)換。

數(shù)組 array 總是轉(zhuǎn)換成字符串 "Array",因此,echo 和 print 無(wú)法顯示出該數(shù)組的內(nèi)容。要顯示某個(gè)單元,可以用 echo $arr["foo"] 這種結(jié)構(gòu)。

資源 resource 總會(huì)被轉(zhuǎn)變成 "Resource id #1" 這種結(jié)構(gòu)的字符串,其中的 1 是 PHP 在運(yùn)行時(shí)分配給該 resource 的唯一值。不要依賴此結(jié)構(gòu),可能會(huì)有變更。要得到一個(gè) resource 的類型,可以用函數(shù) get_resource_type()。

NULL 總是被轉(zhuǎn)變成空字符串。

如上面所說(shuō)的,直接把 array,object 或 resource 轉(zhuǎn)換成 string 不會(huì)得到除了其類型之外的任何有用信息??梢允褂煤瘮?shù) print_r() 和 var_dump() 列出這些類型的內(nèi)容。

大部分的 PHP 值可以轉(zhuǎn)變成 string 來(lái)永久保存,這被稱作串行化,可以用函數(shù) serialize() 來(lái)實(shí)現(xiàn)。如果 PHP 引擎設(shè)定支持 WDDX,PHP 值也可被串行化為格式良好的 XML 文本。

字符串轉(zhuǎn)換為數(shù)值

當(dāng)一個(gè)字符串被當(dāng)作一個(gè)數(shù)值來(lái)取值,其結(jié)果和類型如下:

如果該字符串沒(méi)有包含 ".","e" 或 "E" 并且其數(shù)字值在整型的范圍之內(nèi)(由 PHP_INT_MAX 所定義),該字符串將被當(dāng)成 integer 來(lái)取值。其它所有情況下都被作為 float 來(lái)取值。

該字符串的開(kāi)始部分決定了它的值。如果該字符串以合法的數(shù)值開(kāi)始,則使用該數(shù)值。否則其值為 0(零)。合法數(shù)值由可選的正負(fù)號(hào),后面跟著一個(gè)或多個(gè)數(shù)字(可能有小數(shù)點(diǎn)),再跟著可選的指數(shù)部分。指數(shù)部分由 "e" 或 "E" 后面跟著一個(gè)或多個(gè)數(shù)字構(gòu)成。

兩種復(fù)合類型 array(數(shù)組)

PHP 中的數(shù)組實(shí)際上是一個(gè)有序映射。映射是一種把 values 關(guān)聯(lián)到 keys 的類型。此類型在很多方面做了優(yōu)化,因此可以把它當(dāng)成真正的數(shù)組,或列表(向量),散列表(是映射的一種實(shí)現(xiàn)),字典,集合,棧,隊(duì)列以及更多可能性。由于數(shù)組元素的值也可以是另一個(gè)數(shù)組,樹(shù)形結(jié)構(gòu)和多維數(shù)組也是允許的。

語(yǔ)法

定義數(shù)組 array()
可以用 array() 語(yǔ)言結(jié)構(gòu)來(lái)新建一個(gè)數(shù)組。它接受任意數(shù)量用逗號(hào)分隔的 鍵(key) => 值(value)對(duì)

array(  key =>  value
     , ...
     )
// 鍵(key)可是是一個(gè)整數(shù) integer 或字符串 string
// 值(value)可以是任意類型的值

最后一個(gè)數(shù)組單元之后的逗號(hào)可以省略。通常用于單行數(shù)組定義中,例如常用 array(1, 2) 而不是 array(1, 2, )。對(duì)多行數(shù)組定義通常保留最后一個(gè)逗號(hào),這樣要添加一個(gè)新單元時(shí)更方便。

自 5.4 起可以使用短數(shù)組定義語(yǔ)法,用 [] 替代 array()。

Example #1 一個(gè)簡(jiǎn)單數(shù)組

 "bar",
    "bar" => "foo",
);

// 自 PHP 5.4 起
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>

key 可以是 integer 或者 string。value 可以是任意類型。

此外 key 會(huì)有如下的強(qiáng)制轉(zhuǎn)換:

包含有合法整型值的字符串會(huì)被轉(zhuǎn)換為整型。例如鍵名 "8" 實(shí)際會(huì)被儲(chǔ)存為 8。但是 "08" 則不會(huì)強(qiáng)制轉(zhuǎn)換,因?yàn)槠洳皇且粋€(gè)合法的十進(jìn)制數(shù)值。

浮點(diǎn)數(shù)也會(huì)被轉(zhuǎn)換為整型,意味著其小數(shù)部分會(huì)被舍去。例如鍵名 8.7 實(shí)際會(huì)被儲(chǔ)存為 8。

布爾值也會(huì)被轉(zhuǎn)換成整型。即鍵名 true 實(shí)際會(huì)被儲(chǔ)存為 1 而鍵名 false 會(huì)被儲(chǔ)存為 0。

Null 會(huì)被轉(zhuǎn)換為空字符串,即鍵名 null 實(shí)際會(huì)被儲(chǔ)存為 ""。

數(shù)組和對(duì)象不能被用為鍵名。堅(jiān)持這么做會(huì)導(dǎo)致警告:Illegal offset type。

如果在數(shù)組定義中多個(gè)單元都使用了同一個(gè)鍵名,則只使用了最后一個(gè),之前的都被覆蓋了。

Example #2 類型強(qiáng)制與覆蓋示例

 "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
);
var_dump($array);
?>

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

array(1) {
  [1]=>
  string(1) "d"
}

上例中所有的鍵名都被強(qiáng)制轉(zhuǎn)換為 1,則每一個(gè)新單元都會(huì)覆蓋前一個(gè)的值,最后剩下的只有一個(gè) "d"。

PHP 數(shù)組可以同時(shí)含有 integer 和 string 類型的鍵名,因?yàn)?PHP 實(shí)際并不區(qū)分索引數(shù)組和關(guān)聯(lián)數(shù)組。

如果對(duì)給出的值沒(méi)有指定鍵名,則取當(dāng)前最大的整數(shù)索引值,而新的鍵名將是該值加一。如果指定的鍵名已經(jīng)有了值,則該值會(huì)被覆蓋。

Example #3 混合 integer 和 string 鍵名

 "bar",
    "bar" => "foo",
    100   => -100,
    -100  => 100,
);
var_dump($array);
?>

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

array(4) {
  ["foo"]=>
  string(3) "bar"
  ["bar"]=>
  string(3) "foo"
  [100]=>
  int(-100)
  [-100]=>
  int(100)
}

key 為可選項(xiàng)。如果未指定,PHP 將自動(dòng)使用之前用過(guò)的最大 integer 鍵名加上 1 作為新的鍵名。

Example #4 沒(méi)有鍵名的索引數(shù)組

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

array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(5) "hallo"
  [3]=>
  string(5) "world"
}

還可以只對(duì)某些單元指定鍵名而對(duì)其它的空置:

Example #5 僅對(duì)部分單元指定鍵名

 "c",
         "d",
);
var_dump($array);
?>

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

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "d"
}

可以看到最后一個(gè)值 "d" 被自動(dòng)賦予了鍵名 7。這是由于之前最大的整數(shù)鍵名是 6。

用方括號(hào)語(yǔ)法訪問(wèn)數(shù)組單元

數(shù)組單元可以通過(guò) array[key] 語(yǔ)法來(lái)訪問(wèn)。

Example #6 訪問(wèn)數(shù)組單元

 "bar",
    42    => 24,
    "multi" => array(
         "dimensional" => array(
             "array" => "foo"
         )
    )
);

var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>

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

string(3) "bar"
int(24)
string(3) "foo"
方括號(hào)和花括號(hào)可以互換使用來(lái)訪問(wèn)數(shù)組單元(例如 $array[42] 和 $array{42} 在上例中效果相同)。

自 PHP 5.4 起可以用數(shù)組間接引用函數(shù)或方法調(diào)用的結(jié)果。之前只能通過(guò)一個(gè)臨時(shí)變量。

自 PHP 5.5 起可以用數(shù)組間接引用一個(gè)數(shù)組原型。

Example #7 數(shù)組間接引用

試圖訪問(wèn)一個(gè)未定義的數(shù)組鍵名與訪問(wèn)任何未定義變量一樣:會(huì)導(dǎo)致 E_NOTICE 級(jí)別錯(cuò)誤信息,其結(jié)果為 NULL。

用方括號(hào)的語(yǔ)法新建/修改

可以通過(guò)明示地設(shè)定其中的值來(lái)修改一個(gè)已有數(shù)組。

這是通過(guò)在方括號(hào)內(nèi)指定鍵名來(lái)給數(shù)組賦值實(shí)現(xiàn)的。也可以省略鍵名,在這種情況下給變量名加上一對(duì)空的方括號(hào)([])。

$arr[key] = value;
$arr[] = value;
// key 可以是 integer 或 string
// value 可以是任意類型的值

如果 $arr 還不存在,將會(huì)新建一個(gè),這也是另一種新建數(shù)組的方法。不過(guò)并不鼓勵(lì)這樣做,因?yàn)槿绻?$arr 已經(jīng)包含有值(例如來(lái)自請(qǐng)求變量的 string)則此值會(huì)保留而 [] 實(shí)際上代表著字符串訪問(wèn)運(yùn)算符。初始化變量的最好方式是直接給其賦值。。

要修改某個(gè)值,通過(guò)其鍵名給該單元賦一個(gè)新值。要?jiǎng)h除某鍵值對(duì),對(duì)其調(diào)用 unset() 函數(shù)。

 1, 12 => 2);

$arr[] = 56;    // This is the same as $arr[13] = 56;
                // at this point of the script

$arr["x"] = 42; // This adds a new element to
                // the array with key "x"
                
unset($arr[5]); // This removes the element from the array

unset($arr);    // This deletes the whole array
?>
如上所述,如果給出方括號(hào)但沒(méi)有指定鍵名,則取當(dāng)前最大整數(shù)索引值,新的鍵名將是該值加上 1(但是最小為 0)。如果當(dāng)前還沒(méi)有整數(shù)索引,則鍵名將為 0。

注意這里所使用的最大整數(shù)鍵名不一定當(dāng)前就在數(shù)組中。它只要在上次數(shù)組重新生成索引后曾經(jīng)存在過(guò)就行了。以下面的例子來(lái)說(shuō)明

下面的例子來(lái)說(shuō)明:

 $value) {
    unset($array[$i]);
}
print_r($array);

// 添加一個(gè)單元(注意新的鍵名是 5,而不是你可能以為的 0)
$array[] = 6;
print_r($array);

// 重新索引:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>

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

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)

實(shí)用函數(shù)

有很多操作數(shù)組的函數(shù),參見(jiàn)數(shù)組函數(shù)一節(jié)

unset() 函數(shù)允許刪除數(shù)組中的某個(gè)鍵。但要注意數(shù)組將不會(huì)重建索引。如果需要?jiǎng)h除后重建索引,可以用 array_values() 函數(shù)。
 "one", 2 => "two", 3 => "three");
unset($a[2]);
/* will produce an array that would have been defined as
   $a = array(1 => "one", 3 => "three");
   and NOT
   $a = array(1 => "one", 2 =>"three");
*/

$b = array_values($a);
// Now $b is array(0 => "one", 1 =>"three")
?>

foreach 控制結(jié)構(gòu)是專門用于數(shù)組的。它提供了一個(gè)簡(jiǎn)單的方法來(lái)遍歷數(shù)組。

和在語(yǔ)法一節(jié)中規(guī)定的一樣,在方括號(hào)(“[”和“]”)之間必須有一個(gè)表達(dá)式。這意味著可以這樣寫:

轉(zhuǎn)換為數(shù)組

對(duì)于任意 integer,float,string,boolean 和 resource 類型,如果將一個(gè)值轉(zhuǎn)換為數(shù)組,將得到一個(gè)僅有一個(gè)元素的數(shù)組,其下標(biāo)為 0,該元素即為此標(biāo)量的值。換句話說(shuō),(array)$scalarValue 與 array($scalarValue) 完全一樣。

如果一個(gè) object 類型轉(zhuǎn)換為 array,則結(jié)果為一個(gè)數(shù)組,其單元為該對(duì)象的屬性。鍵名將為成員變量名,不過(guò)有幾點(diǎn)例外:整數(shù)屬性不可訪問(wèn);私有變量前會(huì)加上類名作前綴;保護(hù)變量前會(huì)加上一個(gè) "*" 做前綴。這些前綴的前后都各有一個(gè) NULL 字符。這會(huì)導(dǎo)致一些不可預(yù)知的行為:

可以用 array_diff() 和數(shù)組運(yùn)算符來(lái)比較數(shù)組。

直接改變數(shù)組的值自 PHP 5 起可以通過(guò)引用傳遞來(lái)做到。之前的版本需要需要采取變通的方法:

Example #10 在循環(huán)中改變單元

 $color) {
    $colors[$key] = strtoupper($color);
}

print_r($colors);
?>

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

Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)

數(shù)組(Array) 的賦值總是會(huì)涉及到值的拷貝。使用引用運(yùn)算符通過(guò)引用來(lái)拷貝數(shù)組。

object(對(duì)象)

對(duì)象初始化
要?jiǎng)?chuàng)建一個(gè)新的對(duì)象 object,使用 new 語(yǔ)句實(shí)例化一個(gè)類:

do_foo();
?>

詳細(xì)討論參見(jiàn)手冊(cè)中類與對(duì)象章節(jié)。

轉(zhuǎn)換為對(duì)象

如果將一個(gè)對(duì)象轉(zhuǎn)換成對(duì)象,它將不會(huì)有任何變化。如果其它任何類型的值被轉(zhuǎn)換成對(duì)象,將會(huì)創(chuàng)建一個(gè)內(nèi)置類 stdClass 的實(shí)例。如果該值為 NULL,則新的實(shí)例為空。數(shù)組轉(zhuǎn)換成對(duì)象將使鍵名成為屬性名并具有相對(duì)應(yīng)的值。對(duì)于任何其它的值,名為 scalar 的成員變量將包含該值。

scalar;  // outputs "ciao"
?>
兩種特殊類型: resource(資源)
資源 resource 是一種特殊變量,保存了到外部資源的一個(gè)引用。資源是通過(guò)專門的函數(shù)來(lái)建立和使用的。所有這些函數(shù)及其相應(yīng)資源類型見(jiàn)附錄。
參見(jiàn) get_resource_type()。

轉(zhuǎn)換為資源
由于資源類型變量保存有為打開(kāi)文件、數(shù)據(jù)庫(kù)連接、圖形畫布區(qū)域等的特殊句柄,因此將其它類型的值轉(zhuǎn)換為資源沒(méi)有意義。

釋放資源
由于 PHP 4 Zend 引擎引進(jìn)了引用計(jì)數(shù)系統(tǒng),可以自動(dòng)檢測(cè)到一個(gè)資源不再被引用了(和 Java 一樣)。這種情況下此資源使用的所有外部資源都會(huì)被垃圾回收系統(tǒng)釋放。因此,很少需要手工釋放內(nèi)存。

由于 PHP 4 Zend 引擎引進(jìn)了引用計(jì)數(shù)系統(tǒng),可以自動(dòng)檢測(cè)到一個(gè)資源不再被引用了(和 Java 一樣)。這種情況下此資源使用的所有外部資源都會(huì)被垃圾回收系統(tǒng)釋放。因此,很少需要手工釋放內(nèi)存。
持久數(shù)據(jù)庫(kù)連接比較特殊,它們不會(huì)被垃圾回收系統(tǒng)銷毀。參見(jiàn)數(shù)據(jù)庫(kù)永久連接一章。
NULL

特殊的 NULL 值表示一個(gè)變量沒(méi)有值。NULL 類型唯一可能的值就是 NULL。

在下列情況下一個(gè)變量被認(rèn)為是 NULL:

被賦值為 NULL。

尚未被賦值。

被 unset()。

使用 (unset) $var 將一個(gè)變量轉(zhuǎn)換為 null 將不會(huì)刪除該變量或 unset 其值。僅是返回 NULL 值而已。

(已完結(jié))

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21396.html

相關(guān)文章

  • 通過(guò)Swoole Framework學(xué)習(xí)websocket協(xié)議

    摘要:服務(wù)端的開(kāi)發(fā)離不開(kāi)協(xié)議,的出現(xiàn)對(duì)于學(xué)習(xí)通信來(lái)說(shuō),無(wú)疑是非常好的教材。一旦握手成功,一個(gè)雙向連接通道就建立了。類型包括文本,二進(jìn)制,協(xié)議層信號(hào)等。目前一共有種類型,種保留類型。表示異或,表示取模。 服務(wù)端的開(kāi)發(fā)離不開(kāi)協(xié)議,swoole的出現(xiàn)對(duì)于學(xué)習(xí)通信來(lái)說(shuō),無(wú)疑是非常好的教材。非常推薦大家下載 Swoole Framework,其中包含了多種協(xié)議的php實(shí)現(xiàn),例如FTP,HTTP,...

    wenyiweb 評(píng)論0 收藏0
  • PHP入門

    摘要:運(yùn)行在瀏覽器端。未來(lái)軟件的大趨勢(shì)。相同點(diǎn)為語(yǔ)言結(jié)構(gòu),不是函數(shù)輸出一個(gè)或者多個(gè)變量的類型,長(zhǎng)度及值一般用于打印復(fù)雜變量結(jié)合標(biāo)記格式化輸出如數(shù)組對(duì)象等輸出變量的值。一般用于打印變量。中認(rèn)為變量的值為時(shí),變量雖然定義了,但是無(wú)實(shí)際的意義。 PHP目錄======== php介紹 2 基礎(chǔ) 31 運(yùn)算符 70 流程控制 77 函數(shù) 91 文件引入 100 ...

    abson 評(píng)論0 收藏0
  • JS基礎(chǔ)篇--JS之表單提交時(shí)編碼類型enctype詳解

    摘要:格式支持比鍵值對(duì)復(fù)雜得多的結(jié)構(gòu)化數(shù)據(jù),這一點(diǎn)也很有用。例如下面這段代碼最終發(fā)送的請(qǐng)求是這種方案,可以方便的提交復(fù)雜的結(jié)構(gòu)化數(shù)據(jù),特別適合的接口。 簡(jiǎn)介 form的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,默認(rèn)為application/x-www-form-urlencoded。 ...

    ad6623 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<