PHP支持8种基本的数据类型
四种标量类型:
+boolean(布尔型)
+nteger(整型)
+float(浮点型,也叫double)
+string(字符串)
两种复合类型:
+array(数组)
+object(对象)
最后是两种特殊类型:
+resource(资源)
+NULL(NULL)
为了确保代码的易读性, 本手册还介绍了一些伪类型:
+mixed
+number
+callback
以及伪变量$......
可能还会读到一些关于“双精度(double)”类型的参考。实际上double和float是相同的,由于一些历史的原因,这两个名称同时存在。
变量的类型通常不是由程序猿设定的,确切的说,是由PHP根据该变量使用的上下文在运行时决定的。
note:如果想查看某个表达式的值和类型,用var_dump()。
如果只是想得到一个易读懂的类型的表达方式用于调试,用gettype()。要查看某个类型,不要用 gettype(),而用is_type函数。以下是一些范例:
<?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";
}
?>
如果要将一个变量强制转换为某类型,可以对其使用强制转换或者settype()函数。
PHP 布尔类型
这是最简单的类型。boolean表达了真值,可以为TRUE或FALSE。
NOTE:布尔类型是 PHP 4 引进的。
语法
要指定一个布尔值,使用关键字TRUE或FALSE。两个都不区分大小写。
<?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>";
}
?>
转换为布尔值
要明确的将一个值转换成boolean,用(bool)或者(boolean)来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个boolean参数时,该值会被自动转换。
当转换为boolean时,以下值被认为是FALSE:
+the布尔值FALSE自身
+the整型值0(零)
+the浮点型值0.0(零)
+空字符串,以及字符串"0"
+不包括任何元素的数组
+不包括任何成员变量的对象(仅PHP4.0适用)
+特殊类型NULL(包括尚未设定的变量)
+从没有任何标记(tags)的XML文档生成的SimpleXML对象
所有其他值都被认为是TRUE(包括任何资源)。
Warning
-1和其他非零值(不论正负)一样,被认为是TRUE!
PHP整型
语法
整型值可以使用十进制,十六进制或八进制表示,前面可以加上可选的符号(-或者+)。
八进制表示数字前必须加上0(零),十六进制表示数字前必须加上0x。
Example #1 整数文字表达
<?php
$a = 1234; //十进制数
$a = -123; //负数
$a = 0123; //八进制数
$a = 0x1A; //十六进制数
?>
整数溢出
如果给定的一个数超出了integer的范围,将会解释为float。同样如果执行的运算结果超出了integer范围,也会返回float。
<?php
$large_number = 2147483647;
var_dump($large_number);
//输出为:int(2147483647)
$large_number = 2147483648;
var_dump($large_number);
//输出为:float(2147483648)
//同样也适用于十六进制表示的整数:从 2^31 到 2^32-1:
var_dump(0xffffffff);
//输出float(4294967295)
//不适用于大于2^32-1 的十六进制表示的数:
var_dump(0x100000000);
//输出:int(2147483647)
$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number);
// 输出: float(50000000000)
?>
转换为整型
要明确的将一个值转换为integer,用(int)或(integer)强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个integer参数时,值会自动转换。还可以通过函数intval()来将一个值转换成整型。
从布尔值转换
FALSE将产生出0(零), TRUE将产生出1(一)
从浮点数转换
当从浮点数转换成整数时,将向零取整。
如果浮点数超出了整数范围(通常为 +/- 2.15e+9 = 2^31),则结果不确定,因为没有足够的精度使浮点数给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!
Warning
决不要将未知的分数强制转换为integer,这样有时会导致不可预料的结果。
PHP浮点型
浮点数(也叫浮点数,双精度或实数)可以用以下任一语法定义:
<?php
$a = 1.234;
$a = 1.2e3;
$c = 7E-10;
?>
PHP字符串
语法
一个字符串通过下面的4种方法来定义:
+单引号
+双引号
+heredoc语法结构
+nowdoc语法结构(自PHP5.3.0以后)
单引号
定义一个字符串的最简单的方法是用单引号把它包围起来(标点符号 ')。
如果想要输出一个单引号,需在它的前面加个反斜线()。在单引号前或在字符串的结尾处想要输出反斜线,输入两条()。注意,如果在任何其他的字符前加了反斜线,反斜线将会被直接输出。
Note: 不像双引号和heredoc语法结构, 在单引号字符串中的变量和特殊含义的字符将不会被替换。
双引号
如果字符串是包围在双引号(")中,PHP将对一些特殊的字符进行解析
Heredoc结构
第三种定义字符串的方法是用heredoc句法结构:<<<。在该提示符后面,要定义个标识符,然后是一个新行。接下来是字符串本身,最后要用前面定义的标识符作为结束标志。
结束时所引用的标识符必须在一行的开始位置,而且,标识符的命名也要像其他标签一样遵守PHP的规则:只能包含字母、数字和下划线,并且不能用数字和下划线作为开头。
Warning
要注意的是结束标识符这行除了可能有一个分号(;)外,绝对不能包括其他字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或tabs。更重要的是结束标识符的前面必须是个被本地操作系统认可的新行标签。
如果不遵守该规则导致结束标签不“干净”,PHP将认为它不是结束标识符而继续寻找。如果在文件结束前也没有找到一个正确的结束标识符,PHP将会在最后一行产生一个句法错误。
Heredocs结构不能用来初始化class,而从PHP5.3以后,则该限制只能用在包含变量的情况下。
Example #1 非法的示例
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
Heredoc结构就象是没有使用双引号的双引号字符串, 这就是说在heredoc结构中引号不用被替换,但是上文中列出的字符 (等)也可使用。 变量将被替换,但在heredoc结构中字符串表达复杂变量时,要格外小 心。
Example #2 Heredoc结构的字符串示例
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
/*含有变量的更复杂示例*/
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结构用在函数参数中来传输数据:
Example #3 Heredoc结构在参数中的示例
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
在PHP5.3.0以后,也可以用Heredoc结构来初始化静态变量和类的属性和常量:
Example #4 使用Heredoc结构来初始化静态值
<?php
//静态变量
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结构中用双引号来声明标识符:
Example #5 在heredoc结构中使用双引号
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>
NOTE:
PHP4才引入了Heredoc结构。
Nowdoc结构
就像heredoc结构类似于双引号字符串,Nowdoc结构是类似于单引号字符串的。Nowdoc结构很像heredoc结构,但是nowdoc不进行解析操作。这种结构很适合用在不需要进行转义的PHP代码和其他大段文本。与SGML的<![CDATA[ ]]>结构是用来声明大段的不用解析的文本类似,nowdoc结构也有相同的特征。
一个nowdoc结构也用和heredocs结构一样的标记<<<,但是跟在后面的标识符要用单引号括起来,就像<<<'EOT'这样。heredocs结构的所有规则也同样适用于nowdoc结构,尤其是结束标志符的规则。
Example #6 Nowdoc结构字符串示例
<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
/* 含有变量的更复杂的示例 */
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结构,nowdocs结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量:
###Example #7 表态数据的示例
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;}
?>
Note:
Nowdoc结构是在PHP 5.3.0中加入的。
变量解析
当字符串用双引号或heredoc结构定义时,其中的变量将会被解析。
这里共有两种语法规则:一种简单规则,一种复杂规则。简单的句法规则是最常用和最方便的, 它可以用最少的代码在一个字符串中加入变量, 数组 值,或 对象属性。
复杂的句法规则是在PHP4以后加入的,被花括号包围的表达式是其明显标记。
简单句法规则
当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"; // 有效
类似的,一个 数组 索引或一个 对象 属性也可被解析。数组索引要用方括号 (]) 来表示边际, 对象属性则是和上述的变量规则相同。
<?php
// 下面的例子是在字符串中引用数组
// 当数组处于字符串外部时,要把数组的值用括号括起来且不要用花括号{ }
// 显示所有错误
error_reporting(E_ALL);
$fruits = array('strawberry' => 'red', 'banana' => 'yellow');
// 有效;但是注意在字符串外面不能这样引用数组echo "A banana is $fruits[banana].";
// 有效
echo "A banana is {$fruits['banana']}.";
// 有效,但是PHP会先寻找常量banana
echo "A banana is {$fruits[banana]}.";
// 无效,要用花括号,这里将会产生一个解析错误echo "A banana is $fruits['banana'].";
// 有效
echo "A banana is " . $fruits['banana'] . ".";
// 有效
echo "This square is $square->width meters broad.";
// 无效,解决方法见复杂结构
echo "This square is $square->width00 centimeters broad.";
?>
复杂句法规则
复杂句法规则不是结构复杂而命名,而是因为它可以使用复杂的表达式。
任何想用在字符串中标量变量,数组变量或对象属性都可使用这种方法。 只需简单地像在字符串以外的地方那样写出表达式, 然后用花括号 { 和 }把它括起来。 由于 { 无法被转义,只有 $要紧挨着 {才会被认出来,可以用 {$ 来表达 {$。下面的示例可以更好的解释:
<?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 的前提下才会正常工作;这里会产生一个E_NOTICE?(undefined?constant)级别的错误。
echo "This is wrong: {$arr[foo][3]}";
// 有效,当在字符串中使用多重数组时,一定要用括号将它括起来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()}";
?>
也可以在字符串中用变量来调用类的属性。
<?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.