序列化serialize()和反序列化unserialize()的使用

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
ini_set('error_reporting', E_ALL);
function_exists('opcache_reset') && opcache_reset();

function v(mixed $value, mixed ...$values): void
{
    ob_start();
    var_dump($value);
    echo ob_get_clean() . PHP_EOL;

    foreach ($values as $v) {
        v($v);
    }
}

/**
 * Human类
 */
class Human
{
    private string $name;
    private string $sex;
    private int $birth;

    public function __construct(string $name, string $sex, int $birth)
    {
        $this->name = $name;
        $this->sex = $sex;
        $this->birth = $birth;
    }

    public function setName(string $name): void
    {
        $this->name = $name;
    }

    public function setSex(string $sex): void
    {
        $this->sex = $sex;
    }

    public function setBirth(int $birth): void
    {
        $this->birth = $birth;
    }

    public function profile(): void
    {
        echo "俺叫{$this->name}{$this->sex}),出生于{$this->birth}年。" . PHP_EOL;
    }
}

$human = new Human('张三', '男', 2003);
v($human);
// object(Human)#2 (3) {
// ["name":"Human":private]=>
//   string(6) "张三"
// ["sex":"Human":private]=>
//   string(3) "男"
// ["birth":"Human":private]=>
//   int(2003)
// }

$serialize = serialize($human);
v($serialize); // string(103) "O:5:"Human":3:{s:11:"Humanname";s:6:"张三";s:10:"Humansex";s:3:"男";s:12:"Humanbirth";i:2003;}"

$unserialize = unserialize($serialize, ['allowed_classes' => true]); // 重要提醒:unserialize()得到的对象并不是原来的对象。
if ($unserialize instanceof Human) {
    $unserialize->setName('李四');
    $unserialize->setSex('女');
    $unserialize->setBirth(2004);
}

// 重要提醒:$human和$unserialize是两个不同的对象,所以profile()方法输出的内容不一样。
$human->profile();       // 俺叫张三(男),出生于2003年。
$unserialize->profile(); // 俺叫李四(女),出生于2004年。


//========== 总结 ==========//
// 1、虽然通过serialize()可以将对象以文本形式保存,但是unserialize()得到的对象并不是原来的对象,相当于clone操作。

Copyright © 2024 码农人生. All Rights Reserved