摘要:獲取變量的類(lèi)型,使用函數(shù)。要檢驗(yàn)?zāi)硞€(gè)類(lèi)型,可以使用函數(shù),如是在整形是在浮點(diǎn)型是在字符串如果需要將一個(gè)變量強(qiáng)制轉(zhuǎn)換為某類(lèi)型,可以對(duì)其使用強(qiáng)制轉(zhuǎn)換或者函數(shù)。自起,此限制僅對(duì)包含變量時(shí)有效。
簡(jiǎn)介
PHP支持9種原始數(shù)據(jù)類(lèi)型。
4種標(biāo)量類(lèi)型:
boolean布爾型
integer 整形
float 浮點(diǎn)型(也稱(chēng)作double)
string 字符串
3種復(fù)合類(lèi)型:
array 數(shù)組
object 對(duì)象
callable 可調(diào)用
2種特殊類(lèi)型
resource 資源
null 無(wú)類(lèi)型
為了確保代碼的易讀性,我們通常會(huì)使用一些偽類(lèi)型:
mixed 混合類(lèi)型
number 數(shù)字類(lèi)型
callback 回調(diào)類(lèi)型(又稱(chēng)為callable)
array|object 數(shù)組|對(duì)象類(lèi)型
void 無(wú)類(lèi)型
變量的類(lèi)型不是程序員設(shè)定,是由PHP根據(jù)該變量使用的上下文在運(yùn)行時(shí)決定的。
與變量類(lèi)型有關(guān)的常用函數(shù)
如果想查看某個(gè)表達(dá)式的值和類(lèi)型,使用var_dump()函數(shù)。
獲取變量的類(lèi)型,使用gettype()函數(shù)。
要檢驗(yàn)?zāi)硞€(gè)類(lèi)型,可以使用is_type函數(shù),如:
如果需要將一個(gè)變量強(qiáng)制轉(zhuǎn)換為某類(lèi)型,可以對(duì)其使用強(qiáng)制轉(zhuǎn)換或者settype()函數(shù)。
接下來(lái)我們先來(lái)看看四種標(biāo)量類(lèi)型 Boolean 布爾類(lèi)型這是最簡(jiǎn)單的類(lèi)型。boolean表達(dá)了真值,可以為TRUE 或 FALSE
語(yǔ)法要指定一個(gè)布爾值,使用常量TRUE 或 FALSE。(不區(qū)分大小寫(xiě))如:
通常運(yùn)算符所返回的boolean值結(jié)果會(huì)被傳遞給控制流程。
轉(zhuǎn)換為布爾值要明確的將一個(gè)值轉(zhuǎn)換成boolean,用(bool)或者(boolean)來(lái)強(qiáng)制轉(zhuǎn)換,但是很多情況下不需要用強(qiáng)制轉(zhuǎn)換,因?yàn)楫?dāng)運(yùn)算符,函數(shù)或者流程控制結(jié)構(gòu)需要一個(gè) boolean 參數(shù)時(shí),該值會(huì)被自動(dòng)轉(zhuǎn)換。
當(dāng)轉(zhuǎn)換為 boolean 時(shí),以下值被認(rèn)為是 FALSE:
布爾值FALSE本身
整型值 0
浮點(diǎn)型 0.0
空字符串,以及字符串"0"
不包括任何元素的數(shù)組
特殊類(lèi)型NULL(包括尚未賦值的變量)
從空標(biāo)記生成的SimpleXML對(duì)象
所有其它值都被認(rèn)為是TRUE(包括任何資源和NAN)。
Integer 整型integer 是集合 ? = {..., -2, -1, 0, 1, 2, ...} 中的某個(gè)數(shù)。
語(yǔ)法整型值可以使用十進(jìn)制,十六進(jìn)制,八進(jìn)制或二進(jìn)制表示,前面可以加上可選的符號(hào)(- 或者 +)。
要使用八進(jìn)制表達(dá),數(shù)字前必須加上 0(零)。要使用十六進(jìn)制表達(dá),數(shù)字前必須加上 0x。要使用二進(jìn)制表達(dá),數(shù)字前必須加上 0b。
Example整型數(shù)的字長(zhǎng)和平臺(tái)有關(guān),盡管通常最大值是大約二十億(32 位有符號(hào))。64 位平臺(tái)下的最大值通常是大約 9E18,除了 Windows 下 PHP 7 以前的版本,總是 32 位的。 PHP 不支持無(wú)符號(hào)的 integer。Integer 值的字長(zhǎng)可以用常量 PHP_INT_SIZE來(lái)表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 來(lái)表示,最小值可以在 PHP 7.0.0 及以后的版本中用常量 PHP_INT_MIN 表示。
整數(shù)溢出如果給定的一個(gè)數(shù)超出了 integer 的范圍,將會(huì)被解釋為 float。同樣如果執(zhí)行的運(yùn)算結(jié)果超出了 integer 范圍,也會(huì)返回 float。
PHP 中沒(méi)有整除的運(yùn)算符。1/2 產(chǎn)生出 float 0.5。 值可以舍棄小數(shù)部分,強(qiáng)制轉(zhuǎn)換為 integer,或者使用 round() 函數(shù)可以更好地進(jìn)行四舍五入。
轉(zhuǎn)換為整型要明確地將一個(gè)值轉(zhuǎn)換為 integer,用 (int) 或 (integer) 強(qiáng)制轉(zhuǎn)換。不過(guò)大多數(shù)情況下都不需要強(qiáng)制轉(zhuǎn)換,因?yàn)楫?dāng)運(yùn)算符,函數(shù)或流程控制需要一個(gè) integer 參數(shù)時(shí),值會(huì)自動(dòng)轉(zhuǎn)換。還可以通過(guò)函數(shù) intval() 來(lái)將一個(gè)值轉(zhuǎn)換成整型。
思考下以下兩種流程控制的區(qū)別:
從資源類(lèi)型轉(zhuǎn)換
將 resource 轉(zhuǎn)換成 integer 時(shí), 結(jié)果會(huì)是 PHP 運(yùn)行時(shí)為 resource 分配的唯一資源號(hào)。
從浮點(diǎn)型轉(zhuǎn)換當(dāng)從浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù)時(shí),將向下取整。
如果浮點(diǎn)數(shù)超出了整數(shù)范圍(32 位平臺(tái)下通常為 +/- 2.15e+9 = 2^31,64 位平臺(tái)下,除了 Windows,通常為 +/- 9.22e+18 = 2^63),則結(jié)果為未定義,因?yàn)闆](méi)有足夠的精度給出一個(gè)確切的整數(shù)結(jié)果。在此情況下沒(méi)有警告,甚至沒(méi)有任何通知!
PHP 7.0.0 起,NaN 和 Infinity 在轉(zhuǎn)換成 integer 時(shí),不再是 undefined 或者依賴(lài)于平臺(tái),而是都會(huì)變成零。
Warning絕不要將未知的分?jǐn)?shù)強(qiáng)制轉(zhuǎn)換為 integer,這樣有時(shí)會(huì)導(dǎo)致不可預(yù)料的結(jié)果。
Float 浮點(diǎn)型
浮點(diǎn)型(也叫浮點(diǎn)數(shù) float,雙精度數(shù) double 或?qū)崝?shù) real)可以用以下任一語(yǔ)法定義:
浮點(diǎn)數(shù)的字長(zhǎng)和平臺(tái)相關(guān),盡管通常最大值是 1.8e308 并具有 14 位十進(jìn)制數(shù)字的精度(64 位 IEEE 格式)
浮點(diǎn)數(shù)的精度浮點(diǎn)數(shù)的精度有限。盡管取決于系統(tǒng),PHP 通常使用 IEEE 754 雙精度格式,則由于取整而導(dǎo)致的最大相對(duì)誤差為 1.11e-16。非基本數(shù)學(xué)運(yùn)算可能會(huì)給出更大誤差,并且要考慮到進(jìn)行復(fù)合運(yùn)算時(shí)的誤差傳遞。
此外,以十進(jìn)制能夠精確表示的有理數(shù)如 0.1 或 0.7,無(wú)論有多少尾數(shù)都不能被內(nèi)部所使用的二進(jìn)制精確表示,因此不能在不丟失一點(diǎn)點(diǎn)精度的情況下轉(zhuǎn)換為二進(jìn)制的格式。這就會(huì)造成混亂的結(jié)果:例如,floor((0.1+0.7)*10) 通常會(huì)返回 7 而不是預(yù)期中的 8,因?yàn)樵摻Y(jié)果內(nèi)部的表示其實(shí)是類(lèi)似 7.9999999999999991118...。
所以永遠(yuǎn)不要相信浮點(diǎn)數(shù)結(jié)果精確到了最后一位,也永遠(yuǎn)不要比較兩個(gè)浮點(diǎn)數(shù)是否相等。如果確實(shí)需要更高的精度,應(yīng)該使用任意精度數(shù)學(xué)函數(shù)或者 gmp 函數(shù)。
比較浮點(diǎn)數(shù)如上述警告信息所言,由于內(nèi)部表達(dá)方式的原因,比較兩個(gè)浮點(diǎn)數(shù)是否相等是有問(wèn)題的。不過(guò)還是有迂回的方法來(lái)比較浮點(diǎn)數(shù)值的。
要測(cè)試浮點(diǎn)數(shù)是否相等,要使用一個(gè)僅比該數(shù)值大一丁點(diǎn)的最小誤差值。該值也被稱(chēng)為機(jī)器極小值(epsilon)或最小單元取整數(shù),是計(jì)算中所能接受的最小的差別值。
$a 和 $b 在小數(shù)點(diǎn)后五位精度內(nèi)都是相等的。
NaN
某些數(shù)學(xué)運(yùn)算會(huì)產(chǎn)生一個(gè)由常量 NAN (not a number) 所代表的結(jié)果。此結(jié)果代表著一個(gè)在浮點(diǎn)數(shù)運(yùn)算中未定義或不可表述的值。任何拿此值與其它任何值(除了 TRUE)進(jìn)行的松散或嚴(yán)格比較的結(jié)果都是 FALSE。
由于 NAN 代表著任何不同值,不應(yīng)拿 NAN 去和其它值進(jìn)行比較,包括其自身,應(yīng)該用 is_nan() 來(lái)檢查。
String 字符串一個(gè)字符串 string 就是由一系列的字符組成,其中每個(gè)字符等同于一個(gè)字節(jié)。這意味著 PHP 只能支持 256 的字符集,因此不支持 Unicode 。
分析一下:
1 Byte = 8 bit 由于1個(gè)字節(jié)存儲(chǔ)一個(gè)字符,那么1字節(jié)所能存儲(chǔ)字符的可能性為:2^8=256語(yǔ)法
一個(gè)字符串可以用 4 種方式表達(dá):
單引號(hào)
雙引號(hào)
heredoc 語(yǔ)法結(jié)構(gòu)
nowdoc 語(yǔ)法結(jié)構(gòu)
單引號(hào)定義一個(gè)字符串的最簡(jiǎn)單的方法是用單引號(hào)把它包圍起來(lái)(字符 ")。
要表達(dá)一個(gè)單引號(hào)自身,需在它的前面加個(gè)反斜線(xiàn)()來(lái)轉(zhuǎn)義。要表達(dá)一個(gè)反斜線(xiàn)自身,則用兩個(gè)反斜線(xiàn)()。其它任何方式的反斜線(xiàn)都會(huì)被當(dāng)成反斜線(xiàn)本身:也就是說(shuō)如果想使用其它轉(zhuǎn)義序列例如 r 或者 n,并不代表任何特殊含義,就單純是這兩個(gè)字符本身。
不像雙引號(hào)和 heredoc 語(yǔ)法結(jié)構(gòu),在單引號(hào)字符串中的變量和特殊字符的轉(zhuǎn)義序列將不會(huì)被替換。
雙引號(hào)果字符串是包圍在雙引號(hào)(")中, PHP 將對(duì)一些特殊的字符進(jìn)行解析:
序列 | 含義 |
---|---|
n | 換行(ASCII 字符集中的 LF 或 0x0A (10)) |
r | 回車(chē)(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 | 換頁(yè)(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起) |
反斜線(xiàn) | |
$ | 美元標(biāo)記 |
" | 雙引號(hào) |
[0-7]{1,3} | 符合該正則表達(dá)式序列的是一個(gè)以八進(jìn)制方式來(lái)表達(dá)的字符 |
x[0-9A-Fa-f]{1,2} | 符合該正則表達(dá)式序列的是一個(gè)以十六進(jìn)制方式來(lái)表達(dá)的字符 |
和單引號(hào)字符串一樣,轉(zhuǎn)義任何其它字符都會(huì)導(dǎo)致反斜線(xiàn)被顯示出來(lái)。
用雙引號(hào)定義的字符串最重要的特征是變量會(huì)被解析。
第三種表達(dá)字符串的方法是用 heredoc 句法結(jié)構(gòu):<<<。在該運(yùn)算符之后要提供一個(gè)標(biāo)識(shí)符,然后換行。接下來(lái)是字符串 string 本身,最后要用前面定義的標(biāo)識(shí)符作為結(jié)束標(biāo)志。
結(jié)束時(shí)所引用的標(biāo)識(shí)符必須在該行的第一列,而且,標(biāo)識(shí)符的命名也要像其它標(biāo)簽一樣遵守 PHP 的規(guī)則:只能包含字母、數(shù)字和下劃線(xiàn),并且必須以字母和下劃線(xiàn)作為開(kāi)頭。
Warning要注意的是結(jié)束標(biāo)識(shí)符這行除了可能有一個(gè)分號(hào)(;)外,絕對(duì)不能包含其它字符。這意味著標(biāo)識(shí)符不能縮進(jìn),分號(hào)的前后也不能有任何空白或制表符。更重要的是結(jié)束標(biāo)識(shí)符的前面必須是個(gè)被本地操作系統(tǒng)認(rèn)可的換行,比如在 UNIX 和 Mac OS X 系統(tǒng)中是 n,而結(jié)束定界符(可能其后有個(gè)分號(hào))之后也必須緊跟一個(gè)換行。
如果不遵守該規(guī)則導(dǎo)致結(jié)束標(biāo)識(shí)不“干凈”,PHP 將認(rèn)為它不是結(jié)束標(biāo)識(shí)符而繼續(xù)尋找。如果在文件結(jié)束前也沒(méi)有找到一個(gè)正確的結(jié)束標(biāo)識(shí)符,PHP 將會(huì)在最后一行產(chǎn)生一個(gè)解析錯(cuò)誤。
Heredocs 結(jié)構(gòu)不能用來(lái)初始化類(lèi)的屬性。自 PHP 5.3 起,此限制僅對(duì) heredoc 包含變量時(shí)有效。
Heredoc 結(jié)構(gòu)就象是沒(méi)有使用雙引號(hào)的雙引號(hào)字符串,這就是說(shuō)在 heredoc 結(jié)構(gòu)中單引號(hào)不用被轉(zhuǎn)義,但是上文中列出的轉(zhuǎn)義序列還可以使用。變量將被替換,但在 heredoc 結(jié)構(gòu)中含有復(fù)雜的變量時(shí)要格外小心。
在 PHP 5.3.0 以后,也可以用 Heredoc 結(jié)構(gòu)來(lái)初始化靜態(tài)變量和類(lèi)的屬性和常量。
自 PHP 5.3.0 起還可以在 Heredoc 結(jié)構(gòu)中用雙引號(hào)來(lái)聲明標(biāo)識(shí)符:
Nowdoc 結(jié)構(gòu)
就像 heredoc 結(jié)構(gòu)類(lèi)似于雙引號(hào)字符串,Nowdoc 結(jié)構(gòu)是類(lèi)似于單引號(hào)字符串的。Nowdoc 結(jié)構(gòu)很象 heredoc 結(jié)構(gòu),但是 nowdoc 中不進(jìn)行解析操作。這種結(jié)構(gòu)很適合用于嵌入 PHP 代碼或其它大段文本而無(wú)需對(duì)其中的特殊字符進(jìn)行轉(zhuǎn)義。與 SGML 的 結(jié)構(gòu)是用來(lái)聲明大段的不用解析的文本類(lèi)似,nowdoc 結(jié)構(gòu)也有相同的特征。
一個(gè) nowdoc 結(jié)構(gòu)也用和 heredocs 結(jié)構(gòu)一樣的標(biāo)記 <<<, 但是跟在后面的標(biāo)識(shí)符要用單引號(hào)括起來(lái),即 <<<"EOT"。Heredoc 結(jié)構(gòu)的所有規(guī)則也同樣適用于 nowdoc 結(jié)構(gòu),尤其是結(jié)束標(biāo)識(shí)符的規(guī)則。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/28405.html
摘要:執(zhí)行原理是一門(mén)應(yīng)用非常簡(jiǎn)單,開(kāi)發(fā)效率極高的一門(mén)語(yǔ)言,其弱類(lèi)型的變量能省去程序員大量的定義變量類(lèi)型轉(zhuǎn)換等的時(shí)間和精力。程序最終被翻譯為一組處理函數(shù)的順序執(zhí)行。只有減為時(shí)才會(huì)真正執(zhí)行銷(xiāo)毀操作。 PHP執(zhí)行原理 php是一門(mén)應(yīng)用非常簡(jiǎn)單,開(kāi)發(fā)效率極高的一門(mén)語(yǔ)言,其弱類(lèi)型的變量能省去程序員大量的定義變量、類(lèi)型轉(zhuǎn)換等的時(shí)間和精力。它是一種適用于web開(kāi)發(fā)的動(dòng)態(tài)語(yǔ)言。 1. php設(shè)計(jì)的原理和特點(diǎn)...
摘要:文章來(lái)自原文在給開(kāi)發(fā)者的源碼系列的第三篇文章,我們打算擴(kuò)展上一篇文章來(lái)幫助理解內(nèi)部是怎么工作的。進(jìn)入在的核心代碼中,變量被稱(chēng)為。要轉(zhuǎn)換一個(gè)為值,就調(diào)用函數(shù)。有了這個(gè)東西,我們可以看到函數(shù)馬上調(diào)用函數(shù)。 文章來(lái)自:http://www.hoohack.me/2016/02/12/phps-source-code-for-php-developers-part3-variables-ch...
摘要:小駝峰法大駝峰法匈牙利命名法變量名屬性類(lèi)型對(duì)象描述。是一種弱類(lèi)型語(yǔ)言,變量在使用之前并不需要聲明類(lèi)型,且同一變量可以保存多種不同類(lèi)型的數(shù)據(jù)。另外,在函數(shù)內(nèi)部創(chuàng)建的靜態(tài)變量是無(wú)法在函數(shù)外部使用的。 變量標(biāo)識(shí)符 標(biāo)識(shí)符即是變量的名稱(chēng),PHP 中關(guān)于變量的標(biāo)識(shí)符有以下規(guī)則: 由任意字母、數(shù)字、下劃線(xiàn)組成,但不能以數(shù)字開(kāi)頭 嚴(yán)格區(qū)分大小寫(xiě) 為了科學(xué)規(guī)范標(biāo)識(shí)符,主要有以下幾種流行的命名方式:...
摘要:但是在以來(lái),在面向?qū)ο笾校瑸榉椒◣?lái)了類(lèi)型約束,然而這些都非常的雞肋,從文檔上可以看到。支持對(duì)象接口支持?jǐn)?shù)組支持匿名函數(shù)類(lèi)型約束不能用于標(biāo)量類(lèi)型如或。它的運(yùn)作方式,是在中設(shè)置一個(gè)標(biāo)志位,讓函數(shù)調(diào)用和返回類(lèi)型檢查符合類(lèi)型約束。 起點(diǎn) 眾所周知,PHP 是弱類(lèi)型語(yǔ)言,與其他強(qiáng)類(lèi)型語(yǔ)言項(xiàng)目,在這方面會(huì)有很多的坑,但是已經(jīng)發(fā)展到 PHP 7 之后,PHP 也對(duì)類(lèi)型約束有了所指,并且在許多流行框...
摘要:學(xué)習(xí)第一課變量注釋輸出上圖是一段超級(jí)簡(jiǎn)單的輸出的代碼,是不是超級(jí)簡(jiǎn)單呢今天文章講的就是這幾行代碼的知識(shí)。變量可以通過(guò)變量名訪(fǎng)問(wèn)。用來(lái)定義聲明一個(gè)變量。有返回值,總是返回。輸出格式化的字符串,有返回值,返回值是輸出的字符串的長(zhǎng)度。 來(lái)一波 Hello World,各位看官先感受下。PHP學(xué)習(xí)第一課:變量、注釋、輸出上圖是一段超級(jí)簡(jiǎn)單的輸出 Hello World 的代碼,是不是超級(jí)簡(jiǎn)單呢...
摘要:對(duì)于來(lái)說(shuō),變量有全局變量和局部變量之分那么,他們都是存儲(chǔ)到一個(gè)哈希表內(nèi)了么其實(shí)不是的,變量存儲(chǔ)也有作用域的概念。 上次跟大家講了垃圾回收機(jī)制后,有些小伙伴對(duì)底層原理比較感興趣,私信問(wèn)我了一些關(guān)于變量的相關(guān)知識(shí),既然大家對(duì)變量比較感興趣,那么這次我們來(lái)系統(tǒng)的講一下變量的底層原理 變量結(jié)構(gòu) 首先,我們還是先擺上我們的zval結(jié)構(gòu)體,即php所有變量都會(huì)以zval結(jié)構(gòu)體的形式實(shí)現(xiàn) struc...
閱讀 2751·2021-11-22 13:54
閱讀 2688·2021-10-14 09:42
閱讀 3987·2021-09-28 09:47
閱讀 2162·2021-09-03 10:28
閱讀 1203·2021-07-26 23:38
閱讀 2557·2019-08-30 15:54
閱讀 2639·2019-08-29 16:35
閱讀 1426·2019-08-29 15:42