PHP 支持8种基本的数据类型。php
四种标量类型:html
两种复合类型:程序员
最后是两种特殊类型:数组
为了确保代码的易读性,介绍一些伪类型:ide
以及伪变量 $....函数
变量的类型不是由程序员设定的,是由 PHP 根据该变量使用的上下文在运行时决定的。ui
想查看某个表达式的值和类型,用 var_dump(),要查看某个类型,用 is_type 函数,若是只是想获得一个易读懂的类型的表达方式用于调试,用 gettype()。this
1 <?php 2 $a_bool = TRUE; // a boolean 3 $a_str = "foo"; // a string 4 $a_str2 = 'foo'; // a string 5 $an_int = 12; // an integer 6 7 echo gettype($a_bool); // prints out: boolean 8 echo gettype($a_str); // prints out: string 9 10 // If this is an integer, increment it by four 11 if (is_int($an_int)) { 12 $an_int += 4; 13 } 14 15 // If $bool is a string, print it out 16 // (does not print out anything) 17 if (is_string($a_bool)) { 18 echo "String: $a_bool"; 19 } 20 ?>
若是要将一个变量强制转换为某类型,能够对其使用强制转换或者 settype() 函数。spa
boolean 表达了真值,能够为 TRUE 或 FALSE,两个都不区分大小写。.net
将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。可是不少状况下不须要用强制转换,由于当运算符,函数或者流程控制结构须要一个 boolean 参数时,该值会被自动转换。
当转换为 boolean 时,如下值被认为是 FALSE:
全部其它值都被认为是 TRUE(包括任何资源)。
Warning
-1 和其它非零值(不论正负)同样,被认为是 TRUE!
1 <?php 2 var_dump((bool) ""); // bool(false) 3 var_dump((bool) 1); // bool(true) 4 var_dump((bool) -2); // bool(true) 5 var_dump((bool) "foo"); // bool(true) 6 var_dump((bool) 2.3e5); // bool(true) 7 var_dump((bool) array(12)); // bool(true) 8 var_dump((bool) array()); // bool(false) 9 var_dump((bool) "false"); // bool(true) 10 ?>
一个 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一个数。整型值可使用十进制,十六进制或八进制表示,前面能够加上可选的符号(- 或者 +)。八进制表示数字前必须加上 0(零),十六进制表示数字前必须加上 0x。整型数的字长和平台有关,Integer值的字长能够用常量PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值能够用常量PHP_INT_MAX来表示。
若是给定的一个数超出了 integer 的范围,将会被解释为 float。一样若是执行的运算结果超出了 integer 范围,也会返回 float。
1 <?php 2 $large_number = 2147483647; 3 var_dump($large_number); 4 // 输出为:int(2147483647) 5 6 $large_number = 2147483648; 7 var_dump($large_number); 8 // 输出为:float(2147483648) 9 10 // 一样也适用于十六进制表示的整数: 从 2^31 到 2^32-1: 11 var_dump( 0xffffffff ); 12 // 输出: float(4294967295) 13 14 // 不适用于大于 2^32-1 的十六进制表示的数: 15 var_dump( 0x100000000 ); 16 // 输出: int(2147483647) 17 18 $million = 1000000; 19 $large_number = 50000 * $million; 20 var_dump($large_number); 21 // 输出: float(50000000000) 22 ?>
将一个值转换为 integer,用 (int) 或 (integer) 强制转换。不过大多数状况下都不须要强制转换,由于当运算符,函数或流程控制须要一个 integer 参数时,值会自动转换。还能够经过函数 intval() 来将一个值转换成整型.
FALSE 将产生出 0(零),TRUE 将产生出 1(壹)。
当从浮点数转换成整数时,将向零取整。
若是浮点数超出了整数范围(一般为 +/- 2.15e+9 = 2^31),则结果不肯定。在此状况下没有警告!
浮点数(也叫浮点数,双精度数或实数)能够用如下任一语法定义:
1 <?php 2 $a = 1.234; 3 $b = 1.2e3; 4 $c = 7E-10; 5 ?>
一个字符串 就是由一系列的字符组成,一个字符就是一个字节,一个字节只能有256种不一样的变化,暗示了PHP没法原生支持Unicode。
一个字符串 经过下面的4种方法来定义:
定义一个字符串 的最简单的方法是用单引号把它包围起来 (标点符号 ')。
若是想要输出一个单引号,需在它的前面加个反斜线 (\)。在单引号前或在字符串的结尾处 想要输出反斜线,输入两条 (\\)。注意,在任何其它的字符前加了反斜线,反斜线将会被直接输出。
若是字符串是包围在双引号(")中, PHP将对一些特殊的字符进行解析。
PHP4才引入了Heredoc结构。第三种定义字符串的方法是用heredoc句法结构:<<<。在该提示 符后面,要定义个标识符,而后是一个新行。接下来是字符串 自己,最后要用前面定义的标识符做为结束标志。
结束时所引用的标识符必须在一行的开始位置, 并且,标识符的命名也要像其它标签同样遵照PHP的规则:只能包含 字母、数字和下划线,而且不能用数字和下划线做为开头。
Nowdoc结构是相似于单引号字符串的。Nowdoc结构很象heredoc结构,可是 nowdoc不进行解析操做 。 这种结构很适合用在不须要进行转义的PHP代码和其它大段文本。
一个nowdoc结构也用和heredocs结构同样的标记 <<<, 可是跟在后面的标志符要用 单引号括起来,就像<<<'EOT'这样。heredocs结构的全部规则也一样适用于nowdoc结 构,尤为是结束标志符的规则。
当字符串用双引号或heredoc结构定义时,其中的变量将会被解析。
两种语法规则:一种简单规则,一种复杂规则。简单的句法规则是最经常使用和最方便的, 它能够用最少的代码在一个字符串中加入变量,数组值,或对象属性。
复杂的句法规则是在PHP4之后加入的,被花括号包围的表达式是其明显标记。
简单句法规则
当PHP解析器遇到一个美圆符号 ($) ,造成一个合法的变量名。能够用花括号来明确变量名的界线。
1 <?php 2 $beer = 'Heineken'; 3 echo "$beer's taste is great"; //有效;单引号"'"是非法的变量名组成元素 4 echo "He drank some $beers"; //无效;字母s是有效的变量名组成元素,可是这里的变量是$beer 5 echo "He drank some ${beer}s"; // 有效 6 echo "He drank some {$beer}s"; // 有效 7 ?>
相似的,一个数组索引或一个对象属性也可被解析。数组索引要用方括号 (]) 来表示边际, 对象属性则是和上述的变量规则相同。
1 <?php 2 // 下面的例子是在字符串中引用数组 3 // 当数组处于字符串外部时,要把数组的值用括号括起来且不要用花括号{ } 4 5 // 显示全部错误 6 error_reporting(E_ALL); 7 8 $fruits = array('strawberry' => 'red', 'banana' => 'yellow'); 9 10 // 有效;可是注意在字符串外面不能这样引用数组 11 echo "A banana is $fruits[banana]."; 12 13 // 有效 14 echo "A banana is {$fruits['banana']}."; 15 16 // 有效,可是PHP会先寻找常量banana 17 echo "A banana is {$fruits[banana]}."; 18 19 // 无效,要用花括号,这里将会产生一个解析错误 20 echo "A banana is $fruits['banana']."; 21 22 // 有效 23 echo "A banana is " . $fruits['banana'] . "."; 24 25 // 有效 26 echo "This square is $square->width meters broad."; 27 28 // 无效,解决方法见复杂结构 29 echo "This square is $square->width00 centimeters broad."; 30 ?>
任何想用在字符串中标量变量,数组变量或对象属性均可使用这种方法。 只需简单地像在字符串之外的地方那样写出表达式, 而后用花括号{和 }把它括起来。 因为 { 没法被转义,只有 $要紧挨着 {才会被认出来,能够用 {$ 来表达 {$。下面的示例能够更好的解释:
<?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()}"; ?>
字符串中的字符能够经过一个以0为开始的,用相似数组结构中的方括号包含对应的数字来查找和修改,好比 $str[42], 能够把 字符串想像数组 。 函数 substr() 和 substr_replace()能够用来实现多于一个字符 的状况。
字符串能够用'.' (点) 操做符链接起来, 注意 '+' (加号) 操做符 没有 这个功能。
PHP 中的 数组其实是一个有序映射。映射是一种把 values 关联到 keys 的类型。用 array() 语言结构来新建一个 array,接受任意数量
1 array( key => value 2 , ... 3 ) 4 // 键(key) 但是是一个 整数(integer) 或 字符串(string) 5 // 值(value) 能够是任意类型的值
用逗号分隔的 键(key) => 值(value) 对。
设定值来改变一个现有的数组,经过在方括号内指定键名来给数组赋值实现的。也能够省略键名,在这种状况下给变量名加上一对空的方括号(“[]”)。
1 $arr[key] = value; 2 $arr[] = value; 3 // key 能够是 integer 或 string 4 // value 能够是任意类型的值
若是 $arr 还不存在,将会新建一个。这也是一种定义数组的替换方法。要改变一个值,只要给它赋一个新值。若是要删除一个键名/值对,要对它用 unset()。
1 <?php 2 $arr = array(5 => 1, 12 => 2); 3 4 $arr[] = 56; // This is the same as $arr[13] = 56; 5 // at this point of the script 6 7 $arr["x"] = 42; // This adds a new element to 8 // the array with key "x" 9 10 unset($arr[5]); // This removes the element from the array 11 12 unset($arr); // This deletes the whole array 13 ?>
若是给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值 + 1。若是当前尚未整数索引,则键名将为 0。最大整数键名不必定当前就在数组中。它只要在上次数组从新生成索引后曾经存在过就好了。
foreach 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。
要建立一个新的对象 object, 使用 new 语句实例化一个类:
1 <?php 2 class foo 3 { 4 function do_foo() 5 { 6 echo "Doing foo."; 7 } 8 } 9 10 $bar = new foo; 11 $bar->do_foo(); 12 ?>