<?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