PHP面试知识复习(二):数据类型及其转换

数据类型

  • 标量
  • 复合
  • 特殊

标量

  • 布尔型
  • 整型
  • 浮点型
  • 字符串

布尔型

表示真假,有两种值,TRUE或者FALSE

常见使用方式有

  • 赋值
  • 在条件结构中使用

整型

表示负无穷到正无穷的某个整数

在PHP 中有三种表示方式

1
2
3
4
5
6
7
<?php
$a = 1; // 十进制
$a = -1; // 十进制负数
$a = 0123 // 八进制数(在前面加0,表示十进制83)
$a = 0x1A; // 十六进制数(在前面加0x,表示十进制26)
$a = 0b11111111; // 二进制数(PHP5.4.0以后可用,在前面加0b,表示十进制255)
?>

注意,整型有长度限制,通常是32位,超出范围会被转换成浮点型

浮点型

可以用来表示小数,表示方式可以是

1
2
3
4
5
<?php
$a = 1.2;
$b = 1.2e3;
$c = 7e-10;
?>

因为计算机存储的信息实际上为二进制的,有些十进制数字在存储电脑时,得丢失一点点精度转换成二进制。所以:

  • 不要相信浮点数精确到最后一位
  • 不要比较两个浮点数

当然,有迂回的办法,就是在指定精度的情况下进行比较

1
2
3
4
5
6
7
8
9
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if (abs($a - $b) < $epsilon) {
echo 'true';
}
?>

字符串

由一系列的字符组成,表示方式有4种

  • 单引号
  • 双引号
  • heredoc语法结构
  • nowdoc语法结构(PHP5.3.0以后可用)

双引号中的变量和转义字符会被解析,而单引号只有\'(解析成')\\(解析成\)会被解析
heredoc性质类似双引号,nowdoc性质类似单引号

单引号

使用单引号将字符包起来

1
2
3
<?php
$a = 'test';
?>
双引号

使用双引号将字符包起来

1
2
3
<?php
$a = "test";
?>
Heredoc

注意事项

  • <<< + 标识符 + 换行 + 字符串本身 + 标识符
  • 结束标识符必须另起一行,标识符前面没有任何符号(包括空白符、制表符),后面接一个语句结束符(;)
1
2
3
4
5
6
7
<?php
$a = <<<EOD
test
test
test
EOD;
?>
Nowdoc

类似Heredoc,但是<<<后面的标识符要用单引号括起来

1
2
3
4
5
6
7
<?php
$a = <<<'EOD'
test
test
test
EOD;
?>

复合

  • 数组
  • 对象

数组

能够存储多个不同类型数据的有序映射,表示方式有

  • array()
  • [](PHP5.4.0以后可用)
array()
1
2
3
4
<?php
$array = array("foo" => "bar", "bar" => "foo"); // array((key =>) value, ...)
$array = ["foo" => "bar", "bar" => "foo"];
?>
  • key可以是整型或者字符串,value可以是任意类型
  • key的强制转换
    • 合法十进制整型字符会转换成整型
    • 浮点数会被转成整型
    • 布尔也会被转成整型
    • NULL会被转成字符串
    • 数组和对象不能用作键名,否则会出现警告
  • 如果多个单元使用同一键名,只保留最后一个
  • 如果没有键名,取最大整数索引值+1作为新键名,存在则按照覆盖原则处理
  • 整数索引值默认从0开始

访问方式

1
2
3
4
<?php
$arr[key] = 'test'; // 表示修改key的值
$arr[] = 'test'; // 表示新增一个值为test的单元
?>

遍历方式

  • foreach
  • for
  • whilelist()each()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$array = [1, 2, 3];

foreach ($array as $key => $value) {
echo "{$key}: => $value";
}

for ($i = 0; $i < count($array); $i++) {
echo $array[$i];
}

while (list($key, $value) = each($array)) {
echo "{$key}: => $value";
}
?>
  • for 语句只能遍历索引数组
  • foreach语句与whilelist()each()组合语句相比,前者在遍历之前会重置数组内部指针,后者不会

对象

初始化

1
2
3
4
5
6
7
<?php
class foo
{
}
$bar = new foo;
?>
`

特殊

  • 资源
  • NULL

资源

用来保存到外部资源的一个引用

NULL

表示一个变量没有值,有三种情况被认为是NULL

  • 被赋值为NULL
  • 还没被赋值
  • unset()

类型转换

  • 自动转换
  • 强制转换

自动转换

在PHP中,变量的类型是根据上下文判断的。如果一个变量改变类型,PHP会根据规则进行自动转换

如果强制将变量当成某种类型求值,PHP会根据规则进行强制转换

强制转换

在变量前面加上用括号括起来的类型

1
2
3
4
<?php
$foo = 10; // foo为整型
$bar = (boolean)$foo; // bar为布尔型
?>

允许的强制转换

  • (int), (integer) - 转为整型
  • (bool), (boolean) - 转为布尔型
  • (float), (double), (real) - 转为浮点型
  • (string) - 转为字符串
  • (array) - 转为数组
  • (object) - 转为对象
  • (unset) - 转为NULL

转换规则

转为布尔型

以下值被认为是FALSE,其他值被认为是TRUE

  • 布尔值FALSE
  • 整型0
  • 浮点型0.0
  • 字符串
    • 空字符串
    • 字符串0
  • 空数组
  • 从空标记生成的SimpleXML对象
  • NULL

转为整型

  • 布尔型,FALSE转为0TRUE转为1
  • 浮点型,转为整数会向下取整,如果超出整数取值范围,值为未定义

    浮点型强制转换为整型,有时会导致不可预料的结果

    1
    2
    3
    <?php
    echo (int)( (0.1 + 0.7) * 10); // 输出7
    ?>
  • 字符串,如果字符串以合法的数字开始,则转为该数值,否则转为0

    合法数值——可选的正负号,后面跟着一个或者多个数字,再跟着可选的指数部分

  • 其他类型没有定义,不要依赖现有PHP解释器的转换方式

转为浮点型

  • 字符串类型,类似转为整型部分,不过合法数值包含小数点
  • 非字符串类型,情况相当于先转为整型,整型再转为浮点型

转为字符串

  • 布尔型,FALSE转为(空字符串),TRUE转为1
  • 整型和浮点型转为字面样式一致的字符串
  • 数组,总是转成字符串Array
  • 对象,PHP4总是转换成Object,PHP5开始,如果定义了__toString(),则转换成其返回值
  • 资源,总会吧转换成Resource id #1结构的字符串,其中的1是PHP运行时分配给资源的唯一值,不要依赖此结构,可能会有变更
  • NULL,转换成(空字符串)

转为数组

  • 布尔、整型、浮点、字符串、资源,转为下标为0,值为原先值的仅有一个元素的数组
  • 对象,转为键名为成员变量名,值为属性值的数组
    • 整数属性不能访问
    • 私有属性会加类名前缀
    • 保护变量会加*前缀
    • 前缀前后都有一个\0字符

转为对象

  • 布尔、整型、浮点、字符串、资源,包含一个成员属性scalar,值为原先值的仅有一个属性的内部类stdClass
  • 数组,转为成员变量名为键名,值为原先值的内部类stdClass

    数字属性只能通过迭代访问

转为资源

没有意义

转为NULL

  • 任何值都返回NULL

    并不会修改或者删除原先变量,只是返回NULL

参考