`

php中__sleep和__wakeup

    博客分类:
  • PHP
php 
阅读更多
  在php中,__sleep和___wakeup是两个分别自对象序列化前和后分别调用的方法,
其中__sleep在一个对象序列化前调用,它不接收任何参数,但会返回数组,这里可以放置哪些属性需要序列化,比如下面的例子:


class Customer {
 private $name;
 private $credit_card_number; 
 
public function setName($name) {
 $this->name = $name;
 }
 
public function getName() {
 return $this->name;
 }
 
public function setCC($cc) {
 $this->credit_card_number = $cc;
 }
 
public function getCC() {
 return $this->credit_card_number;
 }
 
public function __sleep() {
 return array(“name”); //只有name会序列化 }
 
}
 
$c = new Customer();
 $c->setName(“Stuard”);
 $c->setCC(“456789″);
 
$data = serialize($c).”\n”;
 echo $data.”\n”;
 
Output:
 O:8:”Customer”:1:{s:14:” Customer name”;s:5:”Stuard”;}




   上面在序列化前,__sleep中指定了只有name属性会序列化,而creaditcard不会。

    而__wakeup则相反,它是在反序列化前触发的,比如下面例子:

class Customer {
 private $name;
 private $credit_card_number; 
 
public function setName($name) {
 $this->name = $name;
 }
 
public function getName() {
 return $this->name;
 }
 
public function setCC($cc) {
 $this->credit_card_number = $cc;
 }
 
public function getCC() {
 return $this->credit_card_number;
 }
 
public function __sleep() {
 return array(“name”);
 }
 
public function __wakeup() {
 if($this->name == “Stuart”) {
  //重新在数据库中获得 
 $this->credit_card_number = “1234567890123456″;
 }
 }
 }
 
$c = new Customer();
 $c->setName(“Stuart”);
 $c->setCC(“1234567890123456″);
 
$data = serialize($c).”\n”;
 var_dump(unserialize($data));
 
Output:
 object(Customer)#2 (2) {
 ["name:private"]=>
 string(5) “Stuart”
 ["credit_card_number:private"]=>
 string(16) ’1234567890123456³
 }



   上面的代码中,因为序列化时使用了__sleep,沒把creadit cardnumber属性序列化,因此在反序列化unserialize调用前,会先调用__wakeup方法,比如这里可以重新在数据库中取得数据,再此进行操作
3
1
分享到:
评论

相关推荐

    VarExporter组件允许将任何可序列化PHP数据结构导出为纯PHP代码。 这样做时,它保留了与PHP的序列化机制(__wakeup,__ sleep,Serializable)相关的所有语义。-PHP开发

    PHP(__ wakeup,__ sleep,Serializable,__ serialize,__ unserialize),它还提供了一个实例化程序,该实例化程序无需调用其构造函数或任何其他方法即可创建和填充对象。使用此组件与serialize()或igbinary的...

    var-exporter:VarExporter组件允许将任何可序列化PHP数据结构导出为纯PHP代码。 这样做时,它保留了与PHP的序列化机制(__wakeup,__ sleep,Serializable)相关的所有语义。

    虽然这样做,它保留了与PHP的序列化机制(相关联的所有语义__wakeup , __sleep , Serializable , __serialize , __unserialize )。 它还提供了一个实例化器,该实例化器允许创建和填充对象而无需调用其构造...

    序列化一个类_php的类的序列化脚本_

    PHP允许我们在类中定义`__sleep()`和`__wakeup()`这两个魔术方法来自定义序列化和反序列化的行为。 - `__sleep()`:在序列化前被调用,可以决定哪些属性需要被序列化。返回的是一个包含需要序列化属性名的数组。 `...

    PHP反序列化漏洞初窥1

    在PHP的序列化和反序列化过程中,`__sleep()`和`__wakeup()`魔术方法扮演着重要的角色。 - **__sleep()**: 在序列化对象之前,PHP会尝试调用该对象的`__sleep()`方法。该方法可以用于清理对象,比如释放资源或执行...

    php学习总结.pdf

    `__sleep()`和`__wakeup()`则分别在对象串行化和反串行化时发挥作用。 7. 访问控制: `public`、`private`和`protected`定义了类成员的访问级别。`public`成员在任何地方都可以访问,`private`成员仅限于本类内部,...

    php 8 下 phpexcel 报错处理

    其次,由于PHP 8移除了`__sleep()`和`__wakeup()`魔术方法中的`serialize_callback_func`配置,可能会影响到PHPExcel的序列化和反序列化过程。如果遇到此问题,可以尝试使用其他序列化方法,如`json_encode`和`json_...

    PHP程序设计-3期(KC016) 课后习题2-2 魔术常量.doc

    最后,`Connection`类演示了如何在`__sleep()`和`__wakeup()`中处理数据库连接的序列化和反序列化,确保链接状态在序列化后能够恢复。 这些魔术方法是PHP中面向对象编程的重要组成部分,它们允许开发者实现更灵活和...

    公司面试题之-腾讯PHP工程师笔试题.doc

    魔术方法可以分为以下几类:__sleep、__wakeup、__toString、__set_state、__construct、__destruct、__call、__get、__set、__isset、__unset。这些方法可以在特定的情况下自动被调用,例如在对象被 serialize 时...

    php面向对象系列(完整)

    - `__sleep()` 和 `__wakeup()`:在序列化和反序列化过程中调用。 4. **PHP对象相关知识**: - 属性可见性:public(公共)、private(私有)、protected(受保护),控制对属性的访问权限。 - 静态属性(Static...

    php常见的魔术方法详解

    PHP中的魔术方法有 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone, __autoload  1、__get、__set  这两个方法是为在...

    详解PHP序列化和反序列化原理

    PHP中的魔术方法__sleep和__wakeup是与序列化和反序列化相关的特殊方法。__sleep方法在对象被序列化前调用,可以返回一个数组,数组中包含需要被序列化的属性名,其他属性则会被忽略。__wakeup方法在对象被反序列化...

    php单例模式实例

    4. 防止序列化和反序列化:如果允许对象被序列化和反序列化,可能会导致单例模式失效,因此我们需要封锁`__wakeup()`和`__sleep()`方法。 ```php class Singleton { // ... private function __wakeup() { ...

    PHP 魔术方法整理

    `__sleep()` 和 `__wakeup()` - 序列化和反序列化 - `__sleep()` 在序列化前被调用,可以用来清除不必要的属性或进行其他准备工作。 - `__wakeup()` 在反序列化后被调用,可以用来重新建立必要的资源连接或其他...

    反序列化漏洞原理和靶场实践

    序列化和反序列化是 PHP 中两个基本概念。序列化是将对象的状态信息转换为可以存储或传输的形式的过程,而反序列化是将存储的状态信息重新转换为对象的过程。 序列化的过程可以将对象、类、数组、变量、匿名函数等...

    PHP面向对象面试题.pdf

    此外,文件中还提到了`__sleep`和`__wakeup`魔术方法。`__sleep`在对象被序列化之前调用,而`__wakeup`在对象被反序列化后调用。这些方法通常用于清除对象的资源或准备对象被序列化。 `__toString`方法则是在对象被...

    028-精通PHP序列化与反序列化之_道_.pdf

    文章中提到,PHP中的对象可以看作是一个有属性(properties)和方法(methods)的实体。属性可以类比为现实世界中的物体属性,如人的身高、体重等。方法则是对象可以执行的操作或行为,如人的唱歌、跳舞等。类...

    php魔术函数

    `__sleep()` 和 `__wakeup()` - **定义与用途**:`__sleep()` 在序列化对象之前被调用,可以用来清理资源或者返回一个数组,包含对象中应被序列化的变量名。`__wakeup()` 在反序列化对象之后被调用,通常用于重新...

Global site tag (gtag.js) - Google Analytics