PHP 支持 8 种原始数据类型
四种标量类型:
  • boolean(布尔型)
  • integer(整型)
  • float(浮点型,也称作 double)
  • string(字符串)
两种复合类型:
  • array(数组)
  • object(对象)
最后是两种特殊类型:
  • resource(资源)
  • NULL(无类型)
此外,还有一些伪类型:
  • mixed(混合类型)
  • number(数字类型)
  • callback(回调类型)
以及伪变量 $...

PHP 在变量定义中不需要(或不支持)明确的类型定义,变量类型是根据使用该变量的上下文所决定的。也就是说,如果把一个 string 值赋给变量 $var,$var 就成了一个 string。如果又把一个integer 赋给 $var,那它就成了一个integer。
PHP 的自动类型转换的一个例子是加法运算符“+”。如果任何一个操作数是float,则所有的操作数都被当成float,结果也是float。否则操作数会被解释为integer,结果也是integer。注意这并没有改变这些操作数本身的类型,改变的仅是这些操作数如何被求值以及表达式本身的类型

一些相关方法
  • 如果想查看某个表达式的值和类型,用 var_dump() 函数。
  • 如果只是想得到一个易读懂的类型的表达方式,用 gettype() 函数。
  • 要查看某个类型,用 is_type() 函数。

1、boolean (布尔型)

布尔型表达了true或false,即真或假。两个都不区分大小写
  1. $a_bool = TRUE; // a boolean
  2. var_dump ( $a_bool ); // boolean true。输出变量的值和类型
  3. echo gettype ( $a_bool ); // boolean
  4. if (is_string ( $a_bool ))
  5. echo "草";
  6. else
  7. echo "泥煤";

转换为布尔型

要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。
但是很多情况下不需要用强制转换,因为当运算符、函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。

以下值被认为是false,其他的值都是被认为是true(包括任何资源)
  • 布尔值 FALSE 本身
  • 整型值 0(零)。-1 及其它非零值都被认为是 TRUE!
  • 浮点型值 0.0(零)
  • 空字符串,以及字符串 "0"
  • 不包括任何元素的数组
  • 不包括任何成员变量的对象(仅 PHP 4.0 适用)
  • 特殊类型 NULL(包括尚未赋值的变量)
  • 从空标记生成的 SimpleXML 对象

2、int (整型)

整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)
二进制表达的 integer 自 PHP 5.4.0 起可用。
要使用八进制表达,数字前必须加上 0(零)。要使用十六进制表达,数字前必须加上 0x。要使用二进制表达,数字前必须加上 0b

整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。64 位平台下的最大值通常是大约 9E18。PHP 不支持无符号整数。Integer 值的字长可以用常量 PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 来表示。

如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。
var_dump(01090);//int 8

如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。
  1. $large_number = PHP_INT_MAX;
  2. var_dump($large_number);//int 2147483647
  3. var_dump($large_number+1);//float 2147483648
PHP 中没有整除运算符。
  1. var_dump(5/3); // float 1.6666666666667
  2. var_dump((int) (5/3)); // int 1 舍弃小数部分强制转换为 int
  3. var_dump(round(5/3)); // float 2 四舍五入

转换为整型或浮点型

要明确地将一个值转换为 integer,用 (int) 或 (integer) 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。还可以通过函数 intval() 来将一个值转换成整型。
  • 从布尔值转换:FALSE 将产生出 0,TRUE 将产生出 1。
  • 从浮点型转换:将向下取整
如果浮点数超出了整数范围,则结果为未定义,因为没有足够的精度给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!
决不要将未知的分数强制转换为 integer,这样有时会导致不可预料的结果。
echo (int) ( (0.1+0.7) * 10 ); // 显示 7
  • 字符串转换为数值
当一个字符串被当作一个数值来取值,其结果和类型如下:
如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。

该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。
合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。
  1. $foo = 1 + "10.5"; // $foo is float (11.5)
  2. $foo = 1 + "-1.3e3"; // $foo is float (-1299)
  3. $foo = 1 + "bob3"; // $foo is integer (1)
  4. $foo = 1 + "10 Small Pigs"; // $foo is integer (11)
  5. $foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
  6. $foo = "10.0 pigs " + 1; // $foo is float (11)
不要想像在 C 语言中的那样,通过将一个字符转换成整数以得到其代码。使用函数 ord() 和 chr() 实现 ASCII 码和字符间的转换。

3、float (浮点型)

浮点型也叫浮点数 float,双精度数 double 或实数 real。
double 和 float 是相同的,由于一些历史的原因,这两个名称同时存在。
  1. $a=1.1;
  2. var_dump($a);//float 1.1
浮点数的精度取决于系统,PHP 通常使用 IEEE 754 双精度格式。
永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等
要测试浮点数是否相等,要使用一个仅比该数值大一丁点的最小误差值。该值也被称为机器极小值(epsilon)或最小单元取整数,是计算中所能接受的最小的差别值。

某些数学运算会产生一个由常量 NAN 所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值进行的松散或严格比较的结果都是 FALSE。
由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。

4、string (字符串)

一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256 的字符集(ASCII扩展字符集),因此不支持 Unicode 。
字符串可以用 '.'(点)运算符连接起来,注意 '+'(加号)运算符没有这个功能。
PHP 支持使用和数组下标同样的语法访问字符串下标,如  $a = 'car';   echo $a[0];//c

对于 string 的操作有很多有用的函数,可以参考字符串函数了解大部分函数。

高级的查找与替换功能可以参考正则表达式函数或 Perl 兼容正则表达式函数

另外还有 URL 字符串函数,也有加密/解密字符串的函数(mcrypt 和 mhash)。

最后,可以参考字符类型函数


字符串的四种表示方式

单引号

定义一个字符串的最简单的方法是用单引号把它包围起来。可以录入多行,但是生成字符串时,会忽略换行符。
要表达一个单引号自身,需在它的前面加个反斜线(\)来转义;要表达一个反斜线自身,则用两个反斜线(\\);其它任何方式的反斜线都会被当成【反斜线本身】:也就是说如果想使用其它转义序列,例如 \r 或者 \n,并不代表任何特殊含义,就单纯是这两个字符本身。

在定义一些【简单】的字符串的时候,使用单引号效率比较高。
不像双引号和 heredoc 语法结构,在单引号字符串中的【变量】和【特殊字符的转义序列】将不会被替换

双引号

用双引号定义的字符串最重要的特征是,【变量】和【特殊字符的转义序列】将会被替换
  • 序列 含义
  • \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} 符合该正则表达式序列的是一个以十六进制方式来表达的字符

和单引号字符串一样,转义任何上述特殊字符外的其它字符,都会导致反斜线被显示出来(就是说没有转义呗)。PHP 5.1.1 以前,\{$var} 中的反斜线不会被显示出来。

Heredoc 结构

第三种表达字符串的方法是用 heredoc 句法结构:<<<在该运算符之后要提供一个标识符,然后换行。接下来是字符串 string 本身,最后要用前面定义的标识符作为结束标志。

Heredocs 结构定义的字符串中的【变量】和【特殊字符的转义序列】将会被替换

结束时所引用的标识符必须在该行的第一列,而且,标识符的命名也要像其它标签一样遵守 PHP 的规则。
结束标识符这行除了可能有一个分号(;)外,绝对不能包含其它字符,这意味着标识符不能缩进,分号的前后也不能有任何空白或制表符。
结束标识符的前面必须是个被本地操作系统认可的换行,比如在 UNIX 和 Mac OS X 系统中是 \n,而结束定界符(可能其后有个分号)之后也必须紧跟一个换行。
如果不遵守该规则导致结束标识不“干净”,PHP 将认为它不是结束标识符而继续寻找。如果在文件结束前也没有找到一个正确的结束标识符,PHP 将会在最后一行产生一个解析错误

其他功能
  • 可以把 Heredoc 结构用在函数参数中来传递数据
  • 在 PHP 5.3.0 以后,也可以用 Heredoc 结构来初始化静态变量和类的属性和常量
  • 自 PHP 5.3.0 起,还可以在 Heredoc 结构中用双引号来声明标识符

Nowdoc 结构

Nowdoc 结构是在 PHP 5.3.0 中加入的。
就象 heredoc 结构类似于双引号字符串,Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。

一个 nowdoc 结构也用和 heredocs 结构一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<'EOT'。Heredoc 结构的所有规则也同样适用于 nowdoc 结构。
不象 heredoc 结构,nowdoc 结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量。

四种方式【示例】

  1. $b = 1;
  2. echo '单引号......$b......"……\'……\\……\n\t\r结束
    '
    ; //【单引号......$b......"……'……\……\n\t\r结束】
  3. echo "双引号......{$b}......\"……'……\……\n\t\r结束
    "
    ; // 【双引号......1......"……'……\…… 结束】
  4. $hh = <<<www
  5. Heredoc 结构{$b},格式不能错,可随意添加双引号"或单引号',且不需要转义
  6. 【变量】和【特殊字符的转义序列】将会被替换
  7. //内部不能注释\n\t\r结束
  8. www;
  9. echo $hh;
  10. $nn = <<<'nba'
  11. Nowdoc 结构{$b},可随意添加双引号"或单引号',且不需要转义
  12. 不进行解析操作
  13. //内部不能注释\n\t\r结束
  14. nba;
  15. echo $nn;

字符串中的变量解析

当字符串用双引号或 heredoc 结构定义时,其中的变量将会被解析。
这里共有两种语法规则:一种简单规则,一种复杂规则。
简单的语法规则是最常用和最方便的,它可以用最少的代码在一个 string 中嵌入一个变量,一个 array 的值,或一个 object 的属性。
复杂规则语法的显著标记是用花括号包围的表达式。

简单语法

当 PHP 解析器遇到一个美元符号$时,它会去组合尽量多的标识(包含中文字符)以形成一个合法的变量名。可以用花括号来明确变量名的界线。
  1. $a = "包青天";
  2. $ab = "白乾涛";
  3. $ba = "泥煤";
  4. echo "大家好,我是$a
    "
    ;//当 PHP 解析器遇到一个美元符号$时,它会去组合尽量多的标识(包含中文字符)以形成一个合法的变量名
  5. echo "大家好,我是$ab
    "
    ;
  6. echo "大家好,我是$ab啊
    "
    ;//报错
  7. echo "大家好,我是b$a b";//大家好,我是b包青天 b
类似的,一个 array 索引或一个 object 属性也可被解析。数组索引要用方括号 ] 来表示索引结束的边际,对象属性则是和上述的变量规则相同。
  1. $names = array("包青天", "白乾涛", "bqt" => "baiqiantao");
  2. echo "大家好,我是$names[0]
    "
    ;//大家好,我是包青天
  3. echo "大家好,我是$names[bqt]
    "
    ;//大家好,我是baiqiantao
  4. echo "大家好,我是$names[1]s
    "
    ;//请留意,这里没报错!大家好,我是白乾涛s
  5. echo "大家好,我是$names[2]s
    "
    ;//请留意,这里会报错!大家好,我是s
  6. class people {
  7. public $name = "包青天";
  8. }
  9. $people = new people();
  10. echo "我是$people->name
    "
    ;
  11. echo "我是$people->name啊
    "
    ;//报错

复杂语法

复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式

任何具有 string 表达的标量变量,数组单元或对象属性都可使用此语法。只需简单地像在 string 以外的地方那样写出表达式,然后用花括号 { 和 } 把它括起来即可。由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别。可以用 {\$ 来表达 {$。下面的示例可以更好的解释:
  1. $great = 'fantastic';
  2. echo "This works: {$great}"; // 有效,输出: This is fantastic
  3. echo "This works: ${great}"; // 有效,输出: This is fantastic
  4. echo "This is wrong: { $great}"; // 无效,输出: This is { fantastic}
  5. echo "This works: {$arr['foo']}"; // 有效,只有通过花括号语法才能正确解析带引号的键名
  6. echo "This works: {$arr[4][3]}";
  7. echo "This is wrong: {$arr[foo][3]}";// 这是错误的表达式,就象 $foo[bar] 的格式在字符串以外也是错的一样
  8. echo "This works: {$arr['foo'][3]}";
  9. echo "This works: " . $arr ['foo'] [3];
  10. echo "This works: {$square->width}";
  11. echo "This works: {$obj->values[3]->name}";
  12. echo "This is the value of the var named $name: {${$name}}";
  13. echo "This is the value of the var named by the return value of getName(): {${getName()}}";
  14. echo "This is wrong: {getName()}"; // 无效,输出:This is wrong: {getName()}
  15. echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";

函数、方法、静态类变量和类常量只有在 PHP 5 以后才可在 {$} 中使用。然而,只有在该字符串被定义的命名空间中才可以将其值作为变量名来访问。只单一使用花括号 ({}) 无法处理从函数或方法的返回值或者类常量以及类静态变量的值。
  1. class beers {
  2. const aaa = 'bqt';
  3. public static $bbb = 'bqt';
  4. }
  5. $bqt = '包青天';
  6. echo "我是{${beers::aaa}}"; // 我是包青天
  7. echo "我是{${beers::$bbb}}"; // 我是包青天

存取和修改字符串中的字符

string 中的字符可以通过一个从 0 开始的下标,用类似 array 结构中的方括号包含对应的数字来访问和修改,比如 $str[42]。可以把 string 当成字符组成的 array。函数 substr() 和 substr_replace() 可用于操作多于一个字符的情况。

string 也可用花括号访问,比如 $str{42}。
  • 用超出字符串长度的下标写入将会拉长该字符串并以空格填充
  • 非整数类型下标会被转换成整数
  • 自 PHP 5.4 起,下标必须为整数或可转换为整数的字符串,否则会发出警告
  • 非法下标类型会产生一个 E_NOTICE 级别错误
  • 用负数下标写入字符串时会产生一个 E_NOTICE 级别错误
  • 用负数下标读取字符串时返回空字符串
  • 写入时只用到了赋值字符串的第一个字符
  • 用空字符串赋值则赋给的值是 NULL 字符
注意:PHP 的字符串在内部是字节组成(非字符数组)的数组,因此用花括号访问或修改字符串对多字节字符集很不安全,仅应对单字节编码例如 ISO-8859-1 的字符串进行此类操作。
  1. echo PHP_VERSION;
  2. $str = 'This is a test哈A';
  3. echo $str [0]; // 取得字符串的第一个字符
  4. echo $str [strlen ( $str ) - 1]; // 取得字符串的最后一个字符
  5. echo $str [strlen ( $str ) - 2]; // 汉字一定会乱码
  6. echo "abc"[0]; // HP 5.5 增加了直接在字符串原型中用 [] 或 {} 访问字符的支持

转换成字符串

一个值可以通过在其前面加上 (string) 或用 strval() 函数来转变成字符串。

在一个需要字符串的表达式中,会自动转换为 string。比如在使用函数 echo 或 print 时,或在一个变量和一个 string 进行比较时,就会发生这种转换。


  • 一个布尔值 boolean 的 TRUE 被转换成 string 的 "1"。boolean 的 FALSE 被转换成 ""(空字符串)
  • 一个整数 integer 或浮点数 float 被转换为数字的字面样式的 string(包括 float 中的指数部分),使用指数计数法的浮点数(4.1E+6)也可转换。
  • 数组 array 总是转换成字符串 "Array",因此,echo 和 print 无法显示出该数组的内容。要显示某个单元,可以用 echo $arr['foo'] 这种结构。要显示整个数组内容见下文。
  • 在 PHP 4 中对象 object 总是被转换成字符串 "Object",用 get_class() 可以获取对象类的名称。自 PHP 5 起,适当时可以用 __toString 方法。
  • 资源 resource 总会被转变成 "Resource id #1" 这种结构的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的唯一值。不要依赖此结构,可能会有变更。要得到一个 resource 的类型,可以用函数 get_resource_type()
  • NULL 总是被转变成空字符串。


如上面所说的,直接把 array,object 或 resource 转换成 string 不会得到除了其类型之外的任何有用信息,可以使用函数 print_r() 和 var_dump() 列出这些类型的内容。


大部分的 PHP 值可以转变成 string 来永久保存,这被称作串行化,可以用函数 serialize() 来实现。

如果 PHP 引擎设定支持 WDDX(Web Distributed DataExchange,是一种基于XML的Web分布式数据交换技术),PHP 值也可被串行化为格式良好的 XML 文本。


5、array (数组)

PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。

可以用 array() 语言结构来新建一个数组,它接受任意数量用逗号分隔的 key => value 键值对。
自 5.4 起也可以使用短数组定义语法,即:可用 [] 替代 array()
key可以是一个整数 integer (可以为0或负数)或字符串 string,value可以是任意类型的值。
最后一个数组单元之后的逗号可以省略。对多行数组定义通常保留最后一个逗号,这样要添加一个新单元时更方便。

数组是有序的,也可以使用不同的排序函数来改变顺序。
因为数组中的值可以为任意值,也可是另一个数组,这样可以产生递归或多维数组。

数组的访问

可以通过 ***=array[key] 或 ***=array{key} 语法来访问数组单元
试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致 E_NOTICE 级别错误信息,其结果为 NULL。

可以通过 array[key] =*** 或 array{key} =*** 方式给数组元素赋值
如果此元素不存在,将会新建一个元素,否则会覆盖之前具有此键名的值。
其中,[]内可以省略键名,此时 PHP 将自动使用之前用过的最大 integer 键名加上 1 (最小为 0)作为键名创建一个新的元素。【注】
如果 $array 不存在,将会新建一个数组,这也是另一种新建数组的方法。不过并不鼓励这样做,因为如果 $arr 已经包含有值,则此值会保留。
  1. $arr [2] = 2; // 如果 $arr 还不存在,将会新建一个
  2. $arr {2} = "覆盖掉上面的值";
  3. $arr [] = 5; // key为2+1=3。不能用$arr {},大括号内必须有key才可以
  4. var_dump ( $arr );

自 PHP 5.4 起可以用数组间接引用函数或方法调用的结果。之前只能通过一个临时变量。如 ***=getArray()[1];
自 PHP 5.5 起可以用数组间接引用一个数组原型。如 list(, $secondElement) = getArray();

在双引号字符串中,不给索引加上引号是合法的,如"$foo[bar]" 是合法的("合法"的原文为 valid),在实际测试中,这么做确实可以访问数组的该元素,但是会报一个常量未定义的 notice。
但强烈建议不要使用 $foo[bar]这样的写法,而要使用 "$foo['bar']"来访问数组中元素。

数组中的key

数组中的 key 可以是一个整数 integer (可以为0或负数)或字符串 string
可以同时含有 integer 和 string 类型的键名因为 PHP 实际并不区分索引数组和关联数组
如果在数组定义中多个单元都使用了同一个键名,则只使用最后一个,之前的都会被覆盖
如果对给出的值没有指定键名,和前面一样,PHP 将自动使用之前用过的最大 integer 键名加上 1 (最小为 0)作为键名【注】
同样,如果这些自动产生的键名在之后有了新值,则之前键名对应的值会被覆盖
  1. $array = array (
  2. - 100 => 10086,
  3. "key" => "可以同时含有 int 和 string 类型的键名",
  4. "0键不是合法的十进制数值,不会被转换为整型" => 0,
  5. "0" => "键为合法的十进制数值,会被转换为整型",
  6. false => "会覆盖掉了上面的数据",
  7. 5 => "5是目前最大的整数索引值",
  8. "没有指定键名,则使用之前用过的最大 int 键名加上 1作为键名",
  9. "键名为5+1+1=7",
  10. 7 => "如果指定的键名已经有了值,则该值会被覆盖"
  11. );
  12. var_dump ( $array );

此外,key 会有如下的强制转换:
  • 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
  • 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
  • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。

自动产生的最大key

【注】这里所使用的最大整数键名不一定当前就在数组中,它只要在上次数组重新生成索引后曾经存在过就行了。
unset() 函数允许删除数组中的某个键,但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 array_values() 函数。
  1. $array = array(1, 2, 3, 4, 5);// 创建一个简单的数组
  2. foreach ($array as $i => $value) {
  3. unset($array[$i]);// 现在删除其中的所有元素,但保持数组本身不变
  4. }
  5. $array[] = 8;// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
  6. print_r($array);
  7. echo "
    ------------------------------------------------------
    "
    ;
  8. $array = array_values($array);// 重新索引
  9. $array[] = 7;// 重新索引后,原先的键名也变了
  10. print_r($array);

常用函数

  • each():返回数组当前键/值对,并将指针推进一个位置。如果执行each()前指针位于数组末尾,则返回FALSE。
  • count()返回数组中的单元数目或对象中的属性个数
  • key()返回array中位于当前指针位置的键元素不移动指针。
  • current()返回位于array当前指针位置的数组值。不移动指针。
  • next()返回紧接着放在当前数组指针的下一个位置的数组值。会移动指针。
  • prev()返回位于当前指针的前一个位置的数组值。如果指针本来就位于数组的第一个位置,则返回FALSE。移动指针。
  • end()将指针移向array的最后一个位置,并返回最后一个元素。移动指针。
  • foreach()从第一个元素开始逐个遍历array中元素。foreach执行完毕后,会将指针移动到数组的末尾。
  • array_values()返回数组中所有的值并给其建立数字索引。
  • reset()函数用来将array的指针设置回数组的开始位置。如果需要在一个脚本中多次查看或处理同一个数组,就经常使用这个函数。另外这个函数还常用于排序结束时。
注意:将一个数组赋值给另一个数组时会重置原来的数组指针,要防止在遍历过程中由于数组赋值而导致的无限循环!

数组的遍历

foreach 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。
经过测试,结果表明,对于遍历同样一个数组,foreach速度最快,最慢的则是while。从原理上来看,foreach是对数组副本进行操作(通过拷贝数组),而while则通过移动数组内部指针进行操作,一般逻辑下认为,while应该比foreach快(因为foreach在开始执行的时候首先把数组复制进去,而while直接移动内部指标。),但结果刚刚相反。原因应该是,foreach是PHP内部实现,而while是通用的循环结构。所以,在通常应用中foreach简单,而且效率高。在PHP5下,foreach还可以遍历类的属性。
  1. $array = array (
  2. 1 => 1,
  3. "包青天", // key为2
  4. "哈哈" => [
  5. 10086 => "嵌套"
  6. ]
  7. );
  8. print_r ( $array ); // 打印数组
  9. echo "
    ****************【访问元素】*****************
    "
    ;
  10. echo $array [2];
  11. echo $array {"哈哈"} [10086];

  12. echo "
    ****************【for】*****************
    "
    ;
  13. for($i = 0; $i < count ( $array ); $i ++) {
  14. var_dump ( $array [$i] ); // 由于key=0的元素不存在,所以访问$array [0]时会报错。这种方式只适合key为有规律的数值才可以
  15. }

  16. echo "
    ****************【foreach】*****************
    "
    ;
  17. foreach ( $array as $val ) {
  18. var_dump ( $val ); // 注意:foreach执行完毕后,会将指针移动到数组的末尾
  19. }
  20. echo "
    ****************【while】*****************
    "
    ;
  21. reset ( $array );
  22. while ( list ( $key, $val ) = each ( $array ) ) {
  23. var_dump ( $val );
  24. }

转换为数组

可以通过(array)$scalarValue 或 array($scalarValue)方式将其他类型变量转换为数组。
对于任意 integer,float,string,boolean 和 resource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。
将 NULL 转换为 array 会得到一个空的数组
如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性,键名将为成员变量名。不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 '*' 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为。


6、object (对象)

如果将一个对象转换成对象,它将不会有任何变化。
其它类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。如果该值为 NULL,则新的实例为空。
数组转换成对象将使键名成为属性名并具有相对应的值。
对于任何其它的值,名为 scalar 的成员变量将包含该值。
  1. class foo {
  2. public $name = "包青天";
  3. function do_foo() {
  4. echo "Hello,包青天";
  5. }
  6. }
  7. $bar = new foo ();
  8. $bar->do_foo (); // 不支持这种写法 new foo ()->do_foo ();
  9. echo $bar->name; // 不能带$符号
  10. $obj = ( object ) '字符串';
  11. echo $obj->scalar; // 字符串
  12. var_dump ( $obj );
 

7、resource (资源)

资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。

转换为资源
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。

释放资源
由于 PHP 4 Zend 引擎引进了引用计数系统,可以自动检测到一个资源不再被引用了(和 Java 一样),这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。

8、NULL(无类型)

特殊的 NULL 值表示一个变量没有值
NULL 类型只有一个值,就是不区分大小写的常量 NULL。
在下列情况下一个变量被认为是 NULL:
  • 被赋值为 NULL
  • 尚未被赋值
  • 被 unset()

转换到 NULL:使用 (unset) $var 将一个变量转换为 null 将不会删除该变量或 unset 其值,仅是返回 NULL 值而已。

【Callback 回调类型】

自 PHP 5.4 起可用 callable 类型指定回调类型 callback。本文档基于同样理由使用 callback 类型信息。
一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。
一个 PHP 的函数以 string 类型传递其名称。可以使用任何内置或用户自定义函数,但除了语言结构,例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。
一个已实例化的对象的方法被作为数组传递,下标 0 包含该对象,下标 1 包含方法名。
静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 'ClassName::methodName'。
除了普通的用户自定义函数外,create_function() 可以用来创建一个匿名回调函数。自 PHP 5.3.0 起也可传递 closure(匿名函数、闭包函数) 给回调参数。

在 PHP 4 中,需要使用一个引用来创建一个指向具体对象的回调函数,而不是一个拷贝。
在函数中注册有多个回调内容时(如使用 call_user_func() 与 call_user_func_array()),如在前一个回调中有未捕获的异常,其后的将不再被调用。
  1. function my_callback_function() {
  2. echo '普通方法';
  3. }
  4. class MyClass {
  5. static function myCallbackMethod() {
  6. echo '静态方法';
  7. }
  8. }
  9. call_user_func ( 'my_callback_function' ); // 接受用户自定义的回调函数作为参数
  10. $obj = new MyClass ();
  11. call_user_func ( array ( // 一个已实例化的对象的方法被作为数组传递,下标 0 包含该对象,下标 1 包含方法名
  12. $obj,
  13. 'myCallbackMethod'
  14. ) );
  15. call_user_func ( array ( // 静态类方法可不经实例化该类的对象而传递,只要在下标 0 中包含【类名】而不是对象
  16. 'MyClass',
  17. 'myCallbackMethod'
  18. ) );
  19. call_user_func ( 'MyClass::myCallbackMethod' ); // 自 PHP 5.2.3 起,静态类方法也可以这中格式传递
  20. $double = function ($a) { // 匿名函数、闭包函数
  21. return $a * 2;
  22. };
  23. $numbers = range ( 1, 5 ); // 创建一个包含从 "1" 到 "5" 之间的元素范围的数组
  24. $new_numbers = array_map ( $double, $numbers ); // 返回为 $numbers 每个元素应用回调函数之后的数组
  25. print implode ( ' ', $new_numbers ); // 2 4 6 8 10

【伪类型与变量】

  • mixed:mixed 说明一个参数可以接受多种不同的类型。例如 gettype() 可以接受所有的 PHP 类型,str_replace() 可以接受字符串和数组。
  • number:number 说明一个参数可以是 integer 或者 float。
  • void:void 作为返回类型意味着函数的返回值是无用的。void 作为参数列表意味着函数不接受任何参数。
  • ...:在函数原型中,$... 表示等等的意思。当一个函数可以接受任意个参数时使用此变量名。