深入探討PHP數據類型


PHP是一種弱類型語言:PHP的變量沒有數據類型的概念,可以存放任意的數據類型。數據本身都是有數據類型的,數據是人為分類的,分成不同的類型。在PHP中所講的數據類型指的是變量所保存的數據本身。通常都是用變量的數據類型來代替變量所保存的數據的數據類型。

PHP將數據類型分為三大類八小類:

  • 標量數據類型

整型(integer)

浮點型(float)

布爾型(boolean)

字符串型(string)

  • 復合數據類型

數組(array)

對象(object)

  • 特殊數據類型

空類型(NULL)

資源類型(resoure)

標量數據類型

標量又稱之為基本數據類型(簡單數據類型)
分為四種:整型,浮點型,布爾型和字符串型

整型

php變量保存的數據是整數(有效范圍內)

$a = 3; // 3是一個整型,$a是一個整型
$b = -3; // 整型包含正和負(有符號)

php還能保存其他進制的整型

$num = 123; // 默認是十進制數據
$num = 0123; // 0不代表前綴:告訴服務器當前數據是八進制
$num = 0x123; // 十六進制

php輸出給用戶默認會全部解析成十進制

// 定義整型變量
$num1 = 123;

// 定義整型最大值
$num2 = PHP_INT_MAX;

// 定義八進制
$num3 = 0123;

// 定義十六進制
$num4 = 0x123;

var_dump($num1,$num2,$num3,$num4);

/*輸出結果
int(123)
int(2147483647)
int(83)
int(291)*/

通用的轉十進制的方法:將位數上的值 * 對應的進制的 N-1 次方(從右往左)

八進制轉十進制

0123 ======> 十進制
3 * 8 ^ (1 - 1) + 2 * 8 ^ (2 - 1) + 1 * 8 ^ (3 - 1)
3 * 1 + 2 * 8 + 1 * 64 = 3 + 16 + 64 = 83

十六進制轉十進制

0x123 ======> 十進制
3 * 16 ^ (1 - 1) + 2 * 16 ^ (2 - 1) + 1 * 16 ^ (3 - 1)
3 * 1 + 2 * 16 + 1 * 256 = 3 + 32 + 256 = 291

php可以按照數據本身的進制進行輸出:需要使用特定的輸出方式printf()

printf('輸出方式占位符',要輸出的數據列表);

十進制輸出:%d
八進制輸出:%o
十六進制輸出:%x

printf("十進制的123是:%d;八進制的0123是:%o;十六進制的0x123是:%x",123,0123,0x123);
// 輸出結果:十進制的123是:123;八進制的0123是:123;十六進制的0x123是:123

浮點型

帶小數點的數值都是浮點型,超出整型范圍的數值類型也是浮點型。

浮點型數據又稱之為精度型數據:分為單精度(float)和雙精度(double)

  • float:使用4個字節保存數據:表示的數據范圍10^38,但是表示的有效數字(精度)大概為7位。
  • double:使用8個字節保存數據:表示的數據范圍10^308,表示的精度范圍大概為15位。

php中只有雙精度,沒有單精度:雙精度也是有float表示不是double。

// 定義浮點數:小數點
$f1 = 0.12;
$f2 = -123.0;

// 超出整型范圍
$f3 = PHP_INT_MAX + 1;

// 支持科學計算法
$f4 = 1.23e10; // 1.23 * 10 ^ 10
$f5 = 23.4e-10; // 23.4 * 10 ^ -10

// 浮點數如果超出精度范圍后,會自動的四舍五入
$f6 = 123456789012345678901234567890;

var_dump($f1,$f2,$f3,$f4,$f5,$f6);

/*輸出結果
float(0.12)
float(-123)
float(2147483648)
float(12300000000)
float(2.34E-9)
float(1.2345678901235E+29)*/

為什么浮點數能夠存儲較大的數據呢?4字節(單精度)
4個字節一共32位:如果全部用來存儲數據最多表示42億多
浮點數:使用一部分用來存儲數據,另外一部分存儲指數

整型(4個字節)
11111111 11111111 11111111 11111111 表示最大:42億多

浮點型(4個字節)
11111111 11111111 11111111 11111111 表示最大

其中最左邊的1代表符號位
第2-6位的1代表指數(5數):31
后面的1代表數值本身(26位):8個有效數組

組合:符號位(+/-) 數值 * e^指數值
      - 6.7 * 10 ^ 7 * e ^ 31 => - 6.7 * 10 ^ 38

布爾類型

布爾類型只有兩種數據:true或者false,布爾類型通常用於判斷

// 定義布爾數據
$b1 = true;
$b2 = false;

var_dump($b1,$b2);

/*輸出結果
bool(true)
bool(false)*/

在PHP中大部分的數據轉換成布爾類型的時候都是true,只有以下幾種類型會轉換成false

  • 空字符串:' ' 或 ''
  • 0值:0 或 '0' 或 0.0
  • 空數組:array()
  • NULL:null

字符串類型

存儲的數據是字符串數據:是一類應用最廣的數據類型(互聯網之間傳遞的數據和文件內部存儲的數據全部都是字符串)

在php中,字符串有三種定義方式:

單引號:數據用單引號包裹

// 使用單引號定義字符串
$str1 = ''; // 空字符串
$str2 = '123'; // 純數值型字符
$str3 = 'hello world';

var_dump($str1,$str2,$str3);

/*輸出結果
string(0) ""
string(3) "123"
string(11) "hello world"*/

雙引號:數據用雙引號包裹

// 使用雙引號定義字符串
$str4 = "";
$str5 = "456";
$str6 = "你好中國"; // 當前使用的編碼是unicode,一個中文是一個字符,占用3個字節存儲

var_dump($str4,$str5,$str6);

/*輸出結果
string(0) ""
string(3) "456"
string(12) "你好中國"*/

單引號與雙引號的區別

  • 單引號與雙引號解析的轉義字符不一樣

    單引號能轉移的字符: \\, \'
    雙引號能轉義的字符: \\, \", \r\n, \t, \$

    $str7 = 'ab\\\r\n\t\$\'\"cdefg';
    $str8 = "ab\\\r\n\t\$\'\"cdefg";
    
    var_dump($str7,$str8);
    
    /*輸出結果
    string(19) "ab\\r\n\t\$'\"cdefg"
    string(15) "ab\
        $\'"cdefg"*/
  • 雙引號字符串內部的$符號會被解析成變量符號:如果有$符號會被自動當做變量進行輸出
    $str = '123';
    
    $str7 = '$str';
    $str8 = "$str";
    
    var_dump($str7,$str8);
    
    /*輸出結果
    string(4) "$str"
    string(3) "123"*/

雙引號解析變量的時候注意事項:系統沒有辦法自動的區分變量名字,只要$符號后面跟的普通字符串(字母,下划線和數字)都會被系統當做變量的名字:

  • 解決方案1: 使用非字母,數字或者下划線的符號(空格)
    $str = '123';
    
    $str8 = "$str a";
    
    var_dump($str8);
    
    /*輸出結果
    string(5) "123 a"*/
  • 解決方案2: 使用{}將變量包裹起來: 告訴系統內部是一個變量
    $str = '123';
    
    $str8 = "{$str}a";
    
    var_dump($str8);
    
    /*輸出結果
    string(5) "123a"*/

定界符:使用定界符包裹數據

$變量 = <<<定界符標志
// 中間所有的內容都是字符串
定界符標志;

$str9 = <<<END
    // 中間所有的內容都是字符串
    <script>
        alert('hello world');
    </script>
END;

echo $str9;

/*輸出結果
    // 中間所有的內容都是字符串
    <script>
        alert('hello world');
    </script>*/

定界符特點:

  • 定界符的首標志后面不能跟任何內容:包括空格和注釋
  • 定界符內部的內容全部都是屬於字符串內容(包括注釋)
  • 定界符的結束標志必須頂格:前面不能有任何內容(空格和tap)
  • 定界符的結束符號后面也不能有任何內容

定界符的存在其實本質是為了解決引號字符串的多行問題以及結構問題

定界符分為兩種:分別代表單引號和雙引號

  • heredoc結構:代表雙引號
    $str = 'hello world';
    
    $str9 = <<<END
        // 中間所有的內容都是字符串
        <script>
            alert('$str');
        </script>
    END;
    
    echo $str9;
    
    /*輸出結果
        // 中間所有的內容都是字符串
        <script>
            alert('hello world');
        </script>*/
  • nowdoc結構:代表單引號(內部不能解析變量):給定界符首符號加上一對單引號
    $str = 'hello world';
    
    $str9 = <<<'END'
        // 中間所有的內容都是字符串
        <script>
            alert('$str');
        </script>
    END;
    
    echo $str9;
    
    /*輸出結果
        // 中間所有的內容都是字符串
        <script>
            alert('$str');
        </script>*/

復合數據類型

只有兩種數據類型:

  • 數組
  • 對象

表示能夠存儲多個數據(保存在內存中的堆區)

特殊數據類型

只有兩種數據類型:

  • 空類型:NULL:變量沒有指向內存地址
  • 資源類型:resource,外部數據類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM