摘要:獲取變量的類型,使用函數。要檢驗某個類型,可以使用函數,如是在整形是在浮點型是在字符串如果需要將一個變量強制轉換為某類型,可以對其使用強制轉換或者函數。自起,此限制僅對包含變量時有效。
簡介
PHP支持9種原始數據類型。
4種標量類型:
boolean布爾型
integer 整形
float 浮點型(也稱作double)
string 字符串
3種復合類型:
array 數組
object 對象
callable 可調用
2種特殊類型
resource 資源
null 無類型
為了確保代碼的易讀性,我們通常會使用一些偽類型:
mixed 混合類型
number 數字類型
callback 回調類型(又稱為callable)
array|object 數組|對象類型
void 無類型
變量的類型不是程序員設定,是由PHP根據該變量使用的上下文在運行時決定的。
與變量類型有關的常用函數
如果想查看某個表達式的值和類型,使用var_dump()函數。
獲取變量的類型,使用gettype()函數。
要檢驗某個類型,可以使用is_type函數,如:
如果需要將一個變量強制轉換為某類型,可以對其使用強制轉換或者settype()函數。
接下來我們先來看看四種標量類型 Boolean 布爾類型這是最簡單的類型。boolean表達了真值,可以為TRUE 或 FALSE
語法要指定一個布爾值,使用常量TRUE 或 FALSE。(不區分大小寫)如:
通常運算符所返回的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整型數的字長和平臺有關,盡管通常最大值是大約二十億(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() 來將一個值轉換成整型。
思考下以下兩種流程控制的區別:
從資源類型轉換
將 resource 轉換成 integer 時, 結果會是 PHP 運行時為 resource 分配的唯一資源號。
從浮點型轉換當從浮點數轉換成整數時,將向下取整。
如果浮點數超出了整數范圍(32 位平臺下通常為 +/- 2.15e+9 = 2^31,64 位平臺下,除了 Windows,通常為 +/- 9.22e+18 = 2^63),則結果為未定義,因為沒有足夠的精度給出一個確切的整數結果。在此情況下沒有警告,甚至沒有任何通知!
PHP 7.0.0 起,NaN 和 Infinity 在轉換成 integer 時,不再是 undefined 或者依賴于平臺,而是都會變成零。
Warning絕不要將未知的分數強制轉換為 integer,這樣有時會導致不可預料的結果。
Float 浮點型
浮點型(也叫浮點數 float,雙精度數 double 或實數 real)可以用以下任一語法定義:
浮點數的字長和平臺相關,盡管通常最大值是 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 在小數點后五位精度內都是相等的。
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 種方式表達:
單引號
雙引號
heredoc 語法結構
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 起) |
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 句法結構:<<<。在該運算符之后要提供一個標識符,然后換行。接下來是字符串 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 結構中用雙引號來聲明標識符:
Nowdoc 結構
就像 heredoc 結構類似于雙引號字符串,Nowdoc 結構是類似于單引號字符串的。Nowdoc 結構很象 heredoc 結構,但是 nowdoc 中不進行解析操作。這種結構很適合用于嵌入 PHP 代碼或其它大段文本而無需對其中的特殊字符進行轉義。與 SGML 的 結構是用來聲明大段的不用解析的文本類似,nowdoc 結構也有相同的特征。
一個 nowdoc 結構也用和 heredocs 結構一樣的標記 <<<, 但是跟在后面的標識符要用單引號括起來,即 <<<"EOT"。Heredoc 結構的所有規則也同樣適用于 nowdoc 結構,尤其是結束標識符的規則。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/28405.html
摘要:執行原理是一門應用非常簡單,開發效率極高的一門語言,其弱類型的變量能省去程序員大量的定義變量類型轉換等的時間和精力。程序最終被翻譯為一組處理函數的順序執行。只有減為時才會真正執行銷毀操作。 PHP執行原理 php是一門應用非常簡單,開發效率極高的一門語言,其弱類型的變量能省去程序員大量的定義變量、類型轉換等的時間和精力。它是一種適用于web開發的動態語言。 1. php設計的原理和特點...
摘要:文章來自原文在給開發者的源碼系列的第三篇文章,我們打算擴展上一篇文章來幫助理解內部是怎么工作的。進入在的核心代碼中,變量被稱為。要轉換一個為值,就調用函數。有了這個東西,我們可以看到函數馬上調用函數。 文章來自:http://www.hoohack.me/2016/02/12/phps-source-code-for-php-developers-part3-variables-ch...
摘要:小駝峰法大駝峰法匈牙利命名法變量名屬性類型對象描述。是一種弱類型語言,變量在使用之前并不需要聲明類型,且同一變量可以保存多種不同類型的數據。另外,在函數內部創建的靜態變量是無法在函數外部使用的。 變量標識符 標識符即是變量的名稱,PHP 中關于變量的標識符有以下規則: 由任意字母、數字、下劃線組成,但不能以數字開頭 嚴格區分大小寫 為了科學規范標識符,主要有以下幾種流行的命名方式:...
摘要:但是在以來,在面向對象中,為方法帶來了類型約束,然而這些都非常的雞肋,從文檔上可以看到。支持對象接口支持數組支持匿名函數類型約束不能用于標量類型如或。它的運作方式,是在中設置一個標志位,讓函數調用和返回類型檢查符合類型約束。 起點 眾所周知,PHP 是弱類型語言,與其他強類型語言項目,在這方面會有很多的坑,但是已經發展到 PHP 7 之后,PHP 也對類型約束有了所指,并且在許多流行框...
摘要:學習第一課變量注釋輸出上圖是一段超級簡單的輸出的代碼,是不是超級簡單呢今天文章講的就是這幾行代碼的知識。變量可以通過變量名訪問。用來定義聲明一個變量。有返回值,總是返回。輸出格式化的字符串,有返回值,返回值是輸出的字符串的長度。 來一波 Hello World,各位看官先感受下。PHP學習第一課:變量、注釋、輸出上圖是一段超級簡單的輸出 Hello World 的代碼,是不是超級簡單呢...
摘要:對于來說,變量有全局變量和局部變量之分那么,他們都是存儲到一個哈希表內了么其實不是的,變量存儲也有作用域的概念。 上次跟大家講了垃圾回收機制后,有些小伙伴對底層原理比較感興趣,私信問我了一些關于變量的相關知識,既然大家對變量比較感興趣,那么這次我們來系統的講一下變量的底層原理 變量結構 首先,我們還是先擺上我們的zval結構體,即php所有變量都會以zval結構體的形式實現 struc...
閱讀 2762·2021-11-22 13:54
閱讀 2697·2021-10-14 09:42
閱讀 4038·2021-09-28 09:47
閱讀 2171·2021-09-03 10:28
閱讀 1215·2021-07-26 23:38
閱讀 2566·2019-08-30 15:54
閱讀 2645·2019-08-29 16:35
閱讀 1436·2019-08-29 15:42