PHP学习——27 PHP面向对象(对象的序列化传输或保存一个对象的方法)

版权声明:本文为博主原创文章,仅供学习交流,未经博主允许不得转载。 https://blog.csdn.net/zjy_android_blog/article/details/83451426

所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

为了能够unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。 如果要想在另外一个文件中解序列化一个对象,这个对象的类必须在解序列化之前定义,可以通过包含一个定义该类的文件或使用函数spl_autoload_register()来实现。

对象是没有对应实体的,程序执行完就消失了,序列化可以保存对象的所有变量值。

<?php 
// 1.序列化:string serialize ( mixed $value )
// serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方

// 2.反序列化:mixed unserialize ( string $str )
// unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。 

// 3.__sleep():serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。
// 如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,
// 并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何
// 内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。 

// 4.__wakeup():unserialize() 会检查是否存在一个 __wakeup() 方法。如果存
// 在,则会先调用 __wakeup 方法,预先准备对象需要的资源。 __wakeup()
// 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。 

class Employee
{
	public $name;
	public $age;
	public $salary;
	public function __construct($name,$age,$salary)
	{
		$this->name = $name;
		$this->age = $age;
		$this->salary = $salary;
	}
	public function __sleep()
  {
  	// 将允许序列化的对象属性放在一个数组中返回
    return ['name','age'];
  }
  public function __wakeup()
  {
  	// 对反序列化之后的对象进行修改
    $this->salary=0;
  }
}
$em1 = new Employee('Perter',23,5000);
// 1.序列化
// $em1Str = serialize($em1);
// echo '序列化后的值:'.$em1Str;
// 序列化后的值:O:8:"Employee":3:{s:4:"name";s:6:"Perter";s:3:"age";i:23;s:6:"salary";i:5000;}

// 2.增加 __sleep() 方法,规定只有name和age会被序列化
$em1Str = serialize($em1);
echo '序列化后的值:'.$em1Str;
// 序列化后的值:O:8:"Employee":2:{s:4:"name";s:6:"Perter";s:3:"age";i:23;}
echo '<hr>';

// 3.反序列化
// $em2 = unserialize($em1Str);
// echo '反序列化后的值:';
// print_r($em2);
//序列化后的值:Employee Object ( [name] => Perter [age] => 23 [salary] => )
// 由于没有序列化salary,所以salary没有值

// 4.增加 __wakeup() 方法,对salary赋值为0
$em2 = unserialize($em1Str);
echo '反序列化后的值:';
print_r($em2);
// 反序列化后的值:Employee Object ( [name] => Perter [age] => 23 [salary] => 0 )
?>

猜你喜欢

转载自blog.csdn.net/zjy_android_blog/article/details/83451426