數據類型 - PHP手冊筆記

類型簡介

PHP 支持 8 種原始數據類型。php

  • 四種標量類型:正則表達式

    • boolean(布爾型,不區分大小寫)數據庫

    • integer(整型)編程

    • float(浮點型,也稱做double)數組

    • string(字符串)安全

  • 兩種複合類型:函數

    • array(數組)學習

    • object(對象)編碼

  • 最後是兩種特殊類型:scala

    • resource(資源)

    • NULL(無類型)

若是想查看某個表達式的值和類型,用var_dump()函數。

<?php 
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);

$b = 3.1;
$c = true;
var_dump($b, $c);

上面的代碼經過var_dump()打印變量的相關信息,輸出結果以下所示(PHP版本5.5.12)。

array (size=3)
  0 => int 1
  1 => int 2
  2 => 
    array (size=3)
      0 => string 'a' (length=1)
      1 => string 'b' (length=1)
      2 => string 'c' (length=1)

float 3.1

boolean true

若是隻是想獲得一個易讀懂的類型的表達方式用於調試,用gettype()函數。要查看某個類型,不要用gettype(),而用is_type函數。使用is_type能夠對參數進行過濾。

若是要將一個變量強制轉換爲某類型,能夠對其使用強制轉換或者settype()函數。注意變量根據其當時的類型在特定場合下會表現出不一樣的值。

boolean布爾類型

特別注意,當轉換爲boolean時,如下值被認爲是FALSE:

  • 空字符串,以及字符串 "0"

  • 不包括任何元素的數組

只要是對象,返回值均爲TRUE。

下面這段程序能加深對boolean類型轉換的理解。

<?php 
var_dump((bool) array());  // boolean false
var_dump((bool) "");  // boolean false
var_dump((bool) "0");  // boolean false
var_dump((bool) "00");  // boolean true
var_dump((bool) "false");  // boolean true
var_dump((bool) (new stdClass()));  // boolean true
var_dump((bool) ((object) array()));  // boolean true

integer整型

要使用八進制表達,數字前必須加上0(零)。
要使用十六進制表達,數字前必須加上0x。
要使用二進制表達,數字前必須加上0b。
二進制表達的integer自PHP 5.4.0起可用。

integer值的字長能夠用常量PHP_INT_SIZE來表示,最大值能夠用常量PHP_INT_MAX來表示。

<?php 
var_dump(PHP_INT_SIZE);  // int 4
var_dump(PHP_INT_MAX);  // int 2147483647
var_dump(01090);  // int 8  八進制 010 = 十進制 8

上面程序最後一條語句,處理八進制時發生一件怪事。那是由於,若是向八進制數傳遞了一個非法數字(即8或9),則後面其他數字會被忽略。

若是給定的一個數超出了integer的範圍,將會被解釋爲float。一樣若是執行的運算結果超出了integer範圍,也會返回float。

PHP中沒有整除的運算符。1/2產生出float 0.5。值能夠捨棄小數部分強制轉換爲integer,或者使用round()函數能夠更好地進行四捨五入。

手冊中說,決不要將未知的分數強制轉換爲integer,這樣有時會致使不可預料的結果。

<?php 
echo (int)((0.1 + 0.7) * 10);

這段程序的輸出結果爲7,永遠不要相信浮點數!

float浮點型

某些數學運算會產生一個由常量NAN所表明的結果。此結果表明着一個在浮點數運算中未定義或不可表述的值。任何拿此值與其它任何值進行的鬆散或嚴格比較的結果都是FALSE。

string字符串

一個字符串string就是由一系列的字符組成,其中每一個字符等同於一個字節。實現方式是一個由字節組成的數組再加上一個整數指明緩衝區長度。這意味着PHP只能支持256的字符集,所以不支持Unicode。那中文是怎樣顯示的呢?先把疑問記錄下來。

字符串有4中語法表達方式:

  • 單引號

  • 雙引號

  • heredoc

  • nowdoc

單引號

要表達一個單引號自身,需在它的前面加個反斜線(\)來轉義。
要表達一個反斜線自身,則用兩個反斜線(\\)。
其它任何方式的反斜線都會被當成反斜線自己。

可是,若是單引號包裹的字符串中只有一個反斜線,反斜線也會輸出,這是爲何呢?

雙引號

能夠對轉義字符進行解析,最重要的特徵是變量會被解析。

單引號、雙引號都支持字符串多行錄入。

heredoc結構

這種結構在以往的編程中使用的較少,這裏詳細學習一下。

結構大體以下:
運算符<<<以後提供標識符,而後換行。
接下來是字符串自己。
最後用前面定義的標識符做爲結束標誌。

結束時所引用的標識符必須在該行的第一列,這意味着標識符不能縮進,這行除了可能有一個分號(;)外,絕對不能包含其它字符。

Heredocs結構不能用來初始化類的屬性。自PHP 5.3起,此限制僅對heredoc包含變量時有效。

Heredoc 結構就象是沒有使用雙引號的雙引號字符串,轉義規則同雙引號。

nowdoc結構

nowdoc結構與heredoc類似,只是跟在運算符<<<後面的標識符要用單引號括起來。

就象heredoc結構相似於雙引號字符串,nowdoc結構是相似於單引號字符串的。nowdoc中不進行解析操做。這種結構很適合用於嵌入PHP代碼或其它大段文本而無需對其中的特殊字符進行轉義。nowdoc結構能夠用在任意的靜態數據環境中,最典型的示例是用來初始化類的屬性或常量。

變量解析

變量解析有兩種語法規則,一種是簡單規則,一種是複雜規則。簡單規則最經常使用、最方便,這裏詳細學習一下複雜語法規則。複雜規則語法的顯著標記是用花括號包圍的表達式。

複雜語法不是由於其語法複雜而得名,而是由於它可使用複雜的表達式。 因爲{沒法被轉義,只有$緊挨着{時纔會被識別。

存取和修改

能夠以數組形式訪問字符串,用超出字符串長度的下標寫入將會拉長該字符串並以空格填充。非整數類型下標會被轉換成整數。寫入時只用到了賦值字符串的第一個字符。用空字符串賦值則賦給的值是NULL字符。PHP的字符串在內部是字節組成的數組。所以用花括號訪問或修改字符串對多字節字符集很不安全。

字符串能夠用 '.'(點)運算符鏈接起來,注意 '+'(加號)運算符沒有這個功能。

一個布爾值boolean的TRUE被轉換成string的"1"。boolean的FALSE被轉換成""(空字符串)。字符串轉換爲數值,該字符串的開始部分決定了它的值。若是該字符串以合法的數值開始,則使用該數值。不然其值爲 0(零)。

PHP的優點就體如今字符串處理的方便上,對於string的操做有不少有用的函數,能夠運用各類函數,還有正則表達式。

PHP 並不特別指明字符串的編碼,字符串會被按照該腳本文件相同的編碼方式來編碼。所以,操做文本的函數必須假定字符串是如何編碼的。不幸的是,PHP關於此的函數有不少變種,關於PHP的字符串處理函數還需多加學習。

array數組

PHP中的數組其實是一個有序映射,映射是一種把values關聯到keys的類型。

能夠用array()語言結構來新建一個數組。它接受任意數量用逗號分隔的「鍵(key)=>值(value)對」。自5.4起可使用短數組定義語法,用[]替代array()。key能夠是integer或者string,value能夠是任意類型。

key會有以下的強制轉換和規則:

  • 包含有合法整型值的字符串會被轉換爲整型。

  • 浮點數也會被轉換爲整型,意味着其小數部分會被捨去。

  • 布爾值也會被轉換成整型。

  • null會被轉換爲空字符串,即鍵名null實際會被儲存爲""。

  • 數組和對象不能被用爲鍵名。

  • 若是在數組定義中多個單元都使用了同一個鍵名,則只使用了最後一個,以前的都被覆蓋了。

  • 若是對給出的值沒有指定鍵名,則取當前最大的整數索引值,而新的鍵名將是該值加一。

<?php 
$a = array('20' => 'a', '02' => 'b');
var_dump($a);

經過上面的規則可知,這段代碼的輸出結果以下:

array (size=2)
  20 => string 'a' (length=1)
  '02' => string 'b' (length=1)

若是給出方括號但沒有指定鍵名,則取當前最大整數索引值,新的鍵名將是該值加上1(可是最小爲0)。要刪除某鍵值對,對其調用unset()函數,該函數容許刪除數組中的某個鍵,但要注意數組將不會重建索引。

<?php 
$a = array('a', 'b' => 'b');
$a[] = 'c';
var_dump($a);
unset($a[1]);
var_dump($a);

對於上面這段程序,輸出爲:

array (size=3)
  0 => string 'a' (length=1)
  'b' => string 'b' (length=1)
  1 => string 'c' (length=1)

array (size=2)
  0 => string 'a' (length=1)
  'b' => string 'b' (length=1)

應該始終在用字符串表示的數組索引上加上引號。例如用$foo['bar']而不是$foo[bar]。此代碼中有一個未定義的常量(bar)而不是字符串('bar'-注意引號),而 PHP 可能會在之後定義此常量。

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

下面的示例程序,經過讀取目錄填充數組,這裏涉及到幾個函數的使用。

<?php 
$handle = opendir('.');
while(false !== ($file = readdir($handle))) {
    $files[] = $file;
}
closedir($handle);
var_dump($files);

對於任意integer,float,string,boolean和resource類型,若是將一個值轉換爲數組,將獲得一個僅有一個元素的數組,其下標爲 0,該元素即爲此標量的值。

object對象

要建立一個新的對象 object,使用 new 語句實例化一個類。

若是將一個對象轉換成對象,它將不會有任何變化。若是其它任何類型的值被轉換成對象,將會建立一個內置類 stdClass 的實例。若是該值爲 NULL,則新的實例爲空。數組轉換成對象將使鍵名成爲屬性名並具備相對應的值。對於任何其它的值,名爲 scalar 的成員變量將包含該值。

<?php 
class foo {
    function do_foo() {
        echo 'Doint foo.';
    }
}
$bar = new foo;
$bar->do_foo();
var_dump($bar);

$obj = (object) 'hello';
var_dump($obj);

上面的示例程序輸出結果爲:

Doint foo.object(foo)[1]

object(stdClass)[2]
  public 'scalar' => string 'hello' (length=5)

resource資源類型

資源resource是一種特殊變量,保存了到外部資源的一個引用。資源使用的全部外部資源都會被垃圾回收系統釋放,不多須要手工釋放內存。可是,持久數據庫鏈接比較特殊,它們不會被垃圾回收系統銷燬。

NULL

NULL類型只有一個值,就是不區分大小寫的常量NULL。

callback回調類型

第一次接觸到這個概念,有點陌生。

自PHP 5.4起可用callable類型指定回調類型callback。

手冊示例程序中使用了不少call_user_func函數,先把這函數理一下。call_user_func第一個參數做爲回調函數(callback),而且將其他的參數做爲回調函數的參數。返回回調函數的返回值,若是錯誤則返回FALSE。

回調函數能夠是簡單函數、對象方法、靜態類方法,回調函數的幾種使用方法以下所示:

  1. 調用用戶自定義的簡單函數,以string類型傳遞其名稱。

<?php 
function my_callback_function() {
    echo 'hello, world.';
}
call_user_func('my_callback_function');
  1. 調用類的靜態成員方法,類及方法被做爲數組傳遞,下標0包含該對象,下標1包含方法名。

<?php 
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello, world.';
    }
}
call_user_func(array('MyClass', 'myCallbackMethod'));
  1. 調用已實例化的對象方法。

<?php 
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello, world.';
    }
}
$obj = new MyClass;
call_user_func(array($obj, 'myCallbackMethod'));
  1. 調用靜態類方法。

<?php 
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello, world.';
    }
}
call_user_func('MyClass::myCallbackMethod');
  1. 調用父類靜態成員方法。

<?php 
class A {
    public static function who() {
        echo "A\n";
    }
}
class B extends A {
    public static function who() {
        echo "B\n";
    }
}
call_user_func(array('B', 'parent::who'));

除了普通的用戶自定義函數外,create_function()能夠用來建立一個匿名回調函數。

類型轉換

PHP是弱類型語言,變量類型根據使用該變量的上下文所決定的。

(全文完)

相關文章
相關標籤/搜索