php魔术方法之__serialize、__unserialize

一、语法

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

上一篇:tenosrrt错误AttributeError: 'NoneType' object has no attribute 'serialize, 解决方法:更换版本


下一篇:反序列化字符串逃逸(字符变少)