首頁 > 後端開發 > php教程 > PHP變數類型詳細介紹

PHP變數類型詳細介紹

小云云
發布: 2023-03-22 06:10:01
原創
2698 人瀏覽過

本文主要和大家分享PHP變數類型詳細介紹,屬於基礎分享,希望能幫助大家。

PHP支援9種原始資料類型。

4種標量類型:

  • #boolean布林型

  • integer 整形

  • float 浮點型(也稱為double

  • #string 字串

3種複合型別:

  • array 數組

  • object 物件

  • callable 可呼叫

2種特殊型別

  • #resource 資源

  • ##resource
 資源

###null### 無型別###############為了確保程式碼的易讀性,我們通常會使用一些偽類型:#######
  • mixed 混合类型

  • number 数字类型

  • callback 回调类型(又称为callable

  • array|object 数组|对象类型

  • void 无类型

变量的类型不是程序员设定,是由PHP根据该变量使用的上下文在运行时决定的。

与变量类型有关的常用函数

  • 如果想查看某个表达式的值和类型,使用var_dump()函数。

  • 获取变量的类型,使用gettype()函数。

  • 要检验某个类型,可以使用is_type函数,如:

    <?php
        $a = 1;        
        if(is_int($a)){            echo "\r\n\$a是在整形\r\n";
        }        
        if(is_float($a)){            echo "\r\n\$a是在浮点型\r\n";
        }        
        if(is_string($a)){            echo "\r\n\$a是在字符串\r\n";
        }

        ......    ?>
登入後複製
  • 如果需要将一个变量强制转换为某类型,可以对其使用强制转换或者settype()函数。

接下来我们先来看看四种标量类型

Boolean 布尔类型

这是最简单的类型。boolean表达了真值,可以为TRUEFALSE

语法

要指定一个布尔值,使用常量TRUEFALSE。(不区分大小写)如:

<?php
    $bool = TRUE; // 设置$bool 为 TRUE?>
登入後複製

通常运算符所返回的boolean值结果会被传递给控制流程。

转换为布尔值

要明确的将一个值转换成boolean,用(bool)或者(boolean)来强制转换,但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。

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

  • #布林值FALSE本身

  • 整數值0

  • 浮點型0.0

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

  • 不包含任何元素的陣列

  • 特殊型別NULL(包含尚未賦值的變數)

  • 從空標記產生的SimpleXML物件

所有其它值都被認為是TRUE(包括任何資源和NAN)。

Integer 整數

integer 是集合 ℤ = {..., -2, -1, 0, 1, 2, ...} 中的某個數。

語法

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

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

Example

<?php
    $a = 1234; // 十进制数
    $a = -123; // 负数
    $a = 0123; // 八进制数 (等于十进制 83)
    $a = 0x1A; // 十六进制数 (等于十进制 26)
    $a = 0b11111111; // 二进制数字 (等于十进制 255)?>
登入後複製

整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。64 位平台下的最大值通常是大约 9E18,除了 Windows 下 PHP 7 以前的版本,总是 32 位的。 PHP 不支持无符号的 integer。Integer 值的字长可以用常量 PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 来表示,最小值可以在 PHP 7.0.0 及以后的版本中用常量 PHP_INT_MIN 表示。

整数溢出

如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float

PHP 中没有整除的运算符。1/2 产生出 float 0.5。 值可以舍弃小数部分,强制转换为 integer,或者使用 round() 函数可以更好地进行四舍五入。

转换为整型

要明确地将一个值转换为 integer,用 (int)(integer) 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。还可以通过函数 intval() 来将一个值转换成整型。

思考下以下两种流程控制的区别:

<?php
    $num = &#39;1&#39;;    if(1 == $num){        # code ...
    }    
    if($num == 1){        # code ...
    }?>
登入後複製

从资源类型转换

resource 转换成 integer 时, 结果会是 PHP 运行时为 resource 分配的唯一资源号。

从浮点型转换

当从浮点数转换成整数时,将向下取整。

如果浮点数超出了整数范围(32 位平台下通常为 +/- 2.15e+9 = 2^31,64 位平台下,除了 Windows,通常为 +/- 9.22e+18 = 2^63),则结果为未定义,因为没有足够的精度给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!

PHP 7.0.0 起,NaNInfinity 在转换成 integer 时,不再是 undefined 或者依赖于平台,而是都会变成零。

Warning

绝不要将未知的分数强制转换为 integer,这样有时会导致不可预料的结果。

<?php
    echo (int) ( (0.1+0.7) * 10 ); // 显示 7!?>
登入後複製

Float 浮点型

浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:

<?php
    $a = 1.234; 
    $b = 1.2e3; 
    $c = 7E-10;?>
登入後複製

浮点数的字长和平台相关,尽管通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式)

浮點數的精確度

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

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

所以永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。如果確實需要更高的精度,應該使用任意精度數學函數或 gmp 函數。

比較浮點數

如上述警告訊息所言,由於內部表達方式的原因,比較兩個浮點數是否相等是有問題的。不過還是有迂迴的方法來比較浮點數值的。

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

$a 和 $b 在小數點後五位精確度內都是相等的。

<?php
    $a = 1.23456789;
    $b = 1.23456780;
    $epsilon = 0.00001;    
    if(abs($a-$b) < $epsilon) {        echo "true";
    }?>
登入後複製

NaN

某些数学运算会产生一个由常量 NAN (not a number) 所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值(除了 TRUE)进行的松散或严格比较的结果都是 FALSE

由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。

String 字符串

一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode

分析一下:

1 Byte = 8 bit
由于1个字节存储一个字符,那么1字节所能存储字符的可能性为:2^8=256
登入後複製

语法

一个字符串可以用 4 种方式表达:

  1. 單引號

  2. 雙引號

  3. #heredoc 語法結構

  4. nowdoc 語法結構

單引號

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

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

不像雙引號和 heredoc 語法結構,在單引號字串中的變數特殊字元的轉義序列將不會被取代。

雙引號

果實字串是包圍在雙引號(")中, 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 起)
eEscape(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 的規則:只能包含字母、數字和下劃線,並且必須以字母和底線作為開頭。

Warning

要注意的是結束標識符這行除了可能有一個分號(;)外,絕對不能包含其它字元。這意味著標識符不能縮進,分號的前後也不能有任何空白或製表符。更重要的是結束識別碼的前面必須是個被本地作業系統認可的換行,例如在UNIX 和Mac OS X 系統中是n,而結束定界符(可能其後有個分號)之後也必須緊跟一個換行。

如果不遵守該規則導致結束標識不“乾淨”,PHP 將認為它不是結束標識符而繼續尋找。如果在檔案結束前也沒有找到一個正確的結束標識符,PHP 將會在最後一行產生一個解析錯誤。

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

Heredoc 結構就像是沒有使用雙引號的雙引號字串,這就是說在 heredoc 結構中單引號不用被轉義,但是上文中列出的轉義序列還可以使用。變數將被替換,但在 heredoc 結構中含有複雜的變數時要格外小心。

在 PHP 5.3.0 以后,也可以用 Heredoc 结构来初始化静态变量和类的属性和常量。

自 PHP 5.3.0 起还可以在 Heredoc 结构中用双引号来声明标识符:

<?php
    echo <<<"FOOBAR"
    Hello World!
    FOOBAR;
?>
登入後複製

Nowdoc 结构

就像 heredoc 结构类似于双引号字符串,Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。与 SGML 的 结构是用来声明大段的不用解析的文本类似,nowdoc 结构也有相同的特征。

一个 nowdoc 结构也用和 heredocs 结构一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<'EOT'。Heredoc 结构的所有规则也同样适用于 nowdoc 结构,尤其是结束标识符的规则。本文由北大青鸟学校开发小组提供。

相关推荐:

php变量类型

以上是PHP變數類型詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板