PHP 数据类型
数据类型是一种编程语言可以处理的数据单元,PHP 支持 10 种原始数据类型,包括:
四种标量类型:bool(布尔型)、int(整型)、float(浮点型,也叫 double)、string(字符串)
四种复合类型:array(数组)、object(对象)、callable(可调用)、iterable(可迭代)
两种特殊类型:resource(资源)、NULL(无类型)
以上类型不需要由程序员手动指定的,而是由 PHP 解释器根据变量的上下文在运行时决定的。
调试技巧:如果想查看某个变量的值和类型,可以用 var_dump() 函数。
PHP Boolean 布尔类型
这是最简单的类型,boolean 表达了真值,取值范围是 true 或 false。
<?php $is_car = true;
要明确地将一个值转换成 boolean,可以用函数 boolval() 来强制转换。
但是很多情况下不需要用强制转换,因为当上下文需要一个 boolean 参数时,该值会被 PHP 自动转换。
<?php $is_human = boolval('PHPer');
PHP Integer 整型
integer 是集合 ℤ = {..., -2, -1, 0, 1, 2, ...} 中的某个数。
最大值可以用常量 PHP_INT_MAX 来表示,最小值可以在 PHP 7.0.0 及以后的版本中用常量 PHP_INT_MIN 表示。
<?php $num = 1234; // 十进制数 $num = 0123; // 八进制数 (等于十进制 83) $num = 0x1A; // 十六进制数 (等于十进制 26) $num = 0b11111111; // 二进制数字 (等于十进制 255) $num = 1_234_567; // 整型数值 (PHP 7.4.0 以后)
要明确地将一个值转换为 integer,可以用函数 intval() 来强制转换。
不过大多数情况下都不需要强制转换,因为当上下文需要一个 integer 参数时,值会自动转换。
PHP Float 浮点型
浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下语法定义:
<?php $a = 1.234; $b = 1.2e3; $c = 7E-10; $d = 1_234.567; // 从 PHP 7.4.0 开始支持
警告:由于内部表达方式的原因,不要比较两个浮点数是否相等。
PHP String 字符串
一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。
注意: string 最大可以达到 2GB。
一个字符串可以用 4 种方式表达:单引号、双引号、heredoc 语法结构、nowdoc 语法结构(自 PHP 5.3.0 起)
<?php $str = '这是一个字符串'; // 单引号 $str = "这也是一个字符串"; // 双引号 $str = <<<EOD 使用nowdoc语法 跨越多行 使用字符串 EOD; // Heredoc 结构 $str = <<<'EOD' 使用nowdoc语法 跨越多行 使用字符串 EOD; // Nowdoc 结构,很像 heredoc 结构,但 nowdoc 中不进行解析操作,标识符要用单引号括起来
如果字符串是包围在双引号("")中, PHP 将对变量和一些特殊的字符进行解析:
序列 | 含义 |
---|---|
\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 Array 数组
PHP 中的数组array实际上是一个有序映射,所以只要掌握数组array就等于掌握列表(向量)、散列表(是映射的一种实现)、字典、集合、栈、队列以及更多可能性。
<?php $array = array( "foo" => "bar", "bar" => "foo", ); // 自 PHP 5.4 起 $array = [ "foo" => "bar", "bar" => "foo", ];
PHP Object 对象
要创建一个新的对象 object,使用 new 语句实例化一个类:
<?php class foo { function do_foo() { echo "Doing foo."; } } $bar = new foo; $bar->do_foo();
如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。
如果该值为 null,则新的实例为空。
array 转换成 object 将使键名成为属性名并具有相对应的值。
<?php $obj = (object) ['1' => 'foo']; var_dump(isset($obj->{'1'})); // PHP 7.2.0 后输出 'bool(true)',之前版本会输出 'bool(false)' var_dump(key($obj)); // PHP 7.2.0 后输出 'string(1) "1"',之前版本输出 'int(1)'
PHP Callback / Callable 类型
自 PHP 5.4 起可用 callable 类型指定回调类型 callback。
一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。
回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。
<?php // 回调函数例子 function my_callback_function() { echo 'hello world!'; } // 回调方法例子 class MyClass { static function myCallbackMethod() { echo 'Hello World!'; } } // Type 1: 简单回调 call_user_func('my_callback_function'); // Type 2: 静态方法作为回调 call_user_func(array('MyClass', 'myCallbackMethod')); // Type 3: 对象方法作为回调 $obj = new MyClass(); call_user_func(array($obj, 'myCallbackMethod')); // Type 4: 静态方法作为回调 (PHP 5.2.3 以后支持) call_user_func('MyClass::myCallbackMethod'); $c = new C(); call_user_func($c, 'PHP!');
PHP Iterable 可迭代对象
Iterable是 PHP 7.1 中引入的一个伪类型,它接受任何 array 或实现了 Traversable 接口的对象,这些类型都能用 foreach 迭代,也可以和生成器里的 yield from 一起使用。
<?php function foo(iterable $iterable) { foreach ($iterable as $value) { // ... } }
PHP Resource 资源类型
资源 resource 是一种特殊变量,保存了到外部资源的一个引用,resource 是通过专门的函数来建立和使用的。
resource 类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄。
PHP NULL 无类型
特殊的 null 值表示一个变量没有值,NULL 类型唯一的值就是 null。
在下列情况下一个变量被认为是 null:被赋值为 null、尚未被赋值、被 unset()。
PHP 类型转换和类型比较
PHP 中的类型强制转换和 C 中的非常像:在要转换的变量之前加上用括号括起来的目标类型。
<?php $foo = 10; // $foo是一个整数 $bar = (boolean) $foo; // $bar是一个布尔值
允许的强制转换有:
(int), (integer) - 转换为整形 integer
(bool), (boolean) - 转换为布尔类型 boolean
(float), (double), (real) - 转换为浮点型 float
(string) - 转换为字符串 string
(array) - 转换为数组 array
(object) - 转换为对象 object
(unset) - 转换为 NULL
以下的表格显示了 PHP 类型 和 比较运算符 在松散和严格比较时的作用。
注意:HTML 表单并不传递整数、浮点数或者布尔值,它们只传递字符串,要想检测一个字符串是不是数字,可以使用 is_numeric() 函数。
注意:在没有定义变量 $x 的时候,诸如 if ($x) 的用法会导致一个 E_NOTICE 级别的错误,所以,可以考虑用 empty() 或者 isset() 函数来初始化变量。
注意:某些数值操作会导致一个特殊值,可以用常量 NAN 表示。 无论是松散还是严格比较,这个值和其他任意值(包括它自身,但排除 true)比较时都会产生 false 的结果, 例如 NAN != NAN 和 NAN !== NAN。 导致 NAN 的操作例子包括 sqrt(-1)、asin(2)、 acosh(0)。