【PHP系列教程】(3)——PHP的類型

來源:互聯網
上載者:User
文章目錄
  • 一、類型的介紹
  • 二、布爾型
  • 三、整型
  • 四、字串
  • 五、數組

PHP支援8種原始類型,其中包括:

4種標量類型:boolean(布爾型)、integer(整型)、float(浮點型)、string(字元型);

2種複合類型:array(數組)、object(對象);

2種特殊類型:resource(資源)、NULL

您可能還會讀到一些關於“雙精確度(double)”類型的參考。實際上 double 和 float 是相同的,由於一些曆史的原因,這兩個名稱同時存在。

變數的類型通常不是由程式員設定的,確切地說,是由 PHP 根據該變數使用的上下文在運行時決定的。

一、類型的介紹

注: 如果你想查看某個運算式的值和類型,用 var_dump()。

注: 如果你只是想得到一個易讀懂的類型的表達方式用於調試,用 gettype()。要查看某個類型,不要用 gettype(),而用 is_type 函數。以下是一些範例:
代碼1:

<?php<br />$bool = TRUE; // a boolean<br />$str = "foo"; // a string<br />$int = 12; // an integer</p><p>echo gettype($bool); // prints out "boolean"<br />echo gettype($str); // prints out "string"</p><p>// If this is an integer, increment it by four<br />if (is_int($int)) {<br /> $int += 4;<br />}</p><p>// If $bool is a string, print it out<br />// (does not print out anything)<br />if (is_string($bool)) {<br /> echo "String: $bool";<br />}<br />?><br />

如果你要將一個變數強制轉換為某類型,可以對其使用強制轉換或者 settype() 函數。

二、布爾型

這是最簡單的類型。boolean表達了真值,可以為TRUE或者FALSE。(註:布爾類型是PHP 4引進的)

要指定一個布爾值,使用關鍵字 TRUE 或 FALSE。兩個都是大小寫不敏感的。

<?php<br />$foo = True; // assign the value TRUE to $foo<br />?>

通常你用某些運算子返回 boolean 值,並將其傳遞給流程式控制制。

// == is an operator which test<br />// equality and returns a boolean<br />if ($action == "show_version") {<br /> echo "The version is 1.23";<br />}</p><p>// this is not necessary...<br />if ($show_separators == TRUE) {<br /> echo "<hr>/n";<br />}</p><p>// ...because you can simply type<br />if ($show_separators) {<br /> echo "<hr>/n";<br />}

要明示地將一個值轉換成 boolean,用 (bool) 或者 (boolean) 來強制轉換。但是很多情況下不需要用強制轉換,因為當運算子,函數或者流程式控制制需要一個 boolean 參數時,該值會被自動轉換。

當轉換為 boolean 時,以下值被認為是 FALSE:

布爾值 FALSE、整型值 0、浮點型值 0.0、空白字串和字串 "0"、沒有成員變數的數組、沒有單元的對象、特殊類型NULL(包括尚未設定的變數)

所有其它值都被認為是 TRUE(包括任何資源)。

註:-1 和其它非零值(不論正負)一樣,被認為是 TRUE! 

三、整型

一個 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一個數。

整型值可以用十進位,十六進位或八進位符號指定,前面可以加上可選的符號(- 或者 +)。
如果用八進位符號,數字前必須加上 0,用十六進位符號數字前必須加上 0x。

代碼1:整數文字表達
<?php<br />$a = 1234; # 十進位數<br />$a = -123; # 一個負數<br />$a = 0123; # 八位元(等於十進位的 83)<br />$a = 0x1A; # 十六進位數(等於十進位的 26)<br />?>

在字面上,整型變數正式的結構可以為:

<?php<br />decimal : [1-9][0-9]*<br /> | 0</p><p>hexadecimal : 0[xX][0-9a-fA-F]+</p><p>octal : 0[0-7]+</p><p>integer : [+-]?decimal<br /> | [+-]?hexadecimal<br /> | [+-]?octal<br />?><br />

整型數的字長和平台有關,儘管通常最大值是大約二十億(32 位有符號)。PHP 不支援不帶正負號的整數。

如果你指定一個數超出了 integer 的範圍,將會被解釋為 float。同樣如果你執行的運算結果超出了 integer 範圍,也會返回 float。

<?php<br />$large_number = 2147483647;<br />var_dump($large_number);<br />// 輸出為:int(2147483647)</p><p>$large_number = 2147483648;<br />var_dump($large_number);<br />// 輸出為:float(2147483648)</p><p>// 同樣也適用於十六進位表示的整數:<br />var_dump( 0x80000000 );<br />// 輸出為:float(2147483648)</p><p>$million = 1000000;<br />$large_number = 50000 * $million;<br />var_dump($large_number);<br />// 輸出為:float(50000000000)<br />?>

PHP 中沒有整除的運算子。1/2 產生出浮點數 0.5。您可以總是捨棄小數部分,或者使用 round() 函數。

<?php<br />var_dump(25/7); // float(3.5714285714286)<br />var_dump((int) (25/7)); // int(3)<br />var_dump(round(25/7)); // float(4)<br />?>

要明示地將一個值轉換為 integer,用 (int) 或 (integer) 強制轉換。不過大多數情況下都不需要強制轉換,因為當運算子,函數或流程式控制制需要一個 integer 參數時,值會自動轉換。您還可以通過函數 intval() 來將一個值轉換成整型。

1、從布爾型轉換:FALSE 將產生出 0,TRUE 將產生出 1。

2、從浮點型轉換:

當從浮點數轉換成整數時,數字將被取整(丟棄小數位)。

如果浮點數超出了整數範圍(通常為 +/- 2.15e+9 = 2^31),則結果不確定,因為沒有足夠的精度使浮點數給出一個確切的整數結果。在此情況下沒有警告,甚至沒有任何通知!

註:在 Linux 下返回結果是最小負數(-2147483648),而在 Windows 下返回結果是零(0)。

註:決不要將未知的分數強制轉換為 integer,這樣有時會導致意外的結果。

<?php<br />echo (int) ( (0.1+0.7) * 10 ); // 顯示 7!<br />?>

四、字串

string 是一系列字元。在 PHP 中,字元和位元組一樣,也就是說,一共有 256 種不同字元的可能性。這也暗示 PHP 對 Unicode 沒有本地支援。請參閱函數 utf8_encode() 和 utf8_decode() 以瞭解有關 Unicode 支援。

註:一個字串變得非常巨大也沒有問題,PHP 沒有給字串的大小強加實現範圍,所以完全沒有理由擔心長字串。

字串可以用三種字面上的方法定義,分別為: 單引號、雙引號、定界符

4.1 單引號

指定一個簡單字串的最簡單的方法是用單引號(字元 ')括起來。

要表示一個單引號,需要用反斜線(/)轉義,和很多其它語言一樣。如果在單引號之前或字串結尾需要出現一個反斜線,需要用兩個反斜線表示。注意如果你試圖轉義任何其它字元,反斜線本身也會被顯示出來!所以通常不需要轉義反斜線本身。
注: 在 PHP 3 中,此情況下將發出一個 E_NOTICE 級的警告。

注: 和其他兩種文法不同,單引號字串中出現的變數和逸出序列不會被變數的值替代。
<?php<br />echo 'this is a simple string';</p><p>echo 'You can also have embedded newlines in<br />strings this way as it is<br />okay to do';</p><p>// Outputs: Arnold once said: "I'll be back"<br />echo 'Arnold once said: "I/'ll be back"';</p><p>// Outputs: You deleted C:/*.*?<br />echo 'You deleted C://*.*?';</p><p>// Outputs: You deleted C:/*.*?<br />echo 'You deleted C:/*.*?';</p><p>// Outputs: This will not expand: /n a newline<br />echo 'This will not expand: /n a newline';</p><p>// Outputs: Variables do not $expand $either<br />echo 'Variables do not $expand $either';<br />?>

4.2 雙引號

如果用雙引號(")括起字串,PHP 懂得更多特殊字元的逸出序列:

表格1:逸出字元

序列 含義
/n 換行(LF 或 ASCII 字元 0x0A(10))
/r 斷行符號(CR 或 ASCII 字元 0x0D(13))
/t 水平定位字元(HT 或 ASCII 字元 0x09(9))
// 反斜線
/$ 貨幣符號
/" 雙引號
/[0-7]{1,3} 此Regex序列匹配一個用八進位符號表示的字元
/x[0-9A-Fa-f]{1,2} 此Regex序列匹配一個用十六進位符號表示的字元

此外,如果試圖轉義任何其它字元,反斜線本身也會被顯示出來!雙引號字串最重要的一點是其中的變數名會被變數值替代。

4.3 定界符

另一種給字串定界的方法使用定界符文法(“<<<”)。應該在 <<< 之後提供一個標識符,然後是字串,然後是同樣的標識符結束字串。

結束標識符必須從行的第一列開始。同樣,標識符也必須遵循 PHP 中其它任何標籤的命名規則:只能包含字母數字底線,而且必須以底線或非數字字元開始。

警告:很重要的一點必須指出,結束標識符所在的行不能包含任何其它字元,可能除了一個分號(;)之外。這尤其意味著該標識符不能被縮排,而且在分號之前和之後都不能有任何空格或定位字元。同樣重要的是要意識到在結束標識符之前的第一個字元必須是你的作業系統中定義的分行符號。例如在 Macintosh 系統中是 /r。

如果破壞了這條規則使得結束標識符不“乾淨”,則它不會被視為結束標識符,PHP 將繼續尋找下去。如果在這種情況下找不到合適的結束標識符,將會導致一個在指令碼最後一行出現的語法錯誤。
定界符文本表現的就和雙引號字串一樣,只是沒有雙引號。這意味著在定界符文本中不需要轉義引號,不過仍然可以用以上列出來的轉義代碼。變數會被展開,但當在定界符文本中表達複雜變數時和字串一樣同樣也要注意。

代碼1:定界符字串例子

<?php<br />$str = <<<EOD<br />Example of string<br />spanning multiple lines<br />using heredoc syntax.<br />EOD;</p><p>/* More complex example, with variables. */<br />class foo<br />{<br /> var $foo;<br /> var $bar;</p><p> function foo()<br /> {<br /> $this->foo = 'Foo';<br /> $this->bar = array('Bar1', 'Bar2', 'Bar3');<br /> }<br />}</p><p>$foo = new foo();<br />$name = 'MyName';</p><p>echo <<<EOT<br />My name is "$name". I am printing some $foo->foo.<br />Now, I am printing some {$foo->bar[1]}.<br />This should print a capital 'A': /x41<br />EOT;<br />?>

4.4 變數解析

當用雙引號或者定界符指定字串時,其中的變數會被解析。

有兩種文法,一種簡單的和一種複雜的。簡單文法最通用和方便,它提供瞭解析變數,數組值,或者對象屬性的方法。

複雜文法是 PHP 4 引進的,可以用花括弧括起一個運算式。

如果遇到貨幣符號($),解析器會儘可能多地取得後面的字元以組成一個合法的變數名。如果你想明示指定名字的結束,用花括弧把變數名括起來。

<?php<br />$beer = 'Heineken';<br />echo "$beer's taste is great"; // works, "'" is an invalid character for varnames<br />echo "He drank some $beers"; // won't work, 's' is a valid character for varnames<br />echo "He drank some ${beer}s"; // works<br />echo "He drank some {$beer}s"; // works<br />?>

同樣也可以解析數組索引或者對象屬性。對於數組索引,右方括弧(])標誌著索引的結束。對象屬性則和簡單變數適用同樣的規則,儘管對於對象屬性沒有像變數那樣的小技巧。

<?php<br />// These examples are specific to using arrays inside of strings.<br />// When outside of a string, always quote your array string keys<br />// and do not use {braces} when outside of strings either.</p><p>// Let's show all errors<br />error_reporting(E_ALL);</p><p>$fruits = array('strawberry' => 'red', 'banana' => 'yellow');<br />// Works but note that this works differently outside string-quotes<br />echo "A banana is $fruits[banana].";<br />// Works<br />echo "A banana is {$fruits['banana']}.";</p><p>// Works but PHP looks for a constant named banana first<br />// as described below.<br />echo "A banana is {$fruits[banana]}.";</p><p>// Won't work, use braces. This results in a parse error.<br />echo "A banana is $fruits['banana'].";</p><p>// Works<br />echo "A banana is " . $fruits['banana'] . ".";</p><p>// Works</p><p>echo "This square is $square->width meters broad.";<br />// Won't work. For a solution, see the complex syntax.<br />echo "This square is $square->width00 centimeters broad.";<br />?>

4.5 複雜文法

不是因為文法複雜而稱其為複雜,而是因為用此方法可以包含複雜的運算式。

事實上,用此文法你可以在字串中包含任何在名字空間的值。僅僅用和在字串之外同樣的方法寫一個運算式,然後用 { 和 } 把它包含進來。因為不能轉義“{”,此文法僅在 $ 緊跟在 { 後面時被識別(用“{/$”或者“/{$”來得到一個字面上的“{$”)。用一些例子可以更清晰:
<?php<br />// Let's show all errors<br />error_reporting(E_ALL);</p><p>$great = 'fantastic';</p><p>// 不行,輸出為:This is { fantastic}<br />echo "This is { $great}";</p><p>// 可以,輸出為:This is fantastic<br />echo "This is {$great}";<br />echo "This is ${great}";</p><p>// Works<br />echo "This square is {$square->width}00 centimeters broad.";</p><p>// Works<br />echo "This works: {$arr[4][3]}";<br />// This is wrong for the same reason as $foo[bar] is wrong<br />// outside a string. In otherwords, it will still work but<br />// because PHP first looks for a constant named foo, it will<br />// throw an error of level E_NOTICE (undefined constant).<br />echo "This is wrong: {$arr[foo][3]}";<br />// Works. When using multi-dimensional arrays, always use<br />// braces around arrays when inside of strings<br />echo "This works: {$arr['foo'][3]}";</p><p>// Works.<br />echo "This works: " . $arr['foo'][3];</p><p>echo "You can even write {$obj->values[3]->name}";</p><p>echo "This is the value of the var named $name: {${$name}}";<br />?>

4.6 訪問字串中的字元

字串中的字元可以通過在字串之後用花括弧指定所要字元從零開始的位移量來訪問。

注: 為了向下相容,仍然可以用方括弧。不過此文法在 PHP 4 中不贊成使用。

代碼2:一些字串的例子

<?php<br />// Get the first character of a string<br />$str = 'This is a test.';<br />$first = $str{0};<br />// Get the third character of a string<br />$third = $str{2};</p><p>// Get the last character of a string.<br />$str = 'This is still a test.';<br />$last = $str{strlen($str)-1};<br />?>

4.7 實用函數及操作符

字串可以用“.”(點)運算子串連。注意這裡不能用“+”(加)運算子。更多資訊參見字串運算子。

有很多實用函數來改變字串。

普通函數見字串函數庫一節,進階搜尋和替換見Regex函數(兩種口味:Perl 和 POSIX 擴充)。

還有 URL 字串函數,以及加密/解密字串的函數(mcrypt 和 mhash)。

4.8 字串轉換

您可以用 (string) 標記或者 strval() 函數將一個值轉換為字串。當某運算式需要字串時,字串的轉換會在運算式範圍內自動完成。例如當你使用 echo() 或者 print() 函數時,或者將一個變數值與一個字串進行比較的時候。閱讀手冊中有關類型和類型戲法中的部分有助於更清楚一些。參見 settype()。

布爾值 TRUE 將被轉換為字串 "1",而值 FALSE 將被表示為 ""(即Null 字元串)。這樣您就可以隨意地在布爾值和字串之間進行比較。

整數或浮點數數值在轉換成字串時,字串即為表示這些數值數字(浮點數還包含有指數部分)。

數組將被轉換成字串 "Array",因此您無法通過 echo() 或者 print() 函數來輸出數組的內容。請參考下文以擷取更多提示。

對象將被轉換成字串 "Object"。如果您因為調試需要,需要將對象的成員變數列印出來,請閱讀下文。如果您希望得到該對象所依附的類的名稱,請使用函數 get_class()。

資源類型將會以 "Resource id #1" 的格式被轉換成字串,其中 1 是 PHP 在運行時給資源指定的唯一標識。如果您希望擷取資源的類型,請使用函數 get_resource_type().

NULL 將被轉換成Null 字元串。

正如以上所示,將數組、對象或者資源列印出來,並不能給您提供任何關於這些值本身的有用的資訊。請參閱函數 print_r() 和 var_dump(),對於調試來說,這些是更好的列印值的方法。

您可以將 PHP 的值轉換為字串以永久地儲存它們。這種方法被稱為序列化,您可以用函數 serialize() 來完成該操作。如果您在安裝 PHP 時建立了 WDDX 支援,您還可以將 PHP 的值序列化為 XML 結構。

4.9 字串轉換為數值

當一個字串被當作數字來求值時,根據以下規則來決定結果的類型和值。

如果包括“.”,“e”或“E”其中任何一個字元的話,字串被當作 float 來求值。否則就被當作整數。

該值由字串最前面的部分決定。如果字串以合法的數字資料開始,就用該數字作為其值,否則其值為 0(零)。合法數字資料由可選的加號或減號開始,後面跟著一個或多個數字(可選地包括十進位分數),後面跟著可選的指數。指數是一個“e”或者“E”後面跟著一個或多個數字。

<?php<br />$foo = 1 + "10.5"; // $foo is float (11.5)<br />$foo = 1 + "-1.3e3"; // $foo is float (-1299)<br />$foo = 1 + "bob-1.3e3"; // $foo is integer (1)<br />$foo = 1 + "bob3"; // $foo is integer (1)<br />$foo = 1 + "10 Small Pigs"; // $foo is integer (11)<br />$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)<br />$foo = "10.0 pigs " + 1; // $foo is float (11)<br />$foo = "10.0 pigs " + 1.0; // $foo is float (11)<br />?>

如果你想測試本節中的任何例子,可以拷貝和粘貼這些例子並且加上下面這一行自己看看會發生什麼:<?php<br />echo "/$foo==$foo; type is " . gettype ($foo) . "<br />/n";<br />?>

不要指望在將一個字元轉換成整型時能夠得到該字元的編碼(您可能也會在 C 中這麼做)。如果您希望在字元編碼和字元之間轉換,請使用 ord() 和 chr() 函數。

五、數組

PHP 中的數組實際上是一個有序圖。圖是一種把 values 映射到 keys 的類型。此類型在很多方面做了最佳化,因此你可以把它當成真正的數組來使用,或列表(向量),散列表(是圖的一種實現),字典,集合,棧,隊列以及更多可能性。因為可以用另一個 PHP 數組作為值,也可以很容易地類比樹。

5.1 文法

可以用 array() 語言結構來建立一個 array。它接受一定數量用逗號分隔的 key => value 參數對。

array( [key =>]<br />value<br /> , ...<br /> )<br />// key 可以是 integer 或者 string<br />// value 可以是任何值<br />

<?php<br />$arr = array("foo" => "bar", 12 => true);</p><p>echo $arr["foo"]; // bar<br />echo $arr[12]; // 1<br />?>

key 可以是 integer 或者 string。如果鍵名是一個 integer 的標準表達方法,則被解釋為整數(例如 "8" 將被解釋為 8,而 "08" 將被解釋為 "08")。PHP 中數組下標的變數類型不會對數組造成影響,數組的類型只有一種,它可以同時包含整型和字串型的下標。

值可以是任何值。
<?php<br />$arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42));</p><p>echo $arr["somearray"][6]; // 5<br />echo $arr["somearray"][13]; // 9<br />echo $arr["somearray"]["a"]; // 42<br />?>

如果對給出的值沒有指定鍵名,則取當前最大的整數索引值,而新的鍵名將是該值加一。如果你指定的鍵名已經有了值,則該值會被覆蓋。

<?php<br />// This array is the same as ...<br />array(5 => 43, 32, 56, "b" => 12);</p><p>// ...this array<br />array(5 => 43, 6 => 32, 7 => 56, "b" => 12);<br />?>

警告:自 PHP 4.3.0 起,上述的索引產生方法改變了。如今如果你給一個當前最大鍵名是負值的數組添加一個新值,則新產生的的索引將為零(0)。以前新產生的索引為當前最大索引加一,和正值的索引相同。

使用 TRUE 作為鍵名將使 integer 1 成為鍵名。使用 FALSE 作為鍵名將使 integer 0 成為鍵名。使用 NULL 作為鍵名將等同於使用Null 字元串。使用Null 字元串作為鍵名將建立(或覆蓋)一個用Null 字元串作為鍵名的值,這和用空的方括弧不一樣。

不能用數組和對象作為鍵名。這樣做會導致一個警告:Illegal offset type。

5.2 用方括弧的文法建立/修改

可以通過明示地設定值來改變一個現有的數組。

這是通過在方括弧內指定鍵名來給數組賦值實現的。也可以省略鍵名,在這種情況下給變數名加上一對空的方括弧("[]")。

$arr[key] = value;<br />$arr[] = value;<br />// key 可以是 integer 或者 string<br />// value 可以為任何值。<br />

如果 $arr 還不存在,將會建立一個。這也是一種定義數組的替換方法。要改變一個值,只要給它賦一個新值。如果要刪除一個鍵名/值對,要對它用 unset()。

<?php<br />$arr = array(5 => 1, 12 => 2);<br />$arr[] = 56; // This is the same as $arr[13] = 56;<br /> // at this point of the script<br />$arr["x"] = 42; // This adds a new element to<br /> // the array with key "x"<br />unset($arr[5]); // This removes the element from the array<br />unset($arr); // This deletes the whole array<br />?>

注: 如上所述,如果你給出方括弧但沒有指定鍵名,則取當前最大整數索引值,新的鍵名將是該值 + 1。如果當前還沒有整數索引,則鍵名將為 0。如果制定的鍵名已經有值了,該值將被覆蓋。

注意這裡所使用的最大整數鍵名不一定當前就在數組中。它只要在上次數組重建索引後曾經存在過就行了。以下例子說明了:

<?php<br />// 建立一個簡單的數組<br />$array = array(1, 2, 3, 4, 5);<br />print_r($array);</p><p>// 現在刪除其中的所有單元,但保持數組本身的結構<br />foreach ($array as $i => $value) {<br /> unset($array[$i]);<br />}<br />print_r($array);</p><p>// 添加一個單元(注意新的鍵名是 5,而不是你可能以為的 0)<br />$array[] = 6;<br />print_r($array);</p><p>// 重新索引:<br />$array = array_values($array);<br />$array[] = 7;<br />print_r($array);<br />?>

以上例子將產生如下輸出:

Array(    [0] => 1    [1] => 2    [2] => 3    [3] => 4    [4] => 5)Array()Array(    [5] => 6)Array(    [0] => 6    [1] => 7)
5.3 實用函數

有相當多的實用函數作用於數組,unset() 函數允許取消一個數組中的鍵名。要注意數組將不會重建索引。

<?PHP$a = array( 1 => 'one', 2 => 'two', 3 => 'three' );unset( $a[2] );/* 將產生一個數組,定義為 $a = array( 1=>'one', 3=>'three'); 而不是 $a = array( 1 => 'one', 2 => 'three');*/$b = array_values($a);// Now b is array(1 => 'one', 2 =>'three')?>

foreach 控制結構是專門用於數組的。它提供了一個簡單的方法來遍曆數組。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.