类型转换 #

一、PHP类型系统 #

PHP是弱类型语言,支持自动类型转换:

php
<?php
$result = "10" + 5;
echo $result;
echo gettype($result);

二、自动类型转换 #

2.1 字符串转数字 #

php
<?php
echo "10" + 5;
echo "10.5" + 5;
echo "10abc" + 5;
echo "abc10" + 5;
echo "10" * 2;
echo "10" / 2;

2.2 数字转字符串 #

php
<?php
echo "Result: " . 42;
echo "Price: " . 99.99;
echo "Count: " . true;

2.3 布尔值转换 #

php
<?php
echo true + 0;
echo false + 0;
echo true . "";
echo false . "";

2.4 数组转换 #

php
<?php
$arr = [1, 2, 3];
echo $arr;
echo count($arr);

2.5 对象转换 #

php
<?php
class User
{
    public function __toString(): string
    {
        return "User object";
    }
}

$user = new User();
echo $user;
echo (string) $user;

三、强制类型转换 #

3.1 转换语法 #

php
<?php
(int) $var;
(integer) $var;
(float) $var;
(double) $var;
(real) $var;
(string) $var;
(bool) $var;
(boolean) $var;
(array) $var;
(object) $var;
(unset) $var;

3.2 转换为整数 #

php
<?php
echo (int) 3.14;
echo (int) "42";
echo (int) "42abc";
echo (int) "abc42";
echo (int) true;
echo (int) false;
echo (int) null;
echo (int) [1, 2, 3];

3.3 转换为浮点数 #

php
<?php
echo (float) 42;
echo (float) "3.14";
echo (float) "3.14abc";
echo (float) true;
echo (float) false;

3.4 转换为字符串 #

php
<?php
echo (string) 42;
echo (string) 3.14;
echo (string) true;
echo (string) false;
echo (string) null;
echo (string) [1, 2, 3];

3.5 转换为布尔值 #

php
<?php
var_dump((bool) 0);
var_dump((bool) 1);
var_dump((bool) "");
var_dump((bool) "0");
var_dump((bool) "hello");
var_dump((bool) []);
var_dump((bool) [0]);
var_dump((bool) null);

3.6 转换为数组 #

php
<?php
$arr = (array) 42;
print_r($arr);

$arr = (array) "hello";
print_r($arr);

$arr = (array) null;
print_r($arr);

3.7 转换为对象 #

php
<?php
$obj = (object) ['name' => 'John', 'age' => 25];
echo $obj->name;
echo $obj->age;

$obj = (object) "hello";
echo $obj->scalar;

四、类型转换函数 #

4.1 intval() #

php
<?php
echo intval(42);
echo intval(3.14);
echo intval("42");
echo intval("42abc");
echo intval("0x1A", 16);
echo intval("1010", 2);

4.2 floatval() / doubleval() #

php
<?php
echo floatval(42);
echo floatval("3.14");
echo floatval("3.14abc");

4.3 strval() #

php
<?php
echo strval(42);
echo strval(3.14);
echo strval(true);

4.4 boolval() #

php
<?php
var_dump(boolval(0));
var_dump(boolval(1));
var_dump(boolval(""));
var_dump(boolval("hello"));

4.5 settype() #

php
<?php
$var = "42";
settype($var, "int");
echo gettype($var);

$var = 42;
settype($var, "string");
echo gettype($var);

五、字符串与数字转换 #

5.1 数字转字符串 #

php
<?php
$num = 42;
$str = (string) $num;
$str = strval($num);
$str = "$num";
$str = number_format(1234.56, 2);

5.2 字符串转数字 #

php
<?php
$str = "42";
$num = (int) $str;
$num = intval($str);
$num = $str + 0;
$num = $str * 1;

5.3 进制转换 #

php
<?php
echo decbin(10);
echo dechex(255);
echo decoct(8);
echo bindec("1010");
echo hexdec("FF");
echo octdec("10");
echo base_convert("FF", 16, 2);

六、数组与对象转换 #

6.1 数组转对象 #

php
<?php
$arr = ['name' => 'John', 'age' => 25];
$obj = (object) $arr;
echo $obj->name;

$obj = json_decode(json_encode($arr));

6.2 对象转数组 #

php
<?php
class User
{
    public $name = 'John';
    protected $age = 25;
    private $email = 'john@example.com';
}

$user = new User();
$arr = (array) $user;
print_r($arr);

$arr = json_decode(json_encode($user), true);

6.3 stdClass转换 #

php
<?php
$obj = new stdClass();
$obj->name = 'John';
$obj->age = 25;

$arr = (array) $obj;
print_r($arr);

七、JSON转换 #

7.1 编码(转JSON字符串) #

php
<?php
$arr = ['name' => 'John', 'age' => 25];
$json = json_encode($arr);
echo $json;

$obj = new stdClass();
$obj->name = 'John';
$json = json_encode($obj);
echo $json;

$json = json_encode(['name' => '张三'], JSON_UNESCAPED_UNICODE);
echo $json;

$json = json_encode($data, JSON_PRETTY_PRINT);

7.2 解码(转数组/对象) #

php
<?php
$json = '{"name":"John","age":25}';

$obj = json_decode($json);
echo $obj->name;

$arr = json_decode($json, true);
echo $arr['name'];

7.3 错误处理 #

php
<?php
$json = '{"name":"John",}';

$data = json_decode($json);
if (json_last_error() !== JSON_ERROR_NONE) {
    echo "JSON错误: " . json_last_error_msg();
}

八、序列化 #

8.1 serialize() #

php
<?php
$arr = ['name' => 'John', 'age' => 25];
$serialized = serialize($arr);
echo $serialized;

8.2 unserialize() #

php
<?php
$serialized = 'a:2:{s:4:"name";s:4:"John";s:3:"age";i:25;}';
$arr = unserialize($serialized);
print_r($arr);

8.3 对象序列化 #

php
<?php
class User implements Serializable
{
    public string $name;
    
    public function serialize(): string
    {
        return serialize($this->name);
    }
    
    public function unserialize(string $data): void
    {
        $this->name = unserialize($data);
    }
}

九、类型比较 #

9.1 松散比较(==) #

php
<?php
var_dump(0 == "0");
var_dump(0 == "");
var_dump(0 == "hello");
var_dump(1 == "1");
var_dump(1 == "1abc");
var_dump(true == 1);
var_dump(false == 0);
var_dump(null == 0);
var_dump(null == "");
var_dump(null == false);

9.2 严格比较(===) #

php
<?php
var_dump(0 === "0");
var_dump(0 === 0);
var_dump(1 === "1");
var_dump(true === 1);
var_dump(null === 0);

9.3 比较表 #

表达式 结果
0 == “0” true
0 === “0” false
0 == “” true
0 === “” false
0 == “hello” true
0 === “hello” false
null == 0 false
null == “” false
null == false true
false == 0 true
“” == false true
“0” == false true

十、最佳实践 #

10.1 使用严格比较 #

php
<?php
if ($id === 0) {
    
}

if ($name !== null) {
    
}

10.2 明确类型转换 #

php
<?php
$id = (int) $_GET['id'];
$price = (float) $_POST['price'];
$name = (string) $input;

10.3 使用类型声明 #

php
<?php
declare(strict_types=1);

function process(int $id, string $name): bool
{
    return true;
}

10.4 验证输入类型 #

php
<?php
function safeProcess(mixed $input): string
{
    if (!is_string($input)) {
        throw new InvalidArgumentException("Expected string");
    }
    return $input;
}

十一、总结 #

本章学习了:

  • PHP自动类型转换规则
  • 强制类型转换语法
  • 类型转换函数
  • JSON转换
  • 序列化
  • 类型比较

下一章将学习类型检测。

最后更新:2026-03-26