同javascript一樣,php也是一門弱類型語言,或者說成類型松散的語言。在強類型語言中,變量要先指定類型,然後才可以對應指定類型的數制。而php則不必告知變量的數據類型,會根據它的值,自動把變量轉換成正確的數據類型。下面將詳細介紹php的數據類型
PHP數據類型包括8種:其中包括四種標量類型、兩種復合類型和兩種特殊類型。具體是:字符串、整數、浮點數、布爾、數組、對象、NULL、資源
如果想查看某個表達式的值和類型,可以使用函數var_dump()
<?php $var = 1; //int 1 echo var_dump($var); echo '<br>'; $var = 1.0; //float 1 echo var_dump($var); echo '<br>'; $var = true; //boolean true echo var_dump($var); echo '<br>'; $var = '1'; //string '1' (length=1) echo var_dump($var); echo '<br>'; ?>
布爾型是最簡單的類型。boolean表達了真值,可以為TRUE或FALSE
要指定一個布爾值,使用關鍵字 TRUE 或 FALSE。兩個都不區分大小寫
<?php $foo = True; // assign the value TRUE to $foo ?>
轉換
要明確地將一個值轉換成 boolean,用 (bool) 或者 (boolean) 來強制轉換
假值
當轉換為boolean時,以下值被認為是 FALSE:
布爾值 FALSE 本身
整型值 0
浮點型值 0.0
空字符串,以及字符串 "0"
不包括任何元素的數組
不包括任何成員變量的對象(僅 PHP 4.0 適用)
特殊類型 NULL(包括尚未賦值的變量)
從空標記生成的SimpleXML對象
<?php var_dump((bool) ""); // bool(false) var_dump((bool) 1); // bool(true) var_dump((bool) -2); // bool(true) var_dump((bool) "foo"); // bool(true) var_dump((bool) 2.3e5); // bool(true) var_dump((bool) array(12)); // bool(true) var_dump((bool) array()); // bool(false) var_dump((bool) "false"); // bool(true) ?>
檢測
is_bool()函數用來檢測變量是否是布爾型
bool is_bool ( mixed $var )
如果 var 是 boolean 則返回 TRUE
<?php $a = false; $b = 0; // 因為 $a 是布爾型,所以結果為真 if (is_bool($a)) { print "Yes, this is a boolean"; } // 因為 $b 不是布爾型,所以結果為非真 if (is_bool($b)) { print "Yes, this is a boolean"; } ?>
PHP整數必須至少有一個數字,不能包含逗號或空格,不能有小數點,正負均可
整型值可以使用十進制,十六進制,八進制或二進制表示,前面可以加上可選的符號(- 或者 +)
二進制表達的 integer 自 PHP 5.4.0 起可用
要使用八進制表達,數字前必須加上 0(零)。要使用十六進制表達,數字前必須加上 0x。要使用二進制表達,數字前必須加上 0b
<?php $a = 1234; // 十進制數 $a = -123; // 負數 $a = 0123; // 八進制數(等於十進制 83) $a = 0x1A; // 十六進制數(等於十進制 26) ?>
整型數的字長和平台有關,盡管通常最大值是大約二十億(32 位有符號)。64位平台下的最大值通常是大約 9E18。PHP不支持無符號整數。Integer 值的字長可以用常量 PHP_INT_SIZE來表示,自 PHP 4.4.0 和 PHP 5.0.5後,最大值可以用常量 PHP_INT_MAX 來表示
<?php echo PHP_INT_SIZE;//4 echo PHP_INT_MAX;//2147483647 ?>
溢出
如果給定的一個數超出了 integer 的范圍,將會被解釋為 float。同樣如果執行的運算結果超出了 integer 范圍,也會返回 float
<?php $large_number = 2147483647; var_dump($large_number); // int(2147483647) $large_number = 2147483648; var_dump($large_number); // float(2147483648) $million = 1000000; $large_number = 50000 * $million; var_dump($large_number); // float(50000000000) ?>
轉換
要明確地將一個值轉換為 integer,用 (int) 或 (integer) 強制轉換。還可以通過函數 intval() 來將一個值轉換成整型
<?php echo intval(42); // 42 echo intval(4.2); // 4 echo intval('+42'); // 42 echo intval('-42'); // -42 echo intval(042); // 34 echo intval('042'); // 42 echo intval(1e10); // 1410065408 echo intval('1e10'); // 1 echo intval(0x1A); // 26 echo intval(420000000000000000000); // 0 echo intval(42, 8); // 42 echo intval('42', 8); // 34 echo intval(array()); // 0 echo intval(array('foo', 'bar')); // 1 ?>
從布爾值轉換,FALSE 將產生出 0,TRUE 將產生出 1;從浮點型轉換,當從浮點數轉換成整數時,將向下取整;從字符串轉換,如果該字符串沒有包含 '.','e' 或 'E' 並且其數字值在整型的范圍之內,該字符串將被當成 integer 來取值。其它所有情況下都被作為float來取值。該字符串的開始部分決定了它的值。如果該字符串以合法的數值開始,則使用該數值。否則其值為0。合法數值由可選的正負號,後面跟著一個或多個數字(可能有小數點),再跟著可選的指數部分。指數部分由'e'或'E'後面跟著一個或多個數字構成
<?php echo (int)true;//1 echo (int)false;//0 echo (int)1.6;//1 echo (int)'1.6px';//1 echo (int)'px';//0 ?>
檢測
is_int()、is_integer()、is_long()這三個函數可以用來檢測變量是否是整數
<?php $a = 1; $b = 1.0; var_dump(is_int($a));//true var_dump(is_int($b));//false var_dump(is_integer($a));//true var_dump(is_integer($b));//false var_dump(is_long($a));//true var_dump(is_long($b));//false ?>
浮點型(也叫浮點數 float,雙精度數 double 或實數 real)
<?php $a = 1.234; $b = 1.2e3; $c = 7E-10; ?>
PHP 通常使用 IEEE 754 雙精度格式,則由於取整而導致的最大相對誤差為 1.11e-16。非基本數學運算可能會給出更大誤差,並且要考慮到進行復合運算時的誤差傳遞
以十進制能夠精確表示的有理數如 0.1 或 0.7,無論有多少尾數都不能被內部所使用的二進制精確表示,因此不能在不丟失一點點精度的情況下轉換為二進制的格式。這就會造成混亂的結果:例如,floor((0.1+0.7)*10) 通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9999999999999991118...
<?php echo floor((0.1+0.7)*10);//7 ?>
轉換
要明確地將一個值轉換為 float,用(float)強制轉換。還可以通過函數 floatval()、doubleval()來將一個值轉換成整型。除了字符串類型之外,一般地,都是先將值轉換成整型,然後再轉換成浮點數
<?php $var1 = '122.34343The'; $float_value1_of_var1 = floatval ($var1); $float_value1_of_var1 = doubleval ($var1); print $float_value1_of_var1; // 打印出 122.34343 print $float_value1_of_var1; // 打印出 122.34343 $var2 = true; $float_value2_of_var2 = floatval ($var2); $float_value2_of_var2 = doubleval ($var2); print $float_value2_of_var2; // 打印出 1 print $float_value2_of_var2; // 打印出 1 ?>
比較浮點數
比較兩個浮點數是否相等是有問題的。不過還是有迂回的方法來比較浮點數值的
要測試浮點數是否相等,要使用一個僅比該數值大一丁點的最小誤差值。該值也被稱為機器極小值(epsilon)或最小單元取整數,是計算中所能接受的最小的差別值
<?php $a = 1.23456789; $b = 1.23456780; $epsilon = 0.00001; if(abs($a-$b) < $epsilon) { echo "true"; } ?>
NaN
某些數學運算會產生一個由常量 NAN 所代表的結果。此結果代表著一個在浮點數運算中未定義或不可表述的值。任何拿此值與其它任何值進行的松散或嚴格比較的結果都是 FALSE
由於 NAN 代表著任何不同值,不應拿 NAN 去和其它值進行比較,包括其自身,應該用 is_nan() 來檢查
<?php $nan = acos(8); var_dump($nan, is_nan($nan));//float NAN boolean true ?>
檢測
is_real()、is_float()這兩個函數可以用來檢測變量是否是浮點數
<?php isfloat("5.0" + 0); // true isfloat("5.0"); // false isfloat(5 + 0); // false isfloat(5.0 + 0); // false isfloat('a' + 0); // false ?>
一個字符串string就是由一系列的字符組成,其中每個字符等同於一個字節
一個字符串可以用 4 種方式表達:單引號、雙引號、heredoc語法結構、nowdoc語法結構(自 PHP 5.3.0 起)
單引號
定義一個字符串的最簡單的方法是用單引號把它包圍起來
要表達一個單引號自身,需在它的前面加個反斜線(\)來轉義。要表達一個反斜線自身,則用兩個反斜線(\\)。其它任何方式的反斜線都會被當成反斜線本身:也就是說如果想使用其它轉義序列例如 \r 或者 \n,並不代表任何特殊含義,就單純是這兩個字符本身
[注意]在單引號字符串中的變量和特殊字符的轉義序列將不會被替換
<?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將對一些特殊的字符進行解析。用雙引號定義的字符串最重要的特征是變量會被解析
【轉義字符】
序列 含義 \n 換行(ASCII 字符集中的 LF 或 0x0A (10)) \r 回車(ASCII 字符集中的 CR 或 0x0D (13)) \t 水平制表符(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 起) \\ 反斜線 \$ 美元標記 \" 雙引號 \[0-7]{1,3} 符合該正則表達式序列的是一個以八進制方式來表達的字符 \x[0-9A-Fa-f]{1,2} 符合該正則表達式序列的是一個以十六進制方式來表達的字符
Heredoc結構
第三種表達字符串的方法是用heredoc句法結構:<<<。在該運算符之後要提供一個標識符,然後換行。接下來是字符串string 本身,最後要用前面定義的標識符作為結束標志
結束時所引用的標識符必須在該行的第一列,而且,標識符的命名也要像其它標簽一樣遵守 PHP 的規則:只能包含字母、數字和下劃線,並且必須以字母和下劃線作為開頭
[注意]結束標識符這行除了可能有一個分號外,絕對不能包含其它字符。這意味著標識符不能縮進,分號的前後也不能有任何空白或制表符
<?php $str = <<< G 123 G; echo $str;//123 ?>
Heredoc結構就象是沒有使用雙引號的雙引號字符串,這就是說在heredoc 結構中單引號不用被轉義,但是轉義序列還可以使用。變量將被替換
<?php $str = <<<EOD Example of string spanning multiple lines using heredoc syntax. EOD; class foo { var $foo; var $bar; function foo() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } } $foo = new foo(); $name = 'MyName'; /*My name is "MyName". I am printing some Foo. Now, I am printing some Bar2. This should print a capital 'A': A*/ 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; ?>
Nowdoc結構
就象 heredoc 結構類似於雙引號字符串,Nowdoc 結構是類似於單引號字符串的。Nowdoc 結構很象 heredoc 結構,但是 nowdoc 中不進行解析操作。這種結構很適合用於嵌入 PHP 代碼或其它大段文本而無需對其中的特殊字符進行轉義
<?php $str = <<<'EOD' Example of string spanning multiple lines using nowdoc syntax. EOD; class foo { public $foo; public $bar; function foo() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } } $foo = new foo(); $name = 'MyName'; /* 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 */ 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; ?>
轉換
一個值可以通過在其前面加上 (string) 或用 strval() 函數來轉變成字符串。在一個需要字符串的表達式中,會自動轉換為string。比如在使用函數echo或print時,或在一個變量和一個 string 進行比較時,就會發生這種轉換
NULL 總是被轉變成空字符串
一個布爾值 boolean 的 TRUE 被轉換成 string 的 "1"。Boolean 的 FALSE 被轉換成 ""(空字符串)。這種轉換可以在 boolean 和 string 之間相互進行
一個整數 integer 或浮點數 float 被轉換為數字的字面樣式的 string(包括 float 中的指數部分)。使用指數計數法的浮點數(4.1E+6)也可轉換
當一個字符串被當作一個數值來取值,其結果和類型如下
如果該字符串沒有包含 '.','e' 或 'E' 並且其數字值在整型的范圍之內(由 PHP_INT_MAX 所定義),該字符串將被當成 integer 來取值。其它所有情況下都被作為 float 來取值
該字符串的開始部分決定了它的值。如果該字符串以合法的數值開始,則使用該數值。否則其值為 0(零)。合法數值由可選的正負號,後面跟著一個或多個數字(可能有小數點),再跟著可選的指數部分。指數部分由 'e' 或 'E' 後面跟著一個或多個數字構成
<?php $foo = 1 + "10.5"; // $foo is float (11.5) $foo = 1 + "-1.3e3"; // $foo is float (-1299) $foo = 1 + "bob-1.3e3"; // $foo is integer (1) $foo = 1 + "bob3"; // $foo is integer (1) $foo = 1 + "10 Small Pigs"; // $foo is integer (11) $foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2) $foo = "10.0 pigs " + 1; // $foo is float (11) $foo = "10.0 pigs " + 1.0; // $foo is float (11) ?>
直接把 array,object 或 resource 轉換成 string 不會得到除了其類型之外的任何有用信息
檢測
is_string()函數用來檢測變量是否是字符串
bool is_string ( mixed $var )
如果 var 是 string 則返回 TRUE,否則返回 FALSE
<?php var_dump(is_string('123'));//boolean true var_dump(is_string(123));//boolean false ?>
PHP 中的數組實際上是一個有序映射。映射是一種把 values 關聯到 keys 的類型
由於數組元素的值也可以是另一個數組,樹形結構和多維數組也是允許的
構建
可以用 array() 語言結構來新建一個數組。它接受任意數量用逗號分隔的 鍵(key) => 值(value)對
array( key => value , ... ) // 鍵(key)可是是一個整數 integer 或字符串 string // 值(value)可以是任意類型的值
<?php $array = array( "foo" => "bar", "bar" => "foo", ); // 自 PHP 5.4 起 $array = [ "foo" => "bar", "bar" => "foo", ]; ?>
key可以是integer或者string。value可以是任意類型
此外key會有如下的強制轉換
包含有合法整型值的字符串會被轉換為整型。例如鍵名 "8" 實際會被儲存為 8。但是 "08" 則不會強制轉換,因為其不是一個合法的十進制數值
浮點數也會被轉換為整型,意味著其小數部分會被捨去。例如鍵名 8.7 實際會被儲存為 8
布爾值也會被轉換成整型。即鍵名 true 實際會被儲存為 1 而鍵名 false 會被儲存為 0
Null 會被轉換為空字符串,即鍵名 null 實際會被儲存為 ""
數組和對象不能被用為鍵名
如果在數組定義中多個單元都使用了同一個鍵名,則只使用了最後一個,之前的都被覆蓋了
<?php $array = array( 1 => "a", "1" => "b", 1.5 => "c", true => "d", ); /* array(1) { [1]=> string(1) "d" } */ var_dump($array); ?>
key 為可選項。如果未指定,PHP 將自動使用之前用過的最大 integer 鍵名加上 1 作為新的鍵名
<?php $array = array("foo", "bar", "hallo", "world"); /* array(4) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> string(5) "hallo" [3]=> string(5) "world" } */ var_dump($array); ?> <?php $array = array( "a", "b", 6 => "c", "d", ); /* array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [6]=> string(1) "c" [7]=> string(1) "d" } */ var_dump($array); ?>
訪問
數組單元可以通過 array[key] 語法來訪問
<?php $array = array( "foo" => "bar", 42 => 24, "multi" => array( "dimensional" => array( "array" => "foo" ) ) ); /* string(3) "bar" int(24) string(3) "foo" */ var_dump($array["foo"]); var_dump($array[42]); var_dump($array["multi"]["dimensional"]["array"]); ?>
要修改某個值,通過其鍵名給該單元賦一個新值。要刪除某鍵值對,對其調用 unset() 函數
[注意]如果給出方括號但沒有指定鍵名,則取當前最大整數索引值,新的鍵名將是該值加上 1(但是最小為 0)。如果當前還沒有整數索引,則鍵名將為 0
<?php $arr = array(5 => 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 ?>
遍歷
foreach 語法結構提供了遍歷數組的簡單方式。foreach 僅能夠應用於數組和對象,如果嘗試應用於其他數據類型的變量,或者未初始化的變量將發出錯誤信息
<?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8) unset($value); // 最後取消掉引用 ?>
轉換
將 NULL 轉換為 array 會得到一個空的數組
對於任意 integer,float,string,boolean 和 resource 類型,如果將一個值轉換為數組,將得到一個僅有一個元素的數組,其下標為 0,該元素即為此標量的值
如果一個 object 類型轉換為 array,則結果為一個數組,其單元為該對象的屬性。鍵名將為成員變量名,不過有幾點例外:整數屬性不可訪問;私有變量前會加上類名作前綴;保護變量前會加上一個 '*' 做前綴。這些前綴的前後都各有一個 NULL 字符
比較
array_diff()函數用來計算數組的差集
array array_diff ( array $array1 , array $array2 [, array $... ] )
對比返回在 array1 中但是不在 array2 及任何其它參數數組中的值
<?php $array1 = array("a" => "green", "red", "blue", "red"); $array2 = array("b" => "green", "yellow", "red"); $result = array_diff($array1, $array2); /* Array ( [1] => blue ) */ print_r($result); ?>
檢測
is_array()函數用來檢測變量是否是數組
<?php var_dump(is_array([]));//boolean true var_dump(is_array(''));//boolean false ?>
要創建一個新的對象 object,使用 new 語句實例化一個類
<?php class foo { function do_foo() { echo "Doing foo."; } } $bar = new foo; $bar->do_foo(); ?>
轉換
如果將一個對象轉換成對象,它將不會有任何變化。如果其它任何類型的值被轉換成對象,將會創建一個內置類 stdClass 的實例。如果該值為 NULL,則新的實例為空。數組轉換成對象將使鍵名成為屬性名並具有相對應的值。對於任何其它的值,名為 scalar 的成員變量將包含該值
<?php $obj = (object) 'ciao'; echo $obj->scalar; // outputs 'ciao' ?>
檢測
is_object()方法用來檢測變量是否是一個對象
<?php var_dump(is_object(''));//boolean false var_dump(is_object((object)''));//boolean true ?>
PHP中的NULL是空類型,對大小寫不敏感,NULL類型只有一個取值,表示一個變量沒有值,當被賦值為NULL,或者尚未被賦值,或者被unset(),這三種情況下變量被認為為NULL
<?php error_reporting(0); //禁止顯示PHP警告提示 $var; var_dump($var);//NULL $var1 = null; var_dump($var1);//NULL $var2 = NULL; var_dump( $var2);//NULL $var3 = "節日快樂!"; unset($var3); var_dump($var3);//NULL ?>
轉換
使用 (unset) $var 將一個變量轉換為 null 將不會刪除該變量或 unset 其值。僅是返回 NULL 值而已
檢測
is_null()函數用來檢測變量是否為 NULL
<?php var_dump(is_null(NULL));//boolean true var_dump(is_null(''));//boolean false ?>
PHP資源是由專門的函數來建立和使用的,例如打開文件、數據連接、圖形畫布。可以對資源進行操作(創建、使用和釋放)。任何資源,在不需要的時候應該被及時釋放。如果我們忘記了釋放資源,系統自動啟用垃圾回收機制,在頁面執行完畢後回收資源,以避免內存被消耗殆盡
<?php $file=fopen("data/webroot/resource/f.txt","r"); //打開文件 $con=mysql_connect("127.0.0.1","root","root"); //連接數據庫 if ($file_handle){ //接著采用while循環(後面語言結構語句中的循環結構會詳細介紹)一行行地讀取文件,然後輸出每行的文字 while (!feof($file_handle)) { //判斷是否到最後一行 $line = fgets($file_handle); //讀取一行文本 echo $line; //輸出一行文本 echo "<br />"; //換行 } } fclose($file_handle);//關閉文件 ?>