程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 前端學PHP之數據類型,學PHP之數據類型

前端學PHP之數據類型,學PHP之數據類型

編輯:關於PHP編程

前端學PHP之數據類型,學PHP之數據類型


×
目錄
[1]總括 [2]布爾型 [3]整型[4]浮點型[5]字符串[6]數組[7]對象[8]NULL[9]資源

前面的話

  同javascript一樣,php也是一門弱類型語言,或者說成類型松散的語言。在強類型語言中,變量要先指定類型,然後才可以對應指定類型的數制。而php則不必告知變量的數據類型,會根據它的值,自動把變量轉換成正確的數據類型。下面將詳細介紹php的數據類型

 

總括

  PHP數據類型包括8種:其中包括四種標量類型、兩種復合類型和兩種特殊類型。具體是:字符串、整數、浮點數、布爾、數組、對象、NULL、資源

  如果想查看某個表達式的值和類型,可以使用函數var_dump()

<?php
    $var = 1;
    //int 1
    echo var_dump($var);
    echo '<br>';

    $var = 1.0;
    //float 1
    echo var_dump($var);
    echo '<br>';

    $var = true;
    //boolean true
    echo var_dump($var);
    echo '<br>';

    $var = '1';
    //string '1' (length=1)
    echo var_dump($var);
    echo '<br>';    
?>

 

布爾型

  布爾型是最簡單的類型。boolean表達了真值,可以為TRUE或FALSE

  要指定一個布爾值,使用關鍵字 TRUE 或 FALSE。兩個都不區分大小寫

<?php
$foo = True; // assign the value TRUE to $foo
?>

轉換

  要明確地將一個值轉換成 boolean,用 (bool) 或者 (boolean) 來強制轉換

假值

  當轉換為boolean時,以下值被認為是 FALSE:

  布爾值 FALSE 本身

  整型值 0

  浮點型值 0.0

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

  不包括任何元素的數組

  不包括任何成員變量的對象(僅 PHP 4.0 適用)

  特殊類型 NULL(包括尚未賦值的變量)

  從空標記生成的SimpleXML對象

<?php
var_dump((bool) "");        // bool(false)
var_dump((bool) 1);         // bool(true)
var_dump((bool) -2);        // bool(true)
var_dump((bool) "foo");     // bool(true)
var_dump((bool) 2.3e5);     // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array());   // bool(false)
var_dump((bool) "false");   // bool(true)
?>

檢測

  is_bool()函數用來檢測變量是否是布爾型

bool is_bool ( mixed $var )

  如果 var 是 boolean 則返回 TRUE

<?php
$a = false;
$b = 0;

// 因為 $a 是布爾型,所以結果為真
if (is_bool($a)) {
    print "Yes, this is a boolean";
}

// 因為 $b 不是布爾型,所以結果為非真
if (is_bool($b)) {
    print "Yes, this is a boolean";
}
?>

 

整型

  PHP整數必須至少有一個數字,不能包含逗號或空格,不能有小數點,正負均可

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

  二進制表達的 integer 自 PHP 5.4.0 起可用

  要使用八進制表達,數字前必須加上 0(零)。要使用十六進制表達,數字前必須加上 0x。要使用二進制表達,數字前必須加上 0b

<?php
$a = 1234; // 十進制數
$a = -123; // 負數
$a = 0123; // 八進制數(等於十進制 83)
$a = 0x1A; // 十六進制數(等於十進制 26)
?>

  整型數的字長和平台有關,盡管通常最大值是大約二十億(32 位有符號)。64位平台下的最大值通常是大約 9E18。PHP不支持無符號整數。Integer 值的字長可以用常量 PHP_INT_SIZE來表示,自 PHP 4.4.0 和 PHP 5.0.5後,最大值可以用常量 PHP_INT_MAX 來表示

<?php
echo PHP_INT_SIZE;//4
echo PHP_INT_MAX;//2147483647
?>

溢出

  如果給定的一個數超出了 integer 的范圍,將會被解釋為 float。同樣如果執行的運算結果超出了 integer 范圍,也會返回 float

<?php
$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)
?>

轉換

  要明確地將一個值轉換為 integer,用 (int) 或 (integer) 強制轉換。還可以通過函數 intval() 來將一個值轉換成整型

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(420000000000000000000);   // 0
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

  從布爾值轉換,FALSE 將產生出 0,TRUE 將產生出 1;從浮點型轉換,當從浮點數轉換成整數時,將向下取整;從字符串轉換,如果該字符串沒有包含 '.','e' 或 'E' 並且其數字值在整型的范圍之內,該字符串將被當成 integer 來取值。其它所有情況下都被作為float來取值。該字符串的開始部分決定了它的值。如果該字符串以合法的數值開始,則使用該數值。否則其值為0。合法數值由可選的正負號,後面跟著一個或多個數字(可能有小數點),再跟著可選的指數部分。指數部分由'e'或'E'後面跟著一個或多個數字構成

<?php
echo (int)true;//1
echo (int)false;//0
echo (int)1.6;//1
echo (int)'1.6px';//1
echo (int)'px';//0
?>

檢測

  is_int()、is_integer()、is_long()這三個函數可以用來檢測變量是否是整數

<?php
$a = 1;
$b = 1.0;

var_dump(is_int($a));//true
var_dump(is_int($b));//false
var_dump(is_integer($a));//true
var_dump(is_integer($b));//false
var_dump(is_long($a));//true
var_dump(is_long($b));//false
?>

 

浮點型

  浮點型(也叫浮點數 float,雙精度數 double 或實數 real)

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

  PHP 通常使用 IEEE 754 雙精度格式,則由於取整而導致的最大相對誤差為 1.11e-16。非基本數學運算可能會給出更大誤差,並且要考慮到進行復合運算時的誤差傳遞

  以十進制能夠精確表示的有理數如 0.1 或 0.7,無論有多少尾數都不能被內部所使用的二進制精確表示,因此不能在不丟失一點點精度的情況下轉換為二進制的格式。這就會造成混亂的結果:例如,floor((0.1+0.7)*10) 通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9999999999999991118...

<?php
echo floor((0.1+0.7)*10);//7
?>

轉換

  要明確地將一個值轉換為 float,用(float)強制轉換。還可以通過函數 floatval()、doubleval()來將一個值轉換成整型。除了字符串類型之外,一般地,都是先將值轉換成整型,然後再轉換成浮點數

<?php
$var1 = '122.34343The';
$float_value1_of_var1 = floatval ($var1);
$float_value1_of_var1 = doubleval ($var1);
print $float_value1_of_var1; // 打印出 122.34343
print $float_value1_of_var1; // 打印出 122.34343

$var2 = true;
$float_value2_of_var2 = floatval ($var2);
$float_value2_of_var2 = doubleval ($var2);
print $float_value2_of_var2; // 打印出 1
print $float_value2_of_var2; // 打印出 1
?>

比較浮點數

  比較兩個浮點數是否相等是有問題的。不過還是有迂回的方法來比較浮點數值的

  要測試浮點數是否相等,要使用一個僅比該數值大一丁點的最小誤差值。該值也被稱為機器極小值(epsilon)或最小單元取整數,是計算中所能接受的最小的差別值

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
    echo "true";
}
?>

NaN

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

  由於 NAN 代表著任何不同值,不應拿 NAN 去和其它值進行比較,包括其自身,應該用 is_nan() 來檢查

<?php
$nan = acos(8);
var_dump($nan, is_nan($nan));//float NAN boolean true
?>

檢測

  is_real()、is_float()這兩個函數可以用來檢測變量是否是浮點數

<?php
isfloat("5.0" + 0);  // true
isfloat("5.0");  // false
isfloat(5 + 0);  // false
isfloat(5.0 + 0);  // false
isfloat('a' + 0);  // false
?>

 

字符串

  一個字符串string就是由一系列的字符組成,其中每個字符等同於一個字節

  一個字符串可以用 4 種方式表達:單引號、雙引號、heredoc語法結構、nowdoc語法結構(自 PHP 5.3.0 起)

單引號

  定義一個字符串的最簡單的方法是用單引號把它包圍起來

  要表達一個單引號自身,需在它的前面加個反斜線(\)來轉義。要表達一個反斜線自身,則用兩個反斜線(\\)。其它任何方式的反斜線都會被當成反斜線本身:也就是說如果想使用其它轉義序列例如 \r 或者 \n,並不代表任何特殊含義,就單純是這兩個字符本身

  [注意]在單引號字符串中的變量和特殊字符的轉義序列將不會被替換

<?php
echo 'this is a simple string';

// 可以錄入多行
echo 'You can also have embedded newlines in 
strings this way as it is
okay to do';

// 輸出: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';

// 輸出: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';

// 輸出: You deleted C:\*.*?
echo 'You deleted C:\*.*?';

// 輸出: This will not expand: \n a newline
echo 'This will not expand: \n a newline';

// 輸出: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>

雙引號

  如果字符串是包圍在雙引號中, PHP將對一些特殊的字符進行解析。用雙引號定義的字符串最重要的特征是變量會被解析

【轉義字符】

序列       含義
\n        換行(ASCII 字符集中的 LF 或 0x0A (10))
\r        回車(ASCII 字符集中的 CR 或 0x0D (13))
\t        水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
\v        垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
\e        Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
\f        換頁(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
\\        反斜線
\$        美元標記
\"        雙引號
\[0-7]{1,3}    符合該正則表達式序列的是一個以八進制方式來表達的字符
\x[0-9A-Fa-f]{1,2}    符合該正則表達式序列的是一個以十六進制方式來表達的字符

Heredoc結構

  第三種表達字符串的方法是用heredoc句法結構:<<<。在該運算符之後要提供一個標識符,然後換行。接下來是字符串string 本身,最後要用前面定義的標識符作為結束標志

  結束時所引用的標識符必須在該行的第一列,而且,標識符的命名也要像其它標簽一樣遵守 PHP 的規則:只能包含字母、數字和下劃線,並且必須以字母和下劃線作為開頭

  [注意]結束標識符這行除了可能有一個分號外,絕對不能包含其它字符。這意味著標識符不能縮進,分號的前後也不能有任何空白或制表符

<?php 
$str = <<< G
123
G;
echo $str;//123
?>

  Heredoc結構就象是沒有使用雙引號的雙引號字符串,這就是說在heredoc 結構中單引號不用被轉義,但是轉義序列還可以使用。變量將被替換

<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

class foo
{
    var $foo;
    var $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

/*My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A*/

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

Nowdoc結構

  就象 heredoc 結構類似於雙引號字符串,Nowdoc 結構是類似於單引號字符串的。Nowdoc 結構很象 heredoc 結構,但是 nowdoc 中不進行解析操作。這種結構很適合用於嵌入 PHP 代碼或其它大段文本而無需對其中的特殊字符進行轉義

<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;

class foo
{
    public $foo;
    public $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';
/*
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
 */
echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;
?>

轉換

  一個值可以通過在其前面加上 (string) 或用 strval() 函數來轉變成字符串。在一個需要字符串的表達式中,會自動轉換為string。比如在使用函數echo或print時,或在一個變量和一個 string 進行比較時,就會發生這種轉換

  NULL 總是被轉變成空字符串

  一個布爾值 boolean 的 TRUE 被轉換成 string 的 "1"。Boolean 的 FALSE 被轉換成 ""(空字符串)。這種轉換可以在 boolean 和 string 之間相互進行

  一個整數 integer 或浮點數 float 被轉換為數字的字面樣式的 string(包括 float 中的指數部分)。使用指數計數法的浮點數(4.1E+6)也可轉換

  當一個字符串被當作一個數值來取值,其結果和類型如下

  如果該字符串沒有包含 '.','e' 或 'E' 並且其數字值在整型的范圍之內(由 PHP_INT_MAX 所定義),該字符串將被當成 integer 來取值。其它所有情況下都被作為 float 來取值

  該字符串的開始部分決定了它的值。如果該字符串以合法的數值開始,則使用該數值。否則其值為 0(零)。合法數值由可選的正負號,後面跟著一個或多個數字(可能有小數點),再跟著可選的指數部分。指數部分由 'e' 或 'E' 後面跟著一個或多個數字構成

<?php
$foo = 1 + "10.5";                // $foo is float (11.5)
$foo = 1 + "-1.3e3";              // $foo is float (-1299)
$foo = 1 + "bob-1.3e3";           // $foo is integer (1)
$foo = 1 + "bob3";                // $foo is integer (1)
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1;          // $foo is float (11)
$foo = "10.0 pigs " + 1.0;        // $foo is float (11)     
?>

  直接把 array,object 或 resource 轉換成 string 不會得到除了其類型之外的任何有用信息

檢測

  is_string()函數用來檢測變量是否是字符串

bool is_string ( mixed $var )

  如果 var 是 string 則返回 TRUE,否則返回 FALSE

<?php
var_dump(is_string('123'));//boolean true
var_dump(is_string(123));//boolean false
?>

 

數組

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

  由於數組元素的值也可以是另一個數組,樹形結構和多維數組也是允許的

構建

  可以用 array() 語言結構來新建一個數組。它接受任意數量用逗號分隔的 鍵(key) => 值(value)對

array(  key =>  value
     , ...
     )
// 鍵(key)可是是一個整數 integer 或字符串 string
// 值(value)可以是任意類型的值
<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// 自 PHP 5.4 起
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>

  key可以是integer或者string。value可以是任意類型

  此外key會有如下的強制轉換

  包含有合法整型值的字符串會被轉換為整型。例如鍵名 "8" 實際會被儲存為 8。但是 "08" 則不會強制轉換,因為其不是一個合法的十進制數值

  浮點數也會被轉換為整型,意味著其小數部分會被捨去。例如鍵名 8.7 實際會被儲存為 8

  布爾值也會被轉換成整型。即鍵名 true 實際會被儲存為 1 而鍵名 false 會被儲存為 0

  Null 會被轉換為空字符串,即鍵名 null 實際會被儲存為 ""

  數組和對象不能被用為鍵名

  如果在數組定義中多個單元都使用了同一個鍵名,則只使用了最後一個,之前的都被覆蓋了

<?php
$array = array(
    1    => "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
);
/*
array(1) {
  [1]=>
  string(1) "d"
}
 */
var_dump($array);
?>

  key 為可選項。如果未指定,PHP 將自動使用之前用過的最大 integer 鍵名加上 1 作為新的鍵名

<?php
$array = array("foo", "bar", "hallo", "world");
/*
array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(5) "hallo"
  [3]=>
  string(5) "world"
}
 */
var_dump($array);
?>

<?php
$array = array(
         "a",
         "b",
    6 => "c",
         "d",
);
/*
array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "d"
}
 */
var_dump($array);
?>

訪問

  數組單元可以通過 array[key] 語法來訪問

<?php
$array = array(
    "foo" => "bar",
    42    => 24,
    "multi" => array(
         "dimensional" => array(
             "array" => "foo"
         )
    )
);
/*
string(3) "bar"
int(24)
string(3) "foo"
 */
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>

  要修改某個值,通過其鍵名給該單元賦一個新值。要刪除某鍵值對,對其調用 unset() 函數

  [注意]如果給出方括號但沒有指定鍵名,則取當前最大整數索引值,新的鍵名將是該值加上 1(但是最小為 0)。如果當前還沒有整數索引,則鍵名將為 0

<?php
$arr = array(5 => 1, 12 => 2);

$arr[] = 56;    // This is the same as $arr[13] = 56;
                // at this point of the script

$arr["x"] = 42; // This adds a new element to
                // the array with key "x"
                
unset($arr[5]); // This removes the element from the array

unset($arr);    // This deletes the whole array
?>

遍歷

  foreach 語法結構提供了遍歷數組的簡單方式。foreach 僅能夠應用於數組和對象,如果嘗試應用於其他數據類型的變量,或者未初始化的變量將發出錯誤信息

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // 最後取消掉引用
?>

轉換

  將 NULL 轉換為 array 會得到一個空的數組

  對於任意 integer,float,string,boolean 和 resource 類型,如果將一個值轉換為數組,將得到一個僅有一個元素的數組,其下標為 0,該元素即為此標量的值

  如果一個 object 類型轉換為 array,則結果為一個數組,其單元為該對象的屬性。鍵名將為成員變量名,不過有幾點例外:整數屬性不可訪問;私有變量前會加上類名作前綴;保護變量前會加上一個 '*' 做前綴。這些前綴的前後都各有一個 NULL 字符

比較

  array_diff()函數用來計算數組的差集

array array_diff ( array $array1 , array $array2 [, array $... ] )

  對比返回在 array1 中但是不在 array2 及任何其它參數數組中的值

<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);
/*
Array
(
    [1] => blue
)
 */
print_r($result);
?>

檢測

  is_array()函數用來檢測變量是否是數組

<?php
var_dump(is_array([]));//boolean true
var_dump(is_array(''));//boolean false
?>

 

對象

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

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

轉換

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

<?php
$obj = (object) 'ciao';
echo $obj->scalar;  // outputs 'ciao'
?>

檢測

  is_object()方法用來檢測變量是否是一個對象

<?php
var_dump(is_object(''));//boolean false
var_dump(is_object((object)''));//boolean true
?>

 

NULL

  PHP中的NULL是空類型,對大小寫不敏感,NULL類型只有一個取值,表示一個變量沒有值,當被賦值為NULL,或者尚未被賦值,或者被unset(),這三種情況下變量被認為為NULL

<?php 
 error_reporting(0); //禁止顯示PHP警告提示
 $var;
 var_dump($var);//NULL
 $var1 = null;
 var_dump($var1);//NULL
 $var2 = NULL;
 var_dump( $var2);//NULL
 $var3 = "節日快樂!";
 unset($var3);
 var_dump($var3);//NULL
?>

轉換

  使用 (unset) $var 將一個變量轉換為 null 將不會刪除該變量或 unset 其值。僅是返回 NULL 值而已

檢測

  is_null()函數用來檢測變量是否為 NULL

<?php 
var_dump(is_null(NULL));//boolean true
var_dump(is_null(''));//boolean false
?>

 

資源

  PHP資源是由專門的函數來建立和使用的,例如打開文件、數據連接、圖形畫布。可以對資源進行操作(創建、使用和釋放)。任何資源,在不需要的時候應該被及時釋放。如果我們忘記了釋放資源,系統自動啟用垃圾回收機制,在頁面執行完畢後回收資源,以避免內存被消耗殆盡

<?php
$file=fopen("data/webroot/resource/f.txt","r");   //打開文件
$con=mysql_connect("127.0.0.1","root","root");  //連接數據庫
if ($file_handle){
    //接著采用while循環(後面語言結構語句中的循環結構會詳細介紹)一行行地讀取文件,然後輸出每行的文字
    while (!feof($file_handle)) { //判斷是否到最後一行
        $line = fgets($file_handle); //讀取一行文本
        echo $line; //輸出一行文本
        echo "<br />"; //換行
    }
}
fclose($file_handle);//關閉文件
?>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved