数据类型转换


众所周知,PHP是世界上最好的开发语言…

  1. 任何类型都可以转为NULL,通过(unset)$var转换。

    1
    2
    3
    4
    在下列情况下一个变量被认为是 NULL:
    A. 被赋值为 NULL;
    B. 尚未被赋值;
    C. 被 unset()。
  1. 其他类型转为布尔类型boolean,根据原值的true、false决定转换后的结果,比如资源类型、对象转为true等。

    1
    2
    3
    4
    5
    6
    7
    以下值会被认为是false:
    A. 布尔值false本身;
    B. 整数0;
    C. 浮点型0.0;
    D. 字符串"0";
    E. 空字符串(非空格),如:""、'';
    F. NULL;
  1. 其他类型转为整型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    字符串转换数值,如果该字符串没有包含 '.','e' 或 'E' 
    并且其数字值在整型的范围之内(由PHP_INT_MAX 所定义),
    该字符串将被当成 int 来取值,
    其它所有情况下都被作为 float 来取值。
    以下为具体规则:
    A. NULL:转为0;
    B. 布尔型:false转为0,true转为1;
    C. 浮点型:向下取整,比如(int)1.9转为1;
    D. 字符串:如果字符串以合法的数值开始,则使用该数值,否则为0;合法的数值有可选的正负号,后面跟一个或多个数字,可能有小数点,再跟可选的指数部分组成;
    var_dump('09:00' > '8:00');// bool(false)
    var_dump('09:00' > '08:00');// bool(true)
    E. 数组:非空数组转为1,空数组转为0;
    F. 对象:把对象转为1;
    G. 资源:转为分配给这个资源的唯一编号。
  2. 其他类型转为浮点型,除了字符串类型外,其他类型转换规则与整型基本一致

  3. 其他类型转为字符串

    1
    2
    3
    4
    5
    6
    7
    8
    以下是具体转换规则:
    A. NULL/FALSE:转为空字符串;
    B. TRUE:转为“1”;
    C. 整型:原样转为字符串
    D. 浮点:原样转为字符串;
    E. 数组:转为“Array”,会报Notice错误;
    F. 对象:PHP版本大于4将报错;
    G. 资源:转为“Resource id #xxx”,xxx 是 PHP 在运行时分配给该资源的唯一值。

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$a = 1;
var_dump((string)$a);//string(1) "1"

$b = 0;
var_dump((string)$b);//string(1) "0"

$c = -1;
var_dump((string)$c);//string(2) "-1"

$d = 1.22222;
var_dump((string)$d);//string(7) "1.22222"

$e = 4.1E+6;//同写法4.1E3,E可小写
var_dump($e);//float(4100000)
var_dump((string)$e);//string(7) "4100000"
  1. 其他类型转为数组

    1
    2
    3
    4
    5
    6
    7
    A. null 转为空数组,count((array)null) == 0;
    B. 如果将一个 integer、float、string、boolean、resource 类型转为数组,则将得到一个仅有一个元素的数组,其下标为0,该元素为此标量的值。
    换句话说,(array)$a相当于array($a)。
    C. 如果将一个object类型转为array,则结果为一个数组,数组元素为该对象的全部属性(无方法),包括public、private、protected,其中:
    public 的属性不变,
    private 属性转换后的key加上了该类名的前缀,
    protected 属性的key加上了“*”作为前缀,这个前缀是类编译生成属性就已经加上了.

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
$a = 1;
print_r((array)$a);
输出:
Array
(
[0] => 1
)

$a = 0;
print_r((array)$a);
输出:
Array
(
[0] => 0
)

$a = null;
print_r((array)$a);
输出:
Array
(
)

$a = true;
print_r((array)$a);
输出:
Array
(
[0] => 1
)

$a = false;
var_dump((array)$a);
输出:
array(1) {
[0]=>
bool(false)
}

$a = 'aaa';
print_r((array)$a);
输出:
Array
(
[0] => aaa
)

class Test{
public $public_var = 456;
private $private_var = 123;
protected $protected_var = 789;

public function go()
{
echo 'go !';
}

private function eat()
{
echo 'eat !';
}

protected function sleep()
{
echo 'sleep !';
}
}
$obj = new Test();
echo "<pre>";print_r((array)$obj);
输出:
Array
(
[public_var] => 456
[Testprivate_var] => 123
[*protected_var] => 789
)
  1. 其他类型转换为对象

    1
    2
    3
    4
    5
    其他任何类型的值被转换为对象,将会创建一个内置类stdClass的实例:
    A. 如果该值为NULL,则新的实例为空;
    B. array转为object将以键名成为属性名并具有相对应的值,
    数值索引的元素也将转为属性,但是无法通过“->”访问,只能遍历获取;
    C. 对于其他值,会以“scalar”作为属性名。