PHP學習心得(五)——類型

簡介

PHP 支持8種基本的數據類型。php

四種標量類型:html

兩種複合類型:程序員

最後是兩種特殊類型:數組

爲了確保代碼的易讀性,介紹一些僞類型ide

以及僞變量 $....函數

變量的類型不是由程序員設定的,是由 PHP 根據該變量使用的上下文在運行時決定的。ui

想查看某個表達式的值和類型,用 var_dump(),要查看某個類型,用 is_type 函數,若是隻是想獲得一個易讀懂的類型的表達方式用於調試,用 gettype()this

 1 <?php
 2 $a_bool = TRUE;   // a boolean
 3 $a_str  = "foo";  // a string
 4 $a_str2 = 'foo';  // a string
 5 $an_int = 12;     // an integer
 6 
 7 echo gettype($a_bool); // prints out:  boolean
 8 echo gettype($a_str);  // prints out:  string
 9 
10 // If this is an integer, increment it by four
11 if (is_int($an_int)) {
12     $an_int += 4;
13 }
14 
15 // If $bool is a string, print it out
16 // (does not print out anything)
17 if (is_string($a_bool)) {
18     echo "String: $a_bool";
19 }
20 ?>

若是要將一個變量強制轉換爲某類型,能夠對其使用強制轉換或者 settype() 函數。spa

布爾類型

boolean 表達了真值,能夠爲 TRUE 或 FALSE,兩個都不區分大小寫.net

將一個值轉換成 boolean,用 (bool) 或者 (boolean) 來強制轉換。可是不少狀況下不須要用強制轉換,由於當運算符,函數或者流程控制結構須要一個 boolean 參數時,該值會被自動轉換。

當轉換爲 boolean 時,如下值被認爲是 FALSE

  •  FALSE 
  • the 整型值 0 
  • the 浮點型值 0.0 
  • 空 字符串, 以及 字符串 "0"
  • 不包括任何元素的數組
  • 不包括任何成員變量的對象(僅PHP 4.0 適用)
  • 特殊類型 NULL (包括還沒有設定的變量)
  • 從沒有任何標記(tags)的XML文檔生成的SimpleXML 對象

全部其它值都被認爲是 TRUE(包括任何資源)。

Warning

-1 和其它非零值(不論正負)同樣,被認爲是 TRUE

 1 <?php
 2 var_dump((bool) "");        // bool(false)
 3 var_dump((bool) 1);         // bool(true)
 4 var_dump((bool) -2);        // bool(true)
 5 var_dump((bool) "foo");     // bool(true)
 6 var_dump((bool) 2.3e5);     // bool(true)
 7 var_dump((bool) array(12)); // bool(true)
 8 var_dump((bool) array());   // bool(false)
 9 var_dump((bool) "false");   // bool(true)
10 ?> 

整型

一個 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一個數。整型值可使用十進制,十六進制或八進制表示,前面能夠加上可選的符號(- 或者 +)。八進制表示數字前必須加上 0(零),十六進制表示數字前必須加上 0x整型數的字長和平臺有關,Integer值的字長能夠用常量PHP_INT_SIZE來表示,自 PHP 4.4.0 和 PHP 5.0.5後,最大值能夠用常量PHP_INT_MAX來表示。

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

 1 <?php
 2 $large_number =  2147483647;
 3 var_dump($large_number);
 4 // 輸出爲:int(2147483647)
 5 
 6 $large_number =  2147483648;
 7 var_dump($large_number);
 8 // 輸出爲:float(2147483648)
 9 
10 // 一樣也適用於十六進制表示的整數: 從 2^31 到 2^32-1:
11 var_dump( 0xffffffff );
12 // 輸出: float(4294967295)
13 
14 // 不適用於大於 2^32-1 的十六進制表示的數:
15 var_dump( 0x100000000 );
16 // 輸出: int(2147483647)
17 
18 $million = 1000000;
19 $large_number =  50000 * $million;
20 var_dump($large_number);
21 // 輸出: float(50000000000)
22 ?>

將一個值轉換爲 integer,用 (int) 或 (integer) 強制轉換。不過大多數狀況下都不須要強制轉換,由於當運算符,函數或流程控制須要一個 integer 參數時,值會自動轉換。還能夠經過函數 intval() 來將一個值轉換成整型.

FALSE 將產生出 0(零),TRUE 將產生出 1(壹)。

當從浮點數轉換成整數時,將向零取整。

若是浮點數超出了整數範圍(一般爲 +/- 2.15e+9 = 2^31),則結果不肯定。在此狀況下沒有警告!

浮點型

浮點數(也叫浮點數,雙精度數或實數)能夠用如下任一語法定義:

1 <?php
2 $a = 1.234; 
3 $b = 1.2e3; 
4 $c = 7E-10;
5 ?>

字符串

一個字符串 就是由一系列的字符組成,一個字符就是一個字節,一個字節只能有256種不一樣的變化,暗示了PHP沒法原生支持Unicode。

一個字符串 經過下面的4種方法來定義:

單引號

定義一個字符串 的最簡單的方法是用單引號把它包圍起來 (標點符號 ')。

若是想要輸出一個單引號,需在它的前面加個反斜線 (\)。在單引號前或在字符串的結尾處 想要輸出反斜線,輸入兩條 (\\)。注意,在任何其它的字符前加了反斜線,反斜線將會被直接輸出。

雙引號

若是字符串是包圍在雙引號(")中, PHP將對一些特殊的字符進行解析。

 

Heredoc結構

PHP4才引入了Heredoc結構。第三種定義字符串的方法是用heredoc句法結構:<<<。在該提示 符後面,要定義個標識符,而後是一個新行。接下來是字符串 自己,最後要用前面定義的標識符做爲結束標誌。

結束時所引用的標識符必須在一行的開始位置, 並且,標識符的命名也要像其它標籤同樣遵照PHP的規則:只能包含 字母、數字和下劃線,而且不能用數字和下劃線做爲開頭。

Nowdoc結構

Nowdoc結構是相似於單引號字符串的。Nowdoc結構很象heredoc結構,可是 nowdoc不進行解析操做 。 這種結構很適合用在不須要進行轉義的PHP代碼和其它大段文本。

一個nowdoc結構也用和heredocs結構同樣的標記 <<<, 可是跟在後面的標誌符要用 單引號括起來,就像<<<'EOT'這樣。heredocs結構的全部規則也一樣適用於nowdoc結 構,尤爲是結束標誌符的規則。

變量解析

字符串用雙引號或heredoc結構定義時,其中的變量將會被解析。

兩種語法規則:一種簡單規則,一種複雜規則。簡單的句法規則是最經常使用和最方便的, 它能夠用最少的代碼在一個字符串中加入變量,數組值,或對象屬性。

複雜的句法規則是在PHP4之後加入的,被花括號包圍的表達式是其明顯標記。

簡單句法規則

當PHP解析器遇到一個美圓符號 ($) ,造成一個合法的變量名。能夠用花括號來明確變量名的界線。

1 <?php
2 $beer = 'Heineken';
3 echo "$beer's taste is great"; //有效;單引號"'"是非法的變量名組成元素
4 echo "He drank some $beers"; //無效;字母s是有效的變量名組成元素,可是這裏的變量是$beer
5 echo "He drank some ${beer}s"; // 有效
6 echo "He drank some {$beer}s"; // 有效
7 ?>

相似的,一個數組索引或一個對象屬性也可被解析。數組索引要用方括號 (]) 來表示邊際, 對象屬性則是和上述的變量規則相同。

 1 <?php
 2 // 下面的例子是在字符串中引用數組
 3 // 當數組處於字符串外部時,要把數組的值用括號括起來且不要用花括號{ }
 4 
 5 // 顯示全部錯誤
 6 error_reporting(E_ALL);
 7 
 8 $fruits = array('strawberry' => 'red', 'banana' => 'yellow');
 9 
10 // 有效;可是注意在字符串外面不能這樣引用數組
11 echo "A banana is $fruits[banana].";
12 
13 // 有效
14 echo "A banana is {$fruits['banana']}.";
15 
16 // 有效,可是PHP會先尋找常量banana
17 echo "A banana is {$fruits[banana]}.";
18 
19 // 無效,要用花括號,這裏將會產生一個解析錯誤
20 echo "A banana is $fruits['banana'].";
21 
22 // 有效
23 echo "A banana is " . $fruits['banana'] . ".";
24 
25 // 有效
26 echo "This square is $square->width meters broad.";
27 
28 // 無效,解決方法見覆雜結構
29 echo "This square is $square->width00 centimeters broad.";
30 ?>
複雜句法規則

任何想用在字符串中標量變量,數組變量或對象屬性均可使用這種方法。 只需簡單地像在字符串之外的地方那樣寫出表達式, 而後用花括號{和 }把它括起來。 因爲 { 沒法被轉義,只有 $要緊挨着 {纔會被認出來,能夠用 {$ 來表達 {$。下面的示例能夠更好的解釋:

<?php
// 顯示全部錯誤
error_reporting(E_ALL);

$great = 'fantastic';

// 無效,輸出:?This?is?{?fantastic}
echo "This is { $great}";

// 有效,輸出: This is fantastic
echo "This is {$great}";
echo "This is ${great}";

// 有效
echo "This square is {$square->width}00 centimeters broad."; 

// 有效
echo "This works: {$arr[4][3]}";

// 這是錯誤的表達式,由於就象$foo[bar] 的格式不能在字符串之外的地方使用同樣。
// 換句話說,只有在PHP能找到常量foo 的前提下才會正常工做;這裏會產生一個E_NOTICE?(undefined?constant)級別的錯誤。
echo "This is wrong: {$arr[foo][3]}"; 

// 有效,當在字符串中使用多重數組時,必定要用括號將它括起來
echo "This works: {$arr['foo'][3]}";

// 有效
echo "This works: " . $arr['foo'][3];

echo "This works too: {$obj->values[3]->name}";

echo "This is the value of the var named $name: {${$name}}";

echo "This is the value of the var named by the return value of getName():
{${getName()}}";

echo "This is the value of the var named by the return value of
$object->getName(): {${$object->getName()}}";

// 無效,輸出: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>
View Code

 

存取和修改字符串中的字符

字符串中的字符能夠經過一個以0爲開始的,用相似數組結構中的方括號包含對應的數字來查找和修改,好比 $str[42], 能夠把 字符串想像數組 。 函數 substr() 和 substr_replace()能夠用來實現多於一個字符 的狀況。

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

數組

PHP 中的 數組其實是一個有序映射。映射是一種把 values 關聯到 keys 的類型。用 array() 語言結構來新建一個 array接受任意數量

1 array(  key =>  value
2      , ...
3      )
4 // 鍵(key) 但是是一個 整數(integer) 或 字符串(string)
5 // 值(value) 能夠是任意類型的值

 

用逗號分隔的 鍵(key) => 值(value) 對。

設定值來改變一個現有的數組,經過在方括號內指定鍵名來給數組賦值實現的。也能夠省略鍵名,在這種狀況下給變量名加上一對空的方括號(「[]」)。

1 $arr[key] = value;
2 $arr[] = value;
3 // key 能夠是 integer 或 string
4 // value 能夠是任意類型的值

若是 $arr 還不存在,將會新建一個。這也是一種定義數組的替換方法。要改變一個值,只要給它賦一個新值。若是要刪除一個鍵名/值對,要對它用 unset()

 1 <?php
 2 $arr = array(5 => 1, 12 => 2);
 3 
 4 $arr[] = 56;    // This is the same as $arr[13] = 56;
 5                 // at this point of the script
 6 
 7 $arr["x"] = 42; // This adds a new element to
 8                 // the array with key "x"
 9                 
10 unset($arr[5]); // This removes the element from the array
11 
12 unset($arr);    // This deletes the whole array
13 ?>

若是給出方括號但沒有指定鍵名,則取當前最大整數索引值,新的鍵名將是該值 + 1。若是當前尚未整數索引,則鍵名將爲 0最大整數鍵名不必定當前就在數組中。它只要在上次數組從新生成索引後曾經存在過就好了。

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

 

對象

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

 1 <?php
 2 class foo
 3 {
 4     function do_foo()
 5     {
 6         echo "Doing foo."; 
 7     }
 8 }
 9 
10 $bar = new foo;
11 $bar->do_foo();
12 ?>
相關文章
相關標籤/搜索