PHP 數(shù)據(jù)類型簡介
PHP 支持 8 種原始數(shù)據(jù)類型里初。
四種標(biāo)量類型:
- boolean(布爾型)
- integer(整型)
- float(浮點型惨好,也稱作 double)
- string(字符串)
兩種復(fù)合類型:
- array(數(shù)組)
- object(對象)
最后是兩種特殊類型:
- resource(資源)
- NULL(無類型)
類型檢測
var_dump() 函數(shù)可以查看表達(dá)式的值和類型
gettype() 函數(shù)用于檢測變量類型
is_ 加類型煌茴,如 is_int(),is_array() 等日川,判斷變量是否為該類型
創(chuàng)建 test.php蔓腐,并編輯內(nèi)容
<?php
$a = TRUE;
$b = 'foo';
$c = 0.1;
$d = 12;
if(is_string($b)) {
echo nl2br("$b 是字符串".PHP_EOL);
}
if(is_int($c)) {
echo nl2br("$c 是整型".PHP_EOL);
}
var_dump($a);
echo '<br/>';
var_dump($b);
echo '<br/>';
echo gettype($c).PHP_EOL;
echo '<br/>';
echo gettype($d);
結(jié)果輸出
foo 是字符串
bool(true)
string(3) "foo"
double integer
Boolean 布爾類型
布爾類型表達(dá)了真值,可以為 TRUE 或 FALSE龄句,不區(qū)分大小寫回论。
<?php
$a = True;
$b = False;
var_dump($a);// bool(true)
var_dump($b);// bool(false)
運算返回 boolean 類型的結(jié)果:
// == 是一個操作符,它檢測兩個變量值是否相等分歇,并返回一個布爾值
注意當(dāng)下列情況轉(zhuǎn)換為 Boolean 時傀蓉,其值為 FALSE
- 布爾值 FALSE 本身
- 整型值 0(零)
- 浮點型值 0.0(零)
- 空字符串,以及字符串 "0"
- 不包括任何元素的數(shù)組(但是空數(shù)組和空字符串或整型零不等)
- 特殊類型 NULL(包括尚未賦值的變量)
- 從空標(biāo)記生成的 SimpleXML 對象
Integer 整型
整型值可以使用十進(jìn)制职抡,十六進(jìn)制葬燎,八進(jìn)制或二進(jìn)制表示,前面可以加上可選的符號(- 或者 +)缚甩。
注意:要使用八進(jìn)制表達(dá)谱净,數(shù)字前必須加上 0。要使用十六進(jìn)制表達(dá)擅威,數(shù)字前必須加上 0x壕探。要使用二進(jìn)制表達(dá),數(shù)字前必須加上 0b裕寨。
<?php
$a = 1234; // 十進(jìn)制數(shù)
$b = -123; // 負(fù)數(shù)
$c = 0123; // 八進(jìn)制數(shù) (等于十進(jìn)制 83)
$d = 0x1A; // 十六進(jìn)制數(shù) (等于十進(jìn)制 26)
整數(shù)溢出
如果給定的一個數(shù)超出了 integer 的范圍浩蓉,將會被解釋為 float派继。同樣如果執(zhí)行的運算結(jié)果超出了 integer 范圍宾袜,也會返回 float。
<?php
$a = 123445566;
$b = 9223372036854775807;
$c = 9223372036854775808;
$d = 50000000000000 * 1000000;
var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
Float 浮點型
浮點型(也叫浮點數(shù) float驾窟,雙精度數(shù) double 或?qū)崝?shù) real)
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
浮點數(shù)的字長和平臺相關(guān)庆猫,通常最大值是 1.8e308 并具有 14 位十進(jìn)制數(shù)字的精度(64 位 IEEE 格式)
String 字符串類型
一個字符串 string 就是由一系列的字符組成,其中每個字符等同于一個字節(jié)绅络,PHP 中有 4 中表達(dá)方式
- 單引號
單引號內(nèi)特殊字符和變量不會被解析
<?php
$a = 'Hello';
echo '$a \n World';//$a \n World
- 雙引號
雙引號內(nèi)的特殊字符和變量會被解析月培。
<?php
$a = 'Hello';
/**
* Hello
* World
*/
echo "$a \n World";
- Heredoc
Heredoc 類似與雙引號,內(nèi)部轉(zhuǎn)義字符和變量可以被解析恩急,句法結(jié)構(gòu)為
<<<EOT
字符串
EOT;
其中 EOT
為標(biāo)識符杉畜,可以自定義,但是首尾標(biāo)識符必須相同衷恭。開始標(biāo)識符 EOT
后需換行此叠,結(jié)束標(biāo)識符 EOT
必須獨占一行,且前面不許有空格随珠。
<?php
$a ='Hello' ;
echo <<<EOT
$a Hello
EOT;
- Nowdoc
Nowdoc 類似于單引號灭袁,無法解析轉(zhuǎn)義字符和變量猬错。句法結(jié)構(gòu)類似 Heredoc,但是需要在開始標(biāo)識符加上單引號茸歧。
<?php
$a ='Hello' ;
echo <<<'EOT'//和 Heredoc 不同點
$a Hello
EOD;
Array 數(shù)組
數(shù)組實際上是一個有序映射倦炒。映射是一種把 values 關(guān)聯(lián)到 keys 的類型。由于數(shù)組元素的值也可以是另一個數(shù)組软瞎,樹形結(jié)構(gòu)和多維數(shù)組也是允許的逢唤。
語法
定義數(shù)組可以用 array()
或 []
來新建一個數(shù)組。它接受任意數(shù)量用逗號分隔的鍵(key) => 值(value)對涤浇。key 可以是 integer(索引數(shù)組)或者 string(關(guān)聯(lián)數(shù)組)智玻,value 可以是任意類型,如對象芙代、數(shù)組吊奢。
<?php
$a = [
"b" => "bb",
"c" => "cc",
];
$b = [
"bb",
"cc"
];
$c = [
"bb",
"cc",
"a" => $a,
"b" => $b,
];
var_dump($a);
var_dump($a[0]);
var_dump($b);
var_dump($b['b']);
var_dump($c['a']['b']);
從結(jié)果中可以看到
- 如果沒有鍵名,則數(shù)組默認(rèn)使用從 0 開始的數(shù)字鍵名
- 打印數(shù)組不存在的 key 的值時纹烹,直接返回 NULL
- 數(shù)組可以多維嵌套页滚,通過鍵名可以獲取特定值
Object 對象
使用 new
可以創(chuàng)建一個新的對象
<?php
class foo
{
function do()
{
echo "Action do";
}
}
$f = new foo;
$f->do();
轉(zhuǎn)換為對象
如果將一個對象轉(zhuǎn)換成對象,它將不會有任何變化铺呵。如果其它任何類型的值被轉(zhuǎn)換成對象裹驰,將會創(chuàng)建一個內(nèi)置類 stdClass 的實例。如果該值為 NULL片挂,則新的實例為空幻林。 array 轉(zhuǎn)換成 object 將使鍵名成為屬性名并具有相對應(yīng)的值,除了數(shù)字鍵音念,不迭代就無法被訪問沪饺。
<?php
class A
{
}
$a = new A();
$b = (object)$a;
$c = (object)'A';
$d = (object)NULL;
$e = (object)['hello'=>'world'];
var_dump($a);
var_dump($b);
var_dump($c->scalar);
var_dump($d);
var_dump($e->hello);
從結(jié)果中可以看出
- $a 是對象,轉(zhuǎn)換為對象后不發(fā)生變化闷愤,所以 $a 等于 $b
- 字符串 "A" 轉(zhuǎn)換為對象時整葡,自動生成 scalar 屬性
- 數(shù)組 ['hello'=>'world'] 轉(zhuǎn)換為對象時,鍵名 hello 作為屬性讥脐,鍵值 world 為屬性值
Resource 資源
資源 resource 是一種特殊變量遭居,保存了外部資源的一個引用,如打開文件旬渠、數(shù)據(jù)庫連接等俱萍,資源是通過專門的函數(shù)來建立和使用的
<?php
$file = fopen($filename);//打開文件
$db = mysqli_connect();//數(shù)據(jù)庫連接
轉(zhuǎn)換為資源
由于資源類型變量保存有為打開文件、數(shù)據(jù)庫連接告丢、圖形畫布區(qū)域等的特殊句柄枪蘑,因此將其它類型的值轉(zhuǎn)換為資源沒有意義。
釋放資源
引用計數(shù)系統(tǒng)是 Zend 引擎的一部分,可以自動檢測到一個資源不再被引用了(和 Java 一樣)腥寇。這種情況下此資源使用的所有外部資源都會被垃圾回收系統(tǒng)釋放成翩。因此,很少需要手工釋放內(nèi)存赦役。
NULL
特殊的 NULL 值表示一個變量沒有值麻敌。NULL 類型唯一可能的值就是 NULL。 在下列情況下一個變量被認(rèn)為是 NULL:
- 被賦值為 NULL
- 尚未被賦值
- 被 unset()
語法
NULL 類型只有一個值掂摔,就是不區(qū)分大小寫的常量 NULL术羔。
<?php
$a = NULL;
轉(zhuǎn)換到 NULL
使用 (unset) 將一個變量轉(zhuǎn)換為 null 將不會刪除該變量或 unset 其值。僅是返回 NULL 值而已
類型轉(zhuǎn)換
PHP 是弱語言類型乙漓,定義變量的時候不需要制定變量類型级历,根據(jù)上下文自動解析成對于的變量類型。
<?php
$foo = "0";
var_dump($foo);
$foo += 2;
var_dump($foo);
$foo = $foo + 1.3;
var_dump($foo);
$foo = 5 + "10 Little Piggies";
var_dump($foo);
$foo = 5 + "10 Small Pigs";
var_dump($foo);
從結(jié)果中可以看出叭披,PHP隱式轉(zhuǎn)換的優(yōu)先級為:浮點型 > 整型 > 字符串
類型強(qiáng)制轉(zhuǎn)換
在要轉(zhuǎn)換的變量之前加上用括號括起來的目標(biāo)類型寥殖,如
<?php
$foo = 10; // $foo 是整數(shù)
$bar = (boolean) $foo; // 轉(zhuǎn)換成布爾類型
允許的強(qiáng)制轉(zhuǎn)換有:
- (int), (integer) - 轉(zhuǎn)換為整形 integer
- (bool), (boolean) - 轉(zhuǎn)換為布爾類型 boolean
- (float), (double), (real) - 轉(zhuǎn)換為浮點型 float
- (string) - 轉(zhuǎn)換為字符串 string
- (array) - 轉(zhuǎn)換為數(shù)組 array
- (object) - 轉(zhuǎn)換為對象 object
- (unset) - 轉(zhuǎn)換為 NULL (PHP 5)