測試環境 PHP version 5.3.29/5.6.29/7.1.0 Apache 2.4.25
PHP 支持 8 種原始數據類型。
四種標量類型:
boolean(布爾型) integer(整型) float(浮點型,也稱作 double) string(字符串)兩種復合類型:
array(數組) object(對象)最后是兩種特殊類型:
resource(資源) NULL(無類型)當轉換為 boolean 時,以下值被認為是 FALSE:
布爾值 FALSE 本身 整型值0 (零) 浮點型值 0.0(零) 空字符串,以及字符串 “0” 不包括任何元素的數組 特殊類型 NULL(包括尚未賦值的變量) 從空標記生成的 Simplexml 對象所有其它值都被認為是 TRUE(包括任何資源)。
整型值可以使用十進制,十六進制,八進制或二進制表示,前面可以加上可選的符號(- 或者 +)。
二進制表達的 integer 自 PHP 5.4.0 起可用,PHP 5.4.0 之前的版本則報語法錯誤。
要使用八進制表達,數字前必須加上0
(零);要使用十六進制表達,數字前必須加上 0x
;要使用二進制表達,數字前必須加上 0b
。
PHP_INT_MAX
來表示; 自 PHP 7.0.0 后,最小值可以用常量 PHP_INT_MIN
來表示; <?php $max = PHP_INT_MAX ; //PHP 5.0.5版本后支持該常量 $min = PHP_INT_MIN; //PHP 7.0.0 版本之后支持該常量 echo $max,$min; $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)?> 當從浮點數轉換成整數時,將向下取整。如果浮點數超出了整數范圍,則結果為未定義,因為沒有足夠的精度給出一個確切的整數結果。在此情況下沒有警告,甚至沒有任何通知!
自 PHP7.0.0 之后 NAN和Infinity 強制轉換成整型結果總是0
<?php var_dump((int)NAN); // PHP 7.0.0之前為 -2147483648,之后為0 var_dump((int)INF); // PHP 7.0.0之前為 0 ,之后也是0?>決不要將未知的分數強制轉換為 integer,這樣有時會導致不可預料的結果。
<?php echo (int) ((0.1+0.7) * 10); // outputs: 7?>數字前面有0代表八進制,但是字符串型數字前面有0并不是八進制。
<?php $x = 0123; // 83 $y = "0123" + 0; // 123 echo $x,$y;?>對超過int型最大值的數字進行取模運算時,會強制將float類型轉化成int類型,從而出現錯誤。
<?php $i = 6887129852; //超過int型最大值則為float類型 echo "i=$i <br/>/n"; echo "i%36=".($i%36)."<br/>/n"; echo "alternative i%36=".($i-floor($i/36)*36)."/n";?>某些數學運算會產生一個由常量 NAN 所代表的結果。此結果代表著一個在浮點數運算中未定義或不可表述的值。任何拿此值與其它任何值進行的松散或嚴格比較的結果都是 FALSE。
由于 NAN 代表著任何不同值,不應拿 NAN 去和其它值進行比較,包括其自身,應該用 is_nan() 來檢查。
浮點數之間不能進行比較,要測試浮點數是否相等,要使用一個僅比該數值大一點的最小誤差值。
一個字符串 string 就是由一系列的字符組成,其中每個字符等同于一個字節。這意味著 PHP 只能支持 256 的字符集,因此不支持 Unicode 。
一個字符串可以用 4 種方式表達: - 單引號 - 雙引號 - heredoc 語法結構 - nowdoc 語法結構(自 PHP 5.3.0 起)
string 中的字符可以通過一個從 0 開始的下標,用類似 array 結構中的方括號包含對應的數字來訪問和修改,比如 $str[42]
,也可用花括號訪問,比如 $str{42}
。
PHP 的字符串在內部是字節組成的數組。因此用花括號訪問或修改字符串對多字節字符集很不安全。
自 PHP 5.4 起字符串下標必須為整數或可轉換為整數的字符串,否則會發出警告。
PHP 5.5 增加了直接在字符串原型中用[]
訪問字符的支持。
自 PHP 7.1.0 開始, 字符串支持負索引下標。
<?php $array = [-3 => 'foo']; echo "The element at index -3 is $array[-3].";?>雙引號內可以解析單引號內的變量,但是在關聯數組中,雙引號并不能解析單引號內的索引。 解決辦法是使用復雜語法{}或者去掉索引的單引號。
<?php $str = 'abc'; echo "this is a '$str'".'<br/>'; $fruit=array('a'=>'apple','b'=>'banana'); echo "This is a $fruit['a']"; //語法錯誤T_ENCAPSED_AND_WHITESPACE //解決辦法 echo "This is a $fruit[a]"; echo "This is a {$fruit['a']}"; echo "This is a ${fruit['a']}";?>PHP 中的數組實際上是一個有序映射
。映射是一種把 values 關聯到 keys 的類型。此類型在很多方面做了優化,因此可以把它當成真正的數組,或列表(向量),散列表(是映射的一種實現),字典,集合,棧,隊列以及更多可能性。由于數組元素的值也可以是另一個數組,樹形結構和多維數組也是允許的。
key 可以是 integer 或者 string。value 可以是任意類型。
如果對給出的值沒有指定鍵名,則取當前最大的整數索引值,而新的鍵名將是該值加一。如果指定的鍵名已經有了值,則該值會被覆蓋。
只對某些單元指定鍵名而對其它的空置,新的鍵名將是該值+1,如果當前還沒有整數索引,則鍵名將為 0.
<?php$array = array( "a", "b", 6 => "c", "d",);var_dump($array);?>自 5.4 起可以使用短數組定義語法,用 [] 替代 array()。
<?php$array1 = array( "foo" => "bar", "bar" => "foo",);// 自 PHP 5.4 起,可使用[]代替array()$array2 = [ "foo" => "bar", "bar" => "foo",];?>如果在數組定義中多個單元都使用了同一個鍵名,則只使用了最后一個,之前的都被覆蓋了。
<?php $array = array( 1 => "a", "1" => "b", 1.5 => "c", true => "d", ); var_dump($array);?> <?php$array = array(0, 1, "2.99999999" => 56, 2 => 2, 3.9999 => 3, 3 => 3.1, 1 => 4, 0 => 6, );PRint_r($array);?>自 PHP 5.4 起可以用數組間接引用函數或方法調用的結果。之前只能通過一個臨時變量。
自 PHP 5.5 起可以用數組間接引用一個數組原型。
<?php function getArray() { return array(1, 2, 3); } $secondElement = getArray()[1];// on PHP 5.4 // PHP 5.4 之前只能通過一個臨時變量 $tmp = getArray(); $secondElement = $tmp[1]; // or list(, $secondElement) = getArray();?>unset() 函數允許刪除數組中的某個鍵。但要注意數組并不會重建索引。如果需要刪除后重建索引,可以用 array_values() 函數。
<?php // 創建一個簡單的數組 $array = array(1, 2, 3, 4, 5); print_r($array); // 現在刪除其中的所有元素,但保持數組本身不變: foreach ($array as $i => $value) { unset($array[$i]); } print_r($array); // 添加一個單元(注意新的鍵名是 5) $array[] = 6; print_r($array); // 重新索引: $array = array_values($array); $array[] = 7; print_r($array);?>在雙引號字符串中,不給索引加上引號是有效的,但是最好始終在用字符串表示的數組索引上加上引號。 以下是例子錯的,但可以正常運行。錯誤是因為代碼中有一個未定義的常量(bar)而不是字符串(’bar’-注意引號),而 PHP 可能會在以后定義此常量,不幸的是你的代碼中有同樣的名字。它能運行,是因為 PHP 自動將裸字符串轉換成一個其值為該裸字符串的正常字符串。
<?php $foo[bar] = 'enemy'; echo $foo[bar];?>對于任意 integer,float,string,boolean 和 resource 類型,如果將一個值轉換為數組,將得到一個僅有一個元素的數組,其下標為 0,該元素即為此標量的值。
如果一個 object 類型轉換為 array,則結果為一個數組,其單元為該對象的屬性。鍵名將為成員變量名,不過有幾點例外:整數屬性不可訪問;私有變量前會加上類名作前綴;保護變量前會加上一個 ‘*’ 做前綴。這些前綴的前后都各有一個 NULL 字符(/0)。
<?php class A { private $A; // 轉換成數組后索引為/0A/0A } class B extends A { private $A; // 轉換成數組后索引為/0B/0A public $AA; // 轉換成數組后索引為AA } var_dump((array) new B());?>如果將一個對象轉換成對象,它將不會有任何變化。如果其它任何類型的值被轉換成對象,將會創建一個內置類stdClass
的實例。如果該值為 NULL,則新的實例為空。數組轉換成對象將使鍵名成為屬性名并具有相對應的值。對于任何其它的值,名為 scalar
的成員變量將包含該值。
自 5.4 起可以使用短數組定義語法,創建一個stdClass對象。
<?php $object =(object) [ 'propertyOne' => 'foo', 'propertyTwo' => 42, ]; var_dump($object);?>自 PHP 7.0.0 之后,多了以下幾種創建空對象的方法。(在PHP 7.1.0上成功運行)
<?php $obj1 = new /stdClass; // stdClass 對象實例 $obj2 = new class{}; // class@anonymous 對象實例 $obj3 = (object)[]; // 空數組強轉對象 echo "<pre>"; var_dump($obj1); // object(stdClass)#1 (0) {} var_dump($obj2); // object(class@anonymous)#2 (0) {} var_dump($obj3); // object(stdClass)#3 (0) {}?>資源 resource 是一種特殊變量,保存了到外部資源的一個引用。資源是通過專門的函數來建立和使用的。
由于資源類型變量保存有為打開文件、數據庫連接、圖形畫布區域等的特殊句柄,因此將其它類型的值轉換為資源沒有意義。
由于 Zend 引擎引進了引用計數系統,可以自動檢測到一個資源不再被引用了(和 java 一樣)。這種情況下此資源使用的所有外部資源都會被垃圾回收系統釋放。因此,很少需要手工釋放內存。 請注意:持久數據庫連接比較特殊,它們不會被垃圾回收系統銷毀。
NULL 值表示一個變量沒有值。NULL 類型唯一可能的值就是 NULL。
使用 (unset) $var 將一個變量轉換為 null 將不會刪除該變量或 unset 其值。僅是返回 NULL 值而已。
有趣的是貌似只有當變量$a="0"
的時候以下條件才能成立。
注意unset(
新聞熱點
疑難解答
圖片精選