摘要:如果給定的一個數(shù)超出了的范圍,將會被解釋為。從布爾值轉(zhuǎn)換將產(chǎn)生出零,將產(chǎn)生出壹。由于內(nèi)部表達(dá)方式的原因,比較兩個浮點數(shù)是否相等是有問題的。和在小數(shù)點后五位精度內(nèi)都是相等的。這里共有兩種語法規(guī)則一種簡單規(guī)則,一種復(fù)雜規(guī)則。
前言
搬運(yùn):PHP官方文檔
四種標(biāo)量類型 boolean(布爾型)這是最簡單的類型。boolean表達(dá)了真值,可以為TRUE或FLASE。
要指定一個布爾值,使用關(guān)鍵字 TRUE 或 FALSE。兩個都不區(qū)分大小寫。
通常運(yùn)算符所返回的 boolean 值結(jié)果會被傳遞給控制流程。
"; } // ...因為可以使用下面這種簡單的方式: if ($show_separators) { echo "
"; } ?>
要明確地將一個值轉(zhuǎn)換成 boolean,用 (bool) 或者 (boolean) 來強(qiáng)制轉(zhuǎn)換。但是很多情況下不需要用強(qiáng)制轉(zhuǎn)換,因為當(dāng)運(yùn)算符,函數(shù)或者流程控制結(jié)構(gòu)需要一個 boolean 參數(shù)時,該值會被自動轉(zhuǎn)換。
當(dāng)轉(zhuǎn)換為 boolean 時,以下值被認(rèn)為是 FALSE:
- 布爾值 FALSE 本身 - 整型值 0(零) - 浮點型值 0.0(零) - 空字符串,以及字符串 "0" - 不包括任何元素的數(shù)組 - 不包括任何成員變量的對象(僅 PHP 4.0 適用) - 特殊類型 NULL(包括尚未賦值的變量) - 從空標(biāo)記生成的 SimpleXML 對象
其它非零值(不論正負(fù))一樣,被認(rèn)為是 TRUE!
integer(整型)一個 integer 是集合 ? = {..., -2, -1, 0, 1, 2, ...} 中的一個數(shù)。
整型值可以使用十進(jìn)制,十六進(jìn)制,八進(jìn)制或二進(jìn)制表示,前面可以加上可選的符號(- 或者 +);二進(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ù)的字長和平臺有關(guān),盡管通常最大值是大約二十億(32 位有符號)。64 位平臺下的最大值通常是大約 9E18。PHP 不支持無符號整數(shù)。Integer 值的字長可以用常量 PHP_INT_SIZE來表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 來表示。
如果給定的一個數(shù)超出了 integer 的范圍,將會被解釋為 float。同樣如果執(zhí)行的運(yùn)算結(jié)果超出了 integer 范圍,也會返回 float。
Example #2 64 位系統(tǒng)下的整數(shù)溢出
PHP 中沒有整除的運(yùn)算符。1/2 產(chǎn)生出 float 0.5。值可以舍棄小數(shù)部分強(qiáng)制轉(zhuǎn)換為 integer,或者使用 round() 函數(shù)可以更好地進(jìn)行四舍五入。
轉(zhuǎn)換為整型
要明確地將一個值轉(zhuǎn)換為 integer,用 (int) 或 (integer) 強(qiáng)制轉(zhuǎn)換。不過大多數(shù)情況下都不需要強(qiáng)制轉(zhuǎn)換,因為當(dāng)運(yùn)算符,函數(shù)或流程控制需要一個 integer 參數(shù)時,值會自動轉(zhuǎn)換。還可以通過函數(shù) intval() 來將一個值轉(zhuǎn)換成整型。
從布爾值轉(zhuǎn)換
FALSE 將產(chǎn)生出 0(零),TRUE 將產(chǎn)生出 1(壹)。
從浮點型轉(zhuǎn)換
當(dāng)從浮點數(shù)轉(zhuǎn)換成整數(shù)時,將向下取整。
浮點型(也叫浮點數(shù) float,雙精度數(shù) double 或?qū)崝?shù) real)可以用以下任一語法定義:
浮點數(shù)的字長和平臺相關(guān),盡管通常最大值是 1.8e308 并具有 14 位十進(jìn)制數(shù)字的精度(64 位 IEEE 格式)。
由于內(nèi)部表達(dá)方式的原因,比較兩個浮點數(shù)是否相等是有問題的。不過還是有迂回的方法來比較浮點數(shù)值的;要測試浮點數(shù)是否相等,要使用一個僅比該數(shù)值大一丁點的最小誤差值。該值也被稱為機(jī)器極小值(epsilon)或最小單元取整數(shù),是計算中所能接受的最小的差別值。
$a 和 $b 在小數(shù)點后五位精度內(nèi)都是相等的。
NaN
某些數(shù)學(xué)運(yùn)算會產(chǎn)生一個由常量 NAN 所代表的結(jié)果。此結(jié)果代表著一個在浮點數(shù)運(yùn)算中未定義或不可表述的值。任何拿此值與其它任何值進(jìn)行的松散或嚴(yán)格比較的結(jié)果都是 FALSE。
由于 NAN 代表著任何不同值,不應(yīng)拿 NAN 去和其它值進(jìn)行比較,包括其自身,應(yīng)該用 is_nan() 來檢查。
一個字符串 string 就是由一系列的字符組成,其中每個字符等同于一個字節(jié)。這意味著 PHP 只能支持 256 的字符集,因此不支持 Unicode 。
Note: string 最大可以達(dá)到 2GB。
語法
一個字符串可以用 4 種方式表達(dá):
- 單引號 - 雙引號 - heredoc 語法結(jié)構(gòu) - nowdoc 語法結(jié)構(gòu)(自 PHP 5.3.0 起)
單引號
定義一個字符串的最簡單的方法是用單引號把它包圍起來(字符 ")。
要表達(dá)一個單引號自身,需在它的前面加個反斜線()來轉(zhuǎn)義。要表達(dá)一個反斜線自身,則用兩個反斜線()。其它任何方式的反斜線都會被當(dāng)成反斜線本身:也就是說如果想使用其它轉(zhuǎn)義序列例如 r 或者 n,并不代表任何特殊含義,就單純是這兩個字符本身。
Note: 不像雙引號和 heredoc 語法結(jié)構(gòu),在單引號字符串中的變量和特殊字符的轉(zhuǎn)義序列將不會被替換。
雙引號
轉(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 換頁(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起) 反斜線 $ 美元標(biāo)記 " 雙引號 [0-7]{1,3} 符合該正則表達(dá)式序列的是一個以八進(jìn)制方式來表達(dá)的字符 x[0-9A-Fa-f]{1,2} 符合該正則表達(dá)式序列的是一個以十六進(jìn)制方式來表達(dá)的字符
和單引號字符串一樣,轉(zhuǎn)義任何其它字符都會導(dǎo)致反斜線被顯示出來。PHP 5.1.1 以前,{$var} 中的反斜線還不會被顯示出來;用雙引號定義的字符串最重要的特征是變量會被解析。
Heredoc 結(jié)構(gòu)
第三種表達(dá)字符串的方法是用 heredoc 句法結(jié)構(gòu):<<<。在該運(yùn)算符之后要提供一個標(biāo)識符,然后換行。接下來是字符串 string 本身,最后要用前面定義的標(biāo)識符作為結(jié)束標(biāo)志。
結(jié)束時所引用的標(biāo)識符必須在該行的第一列,而且,標(biāo)識符的命名也要像其它標(biāo)簽一樣遵守 PHP 的規(guī)則:只能包含字母、數(shù)字和下劃線,并且必須以字母和下劃線作為開頭。
要注意的是結(jié)束標(biāo)識符這行除了可能有一個分號(;)外,絕對不能包含其它字符。這意味著標(biāo)識符不能縮進(jìn),分號的前后也不能有任何空白或制表符。更重要的是結(jié)束標(biāo)識符的前面必須是個被本地操作系統(tǒng)認(rèn)可的換行,比如在 UNIX 和 Mac OS X 系統(tǒng)中是 n,而結(jié)束定界符(可能其后有個分號)之后也必須緊跟一個換行。
如果不遵守該規(guī)則導(dǎo)致結(jié)束標(biāo)識不“干凈”,PHP 將認(rèn)為它不是結(jié)束標(biāo)識符而繼續(xù)尋找。如果在文件結(jié)束前也沒有找到一個正確的結(jié)束標(biāo)識符,PHP 將會在最后一行產(chǎn)生一個解析錯誤。
Heredocs 結(jié)構(gòu)不能用來初始化類的屬性。自 PHP 5.3 起,此限制僅對 heredoc 包含變量時有效。
Example #1 非法的示例
Heredoc 結(jié)構(gòu)就象是沒有使用雙引號的雙引號字符串,這就是說在 heredoc 結(jié)構(gòu)中單引號不用被轉(zhuǎn)義,但是上文中列出的轉(zhuǎn)義序列還可以使用。變量將被替換,但在 heredoc 結(jié)構(gòu)中含有復(fù)雜的變量時要格外小心。
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; ?>
以上例程會輸出:
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)來初始化靜態(tài)變量和類的屬性和常量:
Example #4 使用 Heredoc 結(jié)構(gòu)來初始化靜態(tài)值
自 PHP 5.3.0 起還可以在 Heredoc 結(jié)構(gòu)中用雙引號來聲明標(biāo)識符:
Example #5 在 heredoc 結(jié)構(gòu)中使用雙引號
Nowdoc 結(jié)構(gòu)
就象 heredoc 結(jié)構(gòu)類似于雙引號字符串,Nowdoc 結(jié)構(gòu)是類似于單引號字符串的。Nowdoc 結(jié)構(gòu)很象 heredoc 結(jié)構(gòu),但是 nowdoc 中不進(jìn)行解析操作。這種結(jié)構(gòu)很適合用于嵌入 PHP 代碼或其它大段文本而無需對其中的特殊字符進(jìn)行轉(zhuǎn)義。與 SGML 的 結(jié)構(gòu)是用來聲明大段的不用解析的文本類似,nowdoc 結(jié)構(gòu)也有相同的特征。
一個 nowdoc 結(jié)構(gòu)也用和 heredocs 結(jié)構(gòu)一樣的標(biāo)記 <<<, 但是跟在后面的標(biāo)識符要用單引號括起來,即 <<<"EOT"。Heredoc 結(jié)構(gòu)的所有規(guī)則也同樣適用于 nowdoc 結(jié)構(gòu),尤其是結(jié)束標(biāo)識符的規(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; ?>
以上例程會輸出:
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)境中,最典型的示例是用來初始化類的屬性或常量:
Nowdoc 結(jié)構(gòu)是在 PHP 5.3.0 中加入的。
Example #7 靜態(tài)數(shù)據(jù)的示例
變量解析
當(dāng)字符串用雙引號或 heredoc 結(jié)構(gòu)定義時,其中的變量將會被解析。
這里共有兩種語法規(guī)則:一種簡單規(guī)則,一種復(fù)雜規(guī)則。簡單的語法規(guī)則是最常用和最方便的,它可以用最少的代碼在一個 string 中嵌入一個變量,一個 array 的值,或一個 object 的屬性。
復(fù)雜規(guī)則語法的顯著標(biāo)記是用花括號包圍的表達(dá)式。
簡單語法
當(dāng) PHP 解析器遇到一個美元符號($)時,它會和其它很多解析器一樣,去組合盡量多的標(biāo)識以形成一個合法的變量名。可以用花括號來明確變量名的界線。
以上例程會輸出:
He drank some apple juice. He drank some juice made of .
類似的,一個 array 索引或一個 object 屬性也可被解析。數(shù)組索引要用方括號(])來表示索引結(jié)束的邊際,對象屬性則是和上述的變量規(guī)則相同。
Example #8 簡單語法示例
"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 ?>
以上例程會輸出:
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),請用復(fù)雜語法。
復(fù)雜(花括號)語法
復(fù)雜語法不是因為其語法復(fù)雜而得名,而是因為它可以使用復(fù)雜的表達(dá)式。
任何具有 string 表達(dá)的標(biāo)量變量,數(shù)組單元或?qū)ο髮傩远伎墒褂么苏Z法。只需簡單地像在 string 以外的地方那樣寫出表達(dá)式,然后用花括號 { 和 } 把它括起來即可。由于 { 無法被轉(zhuǎn)義,只有 $ 緊挨著 { 時才會被識別。可以用 {$ 來表達(dá) {$。下面的示例可以更好的解釋:
width}00 centimeters broad."; // 有效,只有通過花括號語法才能正確解析帶引號的鍵名 echo "This works: {$arr["key"]}"; // 有效 echo "This works: {$arr[4][3]}"; // 這是錯誤的表達(dá)式,因為就象 $foo[bar] 的格式在字符串以外也是錯的一樣。 // 換句話說,只有在 PHP 能找到常量 foo 的前提下才會正常工作;這里會產(chǎn)生一個 // E_NOTICE (undefined constant) 級別的錯誤。 echo "This is wrong: {$arr[foo][3]}"; // 有效,當(dāng)在字符串中使用多重數(shù)組時,一定要用括號將它括起來 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()}"; ?>
也可以在字符串中用此語法通過變量來調(diào)用類的屬性。
$bar} "; echo "{$foo->$baz[1]} "; ?>
以上例程會輸出:
I am bar. I am bar.
函數(shù)、方法、靜態(tài)類變量和類常量只有在 PHP 5 以后才可在 {$} 中使用。然而,只有在該字符串被定義的命名空間中才可以將其值作為變量名來訪問。只單一使用花括號 ({}) 無法處理從函數(shù)或方法的返回值或者類常量以及類靜態(tài)變量的值。
轉(zhuǎn)換成字符串
一個值可以通過在其前面加上 (string) 或用 strval() 函數(shù)來轉(zhuǎn)變成字符串。在一個需要字符串的表達(dá)式中,會自動轉(zhuǎn)換為 string。比如在使用函數(shù) echo 或 print 時,或在一個變量和一個 string 進(jìn)行比較時,就會發(fā)生這種轉(zhuǎn)換。類型和類型轉(zhuǎn)換可以更好的解釋下面的事情,也可參考函數(shù) settype()。
一個布爾值 boolean 的 TRUE 被轉(zhuǎn)換成 string 的 "1"。Boolean 的 FALSE 被轉(zhuǎn)換成 ""(空字符串)。這種轉(zhuǎn)換可以在 boolean 和 string 之間相互進(jìn)行。
一個整數(shù) integer 或浮點數(shù) float 被轉(zhuǎn)換為數(shù)字的字面樣式的 string(包括 float 中的指數(shù)部分)。使用指數(shù)計數(shù)法的浮點數(shù)(4.1E+6)也可轉(zhuǎn)換。
數(shù)組 array 總是轉(zhuǎn)換成字符串 "Array",因此,echo 和 print 無法顯示出該數(shù)組的內(nèi)容。要顯示某個單元,可以用 echo $arr["foo"] 這種結(jié)構(gòu)。
資源 resource 總會被轉(zhuǎn)變成 "Resource id #1" 這種結(jié)構(gòu)的字符串,其中的 1 是 PHP 在運(yùn)行時分配給該 resource 的唯一值。不要依賴此結(jié)構(gòu),可能會有變更。要得到一個 resource 的類型,可以用函數(shù) get_resource_type()。
NULL 總是被轉(zhuǎn)變成空字符串。
如上面所說的,直接把 array,object 或 resource 轉(zhuǎn)換成 string 不會得到除了其類型之外的任何有用信息??梢允褂煤瘮?shù) print_r() 和 var_dump() 列出這些類型的內(nèi)容。
大部分的 PHP 值可以轉(zhuǎn)變成 string 來永久保存,這被稱作串行化,可以用函數(shù) serialize() 來實現(xiàn)。如果 PHP 引擎設(shè)定支持 WDDX,PHP 值也可被串行化為格式良好的 XML 文本。
字符串轉(zhuǎn)換為數(shù)值
當(dāng)一個字符串被當(dāng)作一個數(shù)值來取值,其結(jié)果和類型如下:
如果該字符串沒有包含 ".","e" 或 "E" 并且其數(shù)字值在整型的范圍之內(nèi)(由 PHP_INT_MAX 所定義),該字符串將被當(dāng)成 integer 來取值。其它所有情況下都被作為 float 來取值。
該字符串的開始部分決定了它的值。如果該字符串以合法的數(shù)值開始,則使用該數(shù)值。否則其值為 0(零)。合法數(shù)值由可選的正負(fù)號,后面跟著一個或多個數(shù)字(可能有小數(shù)點),再跟著可選的指數(shù)部分。指數(shù)部分由 "e" 或 "E" 后面跟著一個或多個數(shù)字構(gòu)成。
兩種復(fù)合類型 array(數(shù)組)PHP 中的數(shù)組實際上是一個有序映射。映射是一種把 values 關(guān)聯(lián)到 keys 的類型。此類型在很多方面做了優(yōu)化,因此可以把它當(dāng)成真正的數(shù)組,或列表(向量),散列表(是映射的一種實現(xiàn)),字典,集合,棧,隊列以及更多可能性。由于數(shù)組元素的值也可以是另一個數(shù)組,樹形結(jié)構(gòu)和多維數(shù)組也是允許的。
語法
定義數(shù)組 array()
可以用 array() 語言結(jié)構(gòu)來新建一個數(shù)組。它接受任意數(shù)量用逗號分隔的 鍵(key) => 值(value)對
array( key => value , ... ) // 鍵(key)可是是一個整數(shù) integer 或字符串 string // 值(value)可以是任意類型的值
最后一個數(shù)組單元之后的逗號可以省略。通常用于單行數(shù)組定義中,例如常用 array(1, 2) 而不是 array(1, 2, )。對多行數(shù)組定義通常保留最后一個逗號,這樣要添加一個新單元時更方便。
自 5.4 起可以使用短數(shù)組定義語法,用 [] 替代 array()。
Example #1 一個簡單數(shù)組
"bar", "bar" => "foo", ); // 自 PHP 5.4 起 $array = [ "foo" => "bar", "bar" => "foo", ]; ?>
key 可以是 integer 或者 string。value 可以是任意類型。
此外 key 會有如下的強(qiáng)制轉(zhuǎn)換:
包含有合法整型值的字符串會被轉(zhuǎn)換為整型。例如鍵名 "8" 實際會被儲存為 8。但是 "08" 則不會強(qiáng)制轉(zhuǎn)換,因為其不是一個合法的十進(jìn)制數(shù)值。
浮點數(shù)也會被轉(zhuǎn)換為整型,意味著其小數(shù)部分會被舍去。例如鍵名 8.7 實際會被儲存為 8。
布爾值也會被轉(zhuǎn)換成整型。即鍵名 true 實際會被儲存為 1 而鍵名 false 會被儲存為 0。
Null 會被轉(zhuǎn)換為空字符串,即鍵名 null 實際會被儲存為 ""。
數(shù)組和對象不能被用為鍵名。堅持這么做會導(dǎo)致警告:Illegal offset type。
如果在數(shù)組定義中多個單元都使用了同一個鍵名,則只使用了最后一個,之前的都被覆蓋了。
Example #2 類型強(qiáng)制與覆蓋示例
"a", "1" => "b", 1.5 => "c", true => "d", ); var_dump($array); ?>
以上例程會輸出:
array(1) { [1]=> string(1) "d" }
上例中所有的鍵名都被強(qiáng)制轉(zhuǎn)換為 1,則每一個新單元都會覆蓋前一個的值,最后剩下的只有一個 "d"。
PHP 數(shù)組可以同時含有 integer 和 string 類型的鍵名,因為 PHP 實際并不區(qū)分索引數(shù)組和關(guān)聯(lián)數(shù)組。
如果對給出的值沒有指定鍵名,則取當(dāng)前最大的整數(shù)索引值,而新的鍵名將是該值加一。如果指定的鍵名已經(jīng)有了值,則該值會被覆蓋。
Example #3 混合 integer 和 string 鍵名
"bar", "bar" => "foo", 100 => -100, -100 => 100, ); var_dump($array); ?>
以上例程會輸出:
array(4) { ["foo"]=> string(3) "bar" ["bar"]=> string(3) "foo" [100]=> int(-100) [-100]=> int(100) }
key 為可選項。如果未指定,PHP 將自動使用之前用過的最大 integer 鍵名加上 1 作為新的鍵名。
Example #4 沒有鍵名的索引數(shù)組
以上例程會輸出:
array(4) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> string(5) "hallo" [3]=> string(5) "world" }
還可以只對某些單元指定鍵名而對其它的空置:
Example #5 僅對部分單元指定鍵名
"c", "d", ); var_dump($array); ?>
以上例程會輸出:
array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [6]=> string(1) "c" [7]=> string(1) "d" }
可以看到最后一個值 "d" 被自動賦予了鍵名 7。這是由于之前最大的整數(shù)鍵名是 6。
用方括號語法訪問數(shù)組單元
數(shù)組單元可以通過 array[key] 語法來訪問。
Example #6 訪問數(shù)組單元
"bar", 42 => 24, "multi" => array( "dimensional" => array( "array" => "foo" ) ) ); var_dump($array["foo"]); var_dump($array[42]); var_dump($array["multi"]["dimensional"]["array"]); ?>
以上例程會輸出:
string(3) "bar" int(24) string(3) "foo"
方括號和花括號可以互換使用來訪問數(shù)組單元(例如 $array[42] 和 $array{42} 在上例中效果相同)。
自 PHP 5.4 起可以用數(shù)組間接引用函數(shù)或方法調(diào)用的結(jié)果。之前只能通過一個臨時變量。
自 PHP 5.5 起可以用數(shù)組間接引用一個數(shù)組原型。
Example #7 數(shù)組間接引用
試圖訪問一個未定義的數(shù)組鍵名與訪問任何未定義變量一樣:會導(dǎo)致 E_NOTICE 級別錯誤信息,其結(jié)果為 NULL。
用方括號的語法新建/修改
可以通過明示地設(shè)定其中的值來修改一個已有數(shù)組。
這是通過在方括號內(nèi)指定鍵名來給數(shù)組賦值實現(xiàn)的。也可以省略鍵名,在這種情況下給變量名加上一對空的方括號([])。
$arr[key] = value; $arr[] = value; // key 可以是 integer 或 string // value 可以是任意類型的值
如果 $arr 還不存在,將會新建一個,這也是另一種新建數(shù)組的方法。不過并不鼓勵這樣做,因為如果 $arr 已經(jīng)包含有值(例如來自請求變量的 string)則此值會保留而 [] 實際上代表著字符串訪問運(yùn)算符。初始化變量的最好方式是直接給其賦值。。
要修改某個值,通過其鍵名給該單元賦一個新值。要刪除某鍵值對,對其調(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 ?>
如上所述,如果給出方括號但沒有指定鍵名,則取當(dāng)前最大整數(shù)索引值,新的鍵名將是該值加上 1(但是最小為 0)。如果當(dāng)前還沒有整數(shù)索引,則鍵名將為 0。注意這里所使用的最大整數(shù)鍵名不一定當(dāng)前就在數(shù)組中。它只要在上次數(shù)組重新生成索引后曾經(jīng)存在過就行了。以下面的例子來說明
下面的例子來說明:
$value) { unset($array[$i]); } print_r($array); // 添加一個單元(注意新的鍵名是 5,而不是你可能以為的 0) $array[] = 6; print_r($array); // 重新索引: $array = array_values($array); $array[] = 7; print_r($array); ?>
以上例程會輸出:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
實用函數(shù)
有很多操作數(shù)組的函數(shù),參見數(shù)組函數(shù)一節(jié)
unset() 函數(shù)允許刪除數(shù)組中的某個鍵。但要注意數(shù)組將不會重建索引。如果需要刪除后重建索引,可以用 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ù)組的。它提供了一個簡單的方法來遍歷數(shù)組。
和在語法一節(jié)中規(guī)定的一樣,在方括號(“[”和“]”)之間必須有一個表達(dá)式。這意味著可以這樣寫:
轉(zhuǎn)換為數(shù)組
對于任意 integer,float,string,boolean 和 resource 類型,如果將一個值轉(zhuǎn)換為數(shù)組,將得到一個僅有一個元素的數(shù)組,其下標(biāo)為 0,該元素即為此標(biāo)量的值。換句話說,(array)$scalarValue 與 array($scalarValue) 完全一樣。
如果一個 object 類型轉(zhuǎn)換為 array,則結(jié)果為一個數(shù)組,其單元為該對象的屬性。鍵名將為成員變量名,不過有幾點例外:整數(shù)屬性不可訪問;私有變量前會加上類名作前綴;保護(hù)變量前會加上一個 "*" 做前綴。這些前綴的前后都各有一個 NULL 字符。這會導(dǎo)致一些不可預(yù)知的行為:
可以用 array_diff() 和數(shù)組運(yùn)算符來比較數(shù)組。
直接改變數(shù)組的值自 PHP 5 起可以通過引用傳遞來做到。之前的版本需要需要采取變通的方法:
Example #10 在循環(huán)中改變單元
$color) { $colors[$key] = strtoupper($color); } print_r($colors); ?>
以上例程會輸出:
Array ( [0] => RED [1] => BLUE [2] => GREEN [3] => YELLOW )
數(shù)組(Array) 的賦值總是會涉及到值的拷貝。使用引用運(yùn)算符通過引用來拷貝數(shù)組。
object(對象)對象初始化
要創(chuàng)建一個新的對象 object,使用 new 語句實例化一個類:
do_foo(); ?>
詳細(xì)討論參見手冊中類與對象章節(jié)。
轉(zhuǎn)換為對象
如果將一個對象轉(zhuǎn)換成對象,它將不會有任何變化。如果其它任何類型的值被轉(zhuǎn)換成對象,將會創(chuàng)建一個內(nèi)置類 stdClass 的實例。如果該值為 NULL,則新的實例為空。數(shù)組轉(zhuǎn)換成對象將使鍵名成為屬性名并具有相對應(yīng)的值。對于任何其它的值,名為 scalar 的成員變量將包含該值。
scalar; // outputs "ciao" ?>兩種特殊類型: resource(資源)
資源 resource 是一種特殊變量,保存了到外部資源的一個引用。資源是通過專門的函數(shù)來建立和使用的。所有這些函數(shù)及其相應(yīng)資源類型見附錄。
參見 get_resource_type()。
轉(zhuǎn)換為資源
由于資源類型變量保存有為打開文件、數(shù)據(jù)庫連接、圖形畫布區(qū)域等的特殊句柄,因此將其它類型的值轉(zhuǎn)換為資源沒有意義。
釋放資源
由于 PHP 4 Zend 引擎引進(jìn)了引用計數(shù)系統(tǒng),可以自動檢測到一個資源不再被引用了(和 Java 一樣)。這種情況下此資源使用的所有外部資源都會被垃圾回收系統(tǒng)釋放。因此,很少需要手工釋放內(nèi)存。
由于 PHP 4 Zend 引擎引進(jìn)了引用計數(shù)系統(tǒng),可以自動檢測到一個資源不再被引用了(和 Java 一樣)。這種情況下此資源使用的所有外部資源都會被垃圾回收系統(tǒng)釋放。因此,很少需要手工釋放內(nèi)存。NULL
持久數(shù)據(jù)庫連接比較特殊,它們不會被垃圾回收系統(tǒng)銷毀。參見數(shù)據(jù)庫永久連接一章。
特殊的 NULL 值表示一個變量沒有值。NULL 類型唯一可能的值就是 NULL。
在下列情況下一個變量被認(rèn)為是 NULL:
被賦值為 NULL。
尚未被賦值。
被 unset()。
使用 (unset) $var 將一個變量轉(zhuǎn)換為 null 將不會刪除該變量或 unset 其值。僅是返回 NULL 值而已。
(已完結(jié))
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/21396.html
摘要:服務(wù)端的開發(fā)離不開協(xié)議,的出現(xiàn)對于學(xué)習(xí)通信來說,無疑是非常好的教材。一旦握手成功,一個雙向連接通道就建立了。類型包括文本,二進(jìn)制,協(xié)議層信號等。目前一共有種類型,種保留類型。表示異或,表示取模。 服務(wù)端的開發(fā)離不開協(xié)議,swoole的出現(xiàn)對于學(xué)習(xí)通信來說,無疑是非常好的教材。非常推薦大家下載 Swoole Framework,其中包含了多種協(xié)議的php實現(xiàn),例如FTP,HTTP,...
摘要:格式支持比鍵值對復(fù)雜得多的結(jié)構(gòu)化數(shù)據(jù),這一點也很有用。例如下面這段代碼最終發(fā)送的請求是這種方案,可以方便的提交復(fù)雜的結(jié)構(gòu)化數(shù)據(jù),特別適合的接口。 簡介 form的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,默認(rèn)為application/x-www-form-urlencoded。 ...
閱讀 2910·2021-10-27 14:19
閱讀 540·2021-10-18 13:29
閱讀 1134·2021-07-29 13:56
閱讀 3553·2019-08-30 13:19
閱讀 1932·2019-08-29 12:50
閱讀 1056·2019-08-23 18:16
閱讀 3525·2019-08-22 15:37
閱讀 1903·2019-08-22 15:37