PHP支持8種基本的數(shù)據(jù)類型
四種標量類型:
+boolean(布爾型)
+nteger(整型)
+float(浮點型鼻忠,也叫double)
+string(字符串)
兩種復(fù)合類型:
+array(數(shù)組)
+object(對象)
最后是兩種特殊類型:
+resource(資源)
+NULL(NULL)
為了確保代碼的易讀性, 本手冊還介紹了一些偽類型:
+mixed
+number
+callback
以及偽變量$......
可能還會讀到一些關(guān)于“雙精度(double)”類型的參考励翼。實際上double和float是相同的,由于一些歷史的原因颗品,這兩個名稱同時存在手形。
變量的類型通常不是由程序猿設(shè)定的,確切的說掐隐,是由PHP根據(jù)該變量使用的上下文在運行時決定的。
note:如果想查看某個表達式的值和類型,用var_dump()虑省。
如果只是想得到一個易讀懂的類型的表達方式用于調(diào)試匿刮,用gettype()。要查看某個類型探颈,不要用 gettype()熟丸,而用is_type函數(shù)。以下是一些范例:
<?php
$a_bool = TRUE;
$a_str = "foo";
$a_str2 = "foo";
$an_int = 12;
echo gettype($a_bool); //prints out: boolean
echo gettype($a_str); //prints out: string
// If this is an integer, increment it by four
if (is_int($an_int)){
$an_int += 4;
}
// If $bool is a string, print it out
// (does not print out anything)
if (is_string($a_bool)){
echo "String: $a_bool";
}
?>
如果要將一個變量強制轉(zhuǎn)換為某類型伪节,可以對其使用強制轉(zhuǎn)換或者settype()函數(shù)光羞。
PHP 布爾類型
這是最簡單的類型。boolean表達了真值怀大,可以為TRUE或FALSE纱兑。
NOTE:布爾類型是 PHP 4 引進的。
語法
要指定一個布爾值化借,使用關(guān)鍵字TRUE或FALSE潜慎。兩個都不區(qū)分大小寫。
<?php
$foo = True;
?>
通常你用某些運算符返回boolean值蓖康,并將其傳遞給控制流程铐炫。
<?php
// = 是一個操作符,它檢測兩個變量是否相等蒜焊,并返回一個布爾值
if($action = "show_version"){
echo "The version is 1.23";
}
//這樣做是不必要的...
if($show_separators == TRUE){
echo "<hr>";
}
//...因為可以使用下面這種簡單的方式:
if($show_separators){
echo "<hr>";
}
?>
轉(zhuǎn)換為布爾值
要明確的將一個值轉(zhuǎn)換成boolean倒信,用(bool)或者(boolean)來強制轉(zhuǎn)換。但是很多情況下不需要用強制轉(zhuǎn)換泳梆,因為當(dāng)運算符鳖悠,函數(shù)或者流程控制結(jié)構(gòu)需要一個boolean參數(shù)時,該值會被自動轉(zhuǎn)換优妙。
當(dāng)轉(zhuǎn)換為boolean時竞穷,以下值被認為是FALSE:
+the布爾值FALSE自身
+the整型值0(零)
+the浮點型值0.0(零)
+空字符串,以及字符串"0"
+不包括任何元素的數(shù)組
+不包括任何成員變量的對象(僅PHP4.0適用)
+特殊類型NULL(包括尚未設(shè)定的變量)
+從沒有任何標記(tags)的XML文檔生成的SimpleXML對象
所有其他值都被認為是TRUE(包括任何資源)鳞溉。
Warning
-1和其他非零值(不論正負)一樣,被認為是TRUE鼠哥!
PHP整型
語法
整型值可以使用十進制熟菲,十六進制或八進制表示,前面可以加上可選的符號(-或者+)朴恳。
八進制表示數(shù)字前必須加上0(零)抄罕,十六進制表示數(shù)字前必須加上0x。
Example #1 整數(shù)文字表達
<?php
$a = 1234; //十進制數(shù)
$a = -123; //負數(shù)
$a = 0123; //八進制數(shù)
$a = 0x1A; //十六進制數(shù)
?>
整數(shù)溢出
如果給定的一個數(shù)超出了integer的范圍于颖,將會解釋為float呆贿。同樣如果執(zhí)行的運算結(jié)果超出了integer范圍,也會返回float。
<?php
$large_number = 2147483647;
var_dump($large_number);
//輸出為:int(2147483647)
$large_number = 2147483648;
var_dump($large_number);
//輸出為:float(2147483648)
//同樣也適用于十六進制表示的整數(shù):從 2^31 到 2^32-1:
var_dump(0xffffffff);
//輸出float(4294967295)
//不適用于大于2^32-1 的十六進制表示的數(shù):
var_dump(0x100000000);
//輸出:int(2147483647)
$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number);
// 輸出: float(50000000000)
?>
轉(zhuǎn)換為整型
要明確的將一個值轉(zhuǎn)換為integer做入,用(int)或(integer)強制轉(zhuǎn)換冒晰。不過大多數(shù)情況下都不需要強制轉(zhuǎn)換,因為當(dāng)運算符竟块,函數(shù)或流程控制需要一個integer參數(shù)時壶运,值會自動轉(zhuǎn)換。還可以通過函數(shù)intval()來將一個值轉(zhuǎn)換成整型浪秘。
從布爾值轉(zhuǎn)換
FALSE將產(chǎn)生出0(零)蒋情, TRUE將產(chǎn)生出1(一)
從浮點數(shù)轉(zhuǎn)換
當(dāng)從浮點數(shù)轉(zhuǎn)換成整數(shù)時,將向零取整耸携。
如果浮點數(shù)超出了整數(shù)范圍(通常為 +/- 2.15e+9 = 2^31)棵癣,則結(jié)果不確定,因為沒有足夠的精度使浮點數(shù)給出一個確切的整數(shù)結(jié)果夺衍。在此情況下沒有警告狈谊,甚至沒有任何通知!
Warning
決不要將未知的分數(shù)強制轉(zhuǎn)換為integer刷后,這樣有時會導(dǎo)致不可預(yù)料的結(jié)果的畴。
PHP浮點型
浮點數(shù)(也叫浮點數(shù),雙精度或?qū)崝?shù))可以用以下任一語法定義:
<?php
$a = 1.234;
$a = 1.2e3;
$c = 7E-10;
?>
PHP字符串
語法
一個字符串通過下面的4種方法來定義:
+單引號
+雙引號
+heredoc語法結(jié)構(gòu)
+nowdoc語法結(jié)構(gòu)(自PHP5.3.0以后)
單引號
定義一個字符串的最簡單的方法是用單引號把它包圍起來(標點符號 ')尝胆。
如果想要輸出一個單引號丧裁,需在它的前面加個反斜線()。在單引號前或在字符串的結(jié)尾處想要輸出反斜線含衔,輸入兩條()煎娇。注意,如果在任何其他的字符前加了反斜線贪染,反斜線將會被直接輸出缓呛。
Note: 不像雙引號和heredoc語法結(jié)構(gòu), 在單引號字符串中的變量和特殊含義的字符將不會被替換杭隙。
雙引號
如果字符串是包圍在雙引號(")中哟绊,PHP將對一些特殊的字符進行解析
Heredoc結(jié)構(gòu)
第三種定義字符串的方法是用heredoc句法結(jié)構(gòu):<<<。在該提示符后面痰憎,要定義個標識符票髓,然后是一個新行。接下來是字符串本身铣耘,最后要用前面定義的標識符作為結(jié)束標志洽沟。
結(jié)束時所引用的標識符必須在一行的開始位置,而且蜗细,標識符的命名也要像其他標簽一樣遵守PHP的規(guī)則:只能包含字母裆操、數(shù)字和下劃線,并且不能用數(shù)字和下劃線作為開頭。
Warning
要注意的是結(jié)束標識符這行除了可能有一個分號(;)外踪区,絕對不能包括其他字符昆烁。這意味著標識符不能縮進,分號的前后也不能有任何空白或tabs朽缴。更重要的是結(jié)束標識符的前面必須是個被本地操作系統(tǒng)認可的新行標簽善玫。
如果不遵守該規(guī)則導(dǎo)致結(jié)束標簽不“干凈”,PHP將認為它不是結(jié)束標識符而繼續(xù)尋找密强。如果在文件結(jié)束前也沒有找到一個正確的結(jié)束標識符茅郎,PHP將會在最后一行產(chǎn)生一個句法錯誤。
Heredocs結(jié)構(gòu)不能用來初始化class或渤,而從PHP5.3以后系冗,則該限制只能用在包含變量的情況下。
Example #1 非法的示例
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
Heredoc結(jié)構(gòu)就象是沒有使用雙引號的雙引號字符串薪鹦, 這就是說在heredoc結(jié)構(gòu)中引號不用被替換掌敬,但是上文中列出的字符 (等)也可使用。 變量將被替換池磁,但在heredoc結(jié)構(gòu)中字符串表達復(fù)雜變量時奔害,要格外小 心。
Example #2 Heredoc結(jié)構(gòu)的字符串示例
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
/*含有變量的更復(fù)雜示例*/
class foo{
var $foo;
var $bar;
function foo(){
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<EOTMy name is "$name". I am printing some $foo>foo.
Now, I am printing some {$foo>bar[1]}.
This should print a capital 'A': x41EOT;
?>
以上會輸出:
My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A
也可以把Heredoc結(jié)構(gòu)用在函數(shù)參數(shù)中來傳輸數(shù)據(jù):
Example #3 Heredoc結(jié)構(gòu)在參數(shù)中的示例
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
在PHP5.3.0以后地熄,也可以用Heredoc結(jié)構(gòu)來初始化靜態(tài)變量和類的屬性和常量:
Example #4 使用Heredoc結(jié)構(gòu)來初始化靜態(tài)值
<?php
//靜態(tài)變量
function foo(){
static $bar = <<<LABEL
Nothing in there...
LABEL;
}
//類的常量华临、屬性
class foo{
const BAR = <<<FOOBAR
Constant example
FOOBAR;
public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>
在PHP5.3.0中還在Heredoc結(jié)構(gòu)中用雙引號來聲明標識符:
Example #5 在heredoc結(jié)構(gòu)中使用雙引號
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>
NOTE:
PHP4才引入了Heredoc結(jié)構(gòu)。
Nowdoc結(jié)構(gòu)
就像heredoc結(jié)構(gòu)類似于雙引號字符串端考,Nowdoc結(jié)構(gòu)是類似于單引號字符串的雅潭。Nowdoc結(jié)構(gòu)很像heredoc結(jié)構(gòu),但是nowdoc不進行解析操作却特。這種結(jié)構(gòu)很適合用在不需要進行轉(zhuǎn)義的PHP代碼和其他大段文本扶供。與SGML的<![CDATA[ ]]>結(jié)構(gòu)是用來聲明大段的不用解析的文本類似,nowdoc結(jié)構(gòu)也有相同的特征裂明。
一個nowdoc結(jié)構(gòu)也用和heredocs結(jié)構(gòu)一樣的標記<<<椿浓,但是跟在后面的標識符要用單引號括起來,就像<<<'EOT'這樣。heredocs結(jié)構(gòu)的所有規(guī)則也同樣適用于nowdoc結(jié)構(gòu),尤其是結(jié)束標志符的規(guī)則扼菠。
Example #6 Nowdoc結(jié)構(gòu)字符串示例
<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
/* 含有變量的更復(fù)雜的示例 */
class foo{
public $foo;
public $bar;
function foo() {
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
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;
?>
以上例子會輸出:
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
Note:
不象 heredocs結(jié)構(gòu),nowdocs結(jié)構(gòu)可以用在任意的靜態(tài)數(shù)據(jù)環(huán)境中,最典型的示例是用來初始化類的屬性或常量:
###Example #7 表態(tài)數(shù)據(jù)的示例
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;}
?>
Note:
Nowdoc結(jié)構(gòu)是在PHP 5.3.0中加入的唧垦。
變量解析
當(dāng)字符串用雙引號或heredoc結(jié)構(gòu)定義時捅儒,其中的變量將會被解析。
這里共有兩種語法規(guī)則:一種簡單規(guī)則,一種復(fù)雜規(guī)則巧还。簡單的句法規(guī)則是最常用和最方便的鞭莽, 它可以用最少的代碼在一個字符串中加入變量, 數(shù)組 值麸祷,或 對象屬性澎怒。
復(fù)雜的句法規(guī)則是在PHP4以后加入的,被花括號包圍的表達式是其明顯標記阶牍。
簡單句法規(guī)則
當(dāng)PHP解析器遇到一個美元符號 ($) 喷面, 它會和其它很多解析器一樣,去盡量形成一個合法的變量名走孽【灞玻可以用花括 號來明確變量名的界線。
<?php
$beer = 'Heineken';
echo "$beer's taste is great"; //有效磕瓷;單引號"'"是非法的變量名組成元素
echo "He drank some $beers"; //無效;字母s是有效的變量名組成元素盒齿,但是這里的變量是$beer
echo "He drank some ${beer}s"; // 有效
echo "He drank some {$beer}s"; // 有效
類似的,一個 數(shù)組 索引或一個 對象 屬性也可被解析困食。數(shù)組索引要用方括號 (]) 來表示邊際边翁, 對象屬性則是和上述的變量規(guī)則相同。
<?php
// 下面的例子是在字符串中引用數(shù)組
// 當(dāng)數(shù)組處于字符串外部時硕盹,要把數(shù)組的值用括號括起來且不要用花括號{ }
// 顯示所有錯誤
error_reporting(E_ALL);
$fruits = array('strawberry' => 'red', 'banana' => 'yellow');
// 有效符匾;但是注意在字符串外面不能這樣引用數(shù)組echo "A banana is $fruits[banana].";
// 有效
echo "A banana is {$fruits['banana']}.";
// 有效,但是PHP會先尋找常量banana
echo "A banana is {$fruits[banana]}.";
// 無效莱睁,要用花括號待讳,這里將會產(chǎn)生一個解析錯誤echo "A banana is $fruits['banana'].";
// 有效
echo "A banana is " . $fruits['banana'] . ".";
// 有效
echo "This square is $square->width meters broad.";
// 無效,解決方法見復(fù)雜結(jié)構(gòu)
echo "This square is $square->width00 centimeters broad.";
?>
復(fù)雜句法規(guī)則
復(fù)雜句法規(guī)則不是結(jié)構(gòu)復(fù)雜而命名仰剿,而是因為它可以使用復(fù)雜的表達式创淡。
任何想用在字符串中標量變量,數(shù)組變量或?qū)ο髮傩远伎墒褂眠@種方法南吮。 只需簡單地像在字符串以外的地方那樣寫出表達式琳彩, 然后用花括號 { 和 }把它括起來。 由于 { 無法被轉(zhuǎn)義部凑,只有 $要緊挨著 {才會被認出來露乏,可以用 {$ 來表達 {$。下面的示例可以更好的解釋:
<?php
// 顯示所有錯誤error_reporting(E_ALL);
$great = 'fantastic';
// 無效涂邀,輸出:?This?is?{?fantastic}
echo "This is { $great}";
// 有效瘟仿,輸出: This is fantastic
echo "This is {$great}";
echo "This is ${great}";
// 有效
echo "This square is {$square->width}00 centimeters broad.";
// 有效
echo "This works: {$arr[4][3]}";
// 這是錯誤的表達式,因為就象$foo[bar] 的格式不能在字符串以外的地方使用一樣比勉。
// 換句話說劳较,只有在PHP能找到常量foo 的前提下才會正常工作驹止;這里會產(chǎn)生一個E_NOTICE?(undefined?constant)級別的錯誤。
echo "This is wrong: {$arr[foo][3]}";
// 有效观蜗,當(dāng)在字符串中使用多重數(shù)組時臊恋,一定要用括號將它括起來echo "This works: {$arr['foo'][3]}";
// 有效
echo "This works: " . $arr['foo'][3];
echo "This works too: {$obj->values[3]->name}";
echo "This is the value of the var named $name: {${$name}}";
echo "This is the value of the var named by the return value of getName():{${getName()}}";
echo "This is the value of the var named by the return value of$object->getName(): {${$object->getName()}}";
// 無效,輸出: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>
也可以在字符串中用變量來調(diào)用類的屬性墓捻。
<?php
class foo {
var $bar = 'I am bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar} ";
echo "{$foo->$baz[1]} ";
?>
以上例程會輸出:
I am bar.
I am bar.