一、语法
public __serialize ( ) : array public __unserialize ( array $data ) : void
serialize() 函数会检查类中是否存在一个魔术方法 __serialize()。如果存在,该方法将在任何序列化之前优先执行。它必须以一个代表对象序列化形式的 键/值 成对的关联数组形式来返回,如果没有返回数组,将会抛出一个 TypeError 错误。
如果类中同时定义了 __serialize() 和 __sleep() 两个魔术方法,则只有 __serialize() 方法会被调用。 __sleep() 方法会被忽略掉。如果对象实现了 Serializable 接口,接口的 serialize()
方法会被忽略,做为代替类中的 __serialize() 方法会被调用。
__serialize()的目的是定义一个序列化友好的对象的任意表示。数组的元素可能对应于对象的属性,但这不是必需的。相反,unserialize()检查是否存在具有神奇名称__unserialize()的函数。如果存在,此函数将传递从__serialize()返回的恢复数组。然后,它可以根据需要从该数组中恢复对象的属性。
二、示例
<?php /** * 定义一个狗类 */ class Cat { //定义一个属性 private $name = null; // 构造函数 function __construct(?string $name = null){ if(is_null($this->name)){ $this->setName($name); } } /** * 输出名字 */ public function getName(){ echo "这是一只猫,名字叫{$this->name}。\n"."<br>"; } /** * 私有方法 */ private function setName($name){ $this->name = $name; } //序列化 public function __serialize(): array { return [ 'catname' => $this->name, ]; } //反序列化 public function __unserialize(array $data): void { $this->name = $data['catname']; $this->getName(); } } //实例化 $Cat = new Cat('旺财'); // 输出 __construct $Cat->getName(); //输出:'这是一只猫,名字叫旺财。 var_dump(serialize($Cat)); //输出 :string(43) "O:3:"Cat":1:{s:9:"Catname";s:6:"旺财";}" var_dump(unserialize(serialize($Cat)));// 输出:object(Cat)#2 (1) { ["name":"Cat":private]=> string(6) "旺财" }
三、更多
了解更多信息,请前往:https://www.php.net/manual/zh/language.oop5.magic.php#object.serialize