2.PHP數(shù)據(jù)類型

PHP 數(shù)據(jù)類型簡(jiǎn)介

PHP 支持 8 種原始數(shù)據(jù)類型。

四種標(biāo)量類型:

  • boolean(布爾型)
  • integer(整型)
  • float(浮點(diǎn)型,也稱作 double)
  • string(字符串)

兩種復(fù)合類型:

  • array(數(shù)組)
  • object(對(duì)象)

最后是兩種特殊類型:

  • resource(資源)
  • NULL(無(wú)類型)

類型檢測(cè)

var_dump() 函數(shù)可以查看表達(dá)式的值和類型
gettype() 函數(shù)用于檢測(cè)變量類型
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ū)分大小寫(xiě)。

<?php

$a = True;
$b = False;

var_dump($a);// bool(true)
var_dump($b);// bool(false)

運(yùn)算返回 boolean 類型的結(jié)果:

// == 是一個(gè)操作符,它檢測(cè)兩個(gè)變量值是否相等,并返回一個(gè)布爾值

注意當(dāng)下列情況轉(zhuǎn)換為 Boolean 時(shí),其值為 FALSE

  • 布爾值 FALSE 本身
  • 整型值 0(零)
  • 浮點(diǎn)型值 0.0(零)
  • 空字符串,以及字符串 "0"
  • 不包括任何元素的數(shù)組(但是空數(shù)組和空字符串或整型零不等)
  • 特殊類型 NULL(包括尚未賦值的變量)
  • 從空標(biāo)記生成的 SimpleXML 對(duì)象

Integer 整型

整型值可以使用十進(jìn)制,十六進(jìn)制,八進(jìn)制或二進(jìn)制表示,前面可以加上可選的符號(hào)(- 或者 +)。

注意:要使用八進(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ù)溢出

如果給定的一個(gè)數(shù)超出了 integer 的范圍,將會(huì)被解釋為 float。同樣如果執(zhí)行的運(yùn)算結(jié)果超出了 integer 范圍,也會(huì)返回 float。

<?php

$a = 123445566;
$b = 9223372036854775807;
$c = 9223372036854775808;
$d = 50000000000000 * 1000000;

var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);

Float 浮點(diǎn)型

浮點(diǎn)型(也叫浮點(diǎn)數(shù) float,雙精度數(shù) double 或?qū)崝?shù) real)

<?php
$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;

浮點(diǎn)數(shù)的字長(zhǎng)和平臺(tái)相關(guān),通常最大值是 1.8e308 并具有 14 位十進(jìn)制數(shù)字的精度(64 位 IEEE 格式)

String 字符串類型

一個(gè)字符串 string 就是由一系列的字符組成,其中每個(gè)字符等同于一個(gè)字節(jié),PHP 中有 4 中表達(dá)方式

  • 單引號(hào)
    單引號(hào)內(nèi)特殊字符和變量不會(huì)被解析
<?php
$a = 'Hello';
echo '$a \n World';//$a \n World
  • 雙引號(hào)
    雙引號(hào)內(nèi)的特殊字符和變量會(huì)被解析。
<?php
$a = 'Hello';
/**
 * Hello
 *   World
 */
echo "$a \n World";
  • Heredoc
    Heredoc 類似與雙引號(hào),內(nèi)部轉(zhuǎn)義字符和變量可以被解析,句法結(jié)構(gòu)為
<<<EOT

字符串

EOT;

其中 EOT 為標(biāo)識(shí)符,可以自定義,但是首尾標(biāo)識(shí)符必須相同。開(kāi)始標(biāo)識(shí)符 EOT 后需換行,結(jié)束標(biāo)識(shí)符 EOT 必須獨(dú)占一行,且前面不許有空格。

<?php
$a ='Hello' ;
echo <<<EOT
$a Hello
EOT;
  • Nowdoc
    Nowdoc 類似于單引號(hào),無(wú)法解析轉(zhuǎn)義字符和變量。句法結(jié)構(gòu)類似 Heredoc,但是需要在開(kāi)始標(biāo)識(shí)符加上單引號(hào)。
<?php
$a ='Hello' ;
echo <<<'EOT'//和 Heredoc 不同點(diǎn)
$a Hello
EOD;

Array 數(shù)組

數(shù)組實(shí)際上是一個(gè)有序映射。映射是一種把 values 關(guān)聯(lián)到 keys 的類型。由于數(shù)組元素的值也可以是另一個(gè)數(shù)組,樹(shù)形結(jié)構(gòu)和多維數(shù)組也是允許的。

語(yǔ)法

定義數(shù)組可以用 array()[] 來(lái)新建一個(gè)數(shù)組。它接受任意數(shù)量用逗號(hào)分隔的鍵(key) => 值(value)對(duì)。key 可以是 integer(索引數(shù)組)或者 string(關(guān)聯(lián)數(shù)組),value 可以是任意類型,如對(duì)象、數(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é)果中可以看到

  • 如果沒(méi)有鍵名,則數(shù)組默認(rèn)使用從 0 開(kāi)始的數(shù)字鍵名
  • 打印數(shù)組不存在的 key 的值時(shí),直接返回 NULL
  • 數(shù)組可以多維嵌套,通過(guò)鍵名可以獲取特定值

Object 對(duì)象

使用 new 可以創(chuàng)建一個(gè)新的對(duì)象

<?php

class foo
{
    function do()
    {
        echo "Action do"; 
    }
}

$f = new foo;
$f->do();
轉(zhuǎn)換為對(duì)象

如果將一個(gè)對(duì)象轉(zhuǎn)換成對(duì)象,它將不會(huì)有任何變化。如果其它任何類型的值被轉(zhuǎn)換成對(duì)象,將會(huì)創(chuàng)建一個(gè)內(nèi)置類 stdClass 的實(shí)例。如果該值為 NULL,則新的實(shí)例為空。 array 轉(zhuǎn)換成 object 將使鍵名成為屬性名并具有相對(duì)應(yīng)的值,除了數(shù)字鍵,不迭代就無(wú)法被訪問(wèn)。

<?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 是對(duì)象,轉(zhuǎn)換為對(duì)象后不發(fā)生變化,所以 $a 等于 $b
  • 字符串 "A" 轉(zhuǎn)換為對(duì)象時(shí),自動(dòng)生成 scalar 屬性
  • 數(shù)組 ['hello'=>'world'] 轉(zhuǎn)換為對(duì)象時(shí),鍵名 hello 作為屬性,鍵值 world 為屬性值

Resource 資源

資源 resource 是一種特殊變量,保存了外部資源的一個(gè)引用,如打開(kāi)文件、數(shù)據(jù)庫(kù)連接等,資源是通過(guò)專門(mén)的函數(shù)來(lái)建立和使用的

<?php

$file = fopen($filename);//打開(kāi)文件
$db = mysqli_connect();//數(shù)據(jù)庫(kù)連接
轉(zhuǎn)換為資源

由于資源類型變量保存有為打開(kāi)文件、數(shù)據(jù)庫(kù)連接、圖形畫(huà)布區(qū)域等的特殊句柄,因此將其它類型的值轉(zhuǎn)換為資源沒(méi)有意義。

釋放資源

引用計(jì)數(shù)系統(tǒng)是 Zend 引擎的一部分,可以自動(dòng)檢測(cè)到一個(gè)資源不再被引用了(和 Java 一樣)。這種情況下此資源使用的所有外部資源都會(huì)被垃圾回收系統(tǒng)釋放。因此,很少需要手工釋放內(nèi)存。

NULL

特殊的 NULL 值表示一個(gè)變量沒(méi)有值。NULL 類型唯一可能的值就是 NULL。 在下列情況下一個(gè)變量被認(rèn)為是 NULL:

  • 被賦值為 NULL
  • 尚未被賦值
  • 被 unset()
語(yǔ)法

NULL 類型只有一個(gè)值,就是不區(qū)分大小寫(xiě)的常量 NULL。

<?php

$a = NULL;
轉(zhuǎn)換到 NULL

使用 (unset) 將一個(gè)變量轉(zhuǎn)換為 null 將不會(huì)刪除該變量或 unset 其值。僅是返回 NULL 值而已

類型轉(zhuǎn)換

PHP 是弱語(yǔ)言類型,定義變量的時(shí)候不需要制定變量類型,根據(jù)上下文自動(dòng)解析成對(duì)于的變量類型。

<?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)先級(jí)為:浮點(diǎn)型 > 整型 > 字符串

類型強(qiáng)制轉(zhuǎn)換

在要轉(zhuǎn)換的變量之前加上用括號(hào)括起來(lái)的目標(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)換為浮點(diǎn)型 float
-  (string) - 轉(zhuǎn)換為字符串 string
-  (array) - 轉(zhuǎn)換為數(shù)組 array
-  (object) - 轉(zhuǎn)換為對(duì)象 object
-  (unset) - 轉(zhuǎn)換為 NULL (PHP 5)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容