【问题标题】:how to hide properties of class during serialization?如何在序列化过程中隐藏类的属性?
【发布时间】:2017-06-21 11:07:47
【问题描述】:

我可以重写负责序列化和 Php 类到数组/stdclass 的函数,以便我可以实现自己的逻辑“比如根据条件隐藏某些属性)

class UserModel{
  $hidden = ['password'];

  function __construct(array $data) {
    foreach($data as $key=>$value)$this->$key = $value;
  }

}

$user = new UserModel(['id'=>1,'password'=>123]);

var_dump($user);

【问题讨论】:

    标签: php serialization getter-setter


    【解决方案1】:

    如何实现Serializable interface? 看起来您可以通过实现接口方法来执行自定义逻辑。

    例子:

    class UserModel implements Serializable {
    
        // returns string
        public function serialize() {
            $data = array(
                'id' => $this->id,
                'password' => null, // or omit password
                'email' => $this->email,
                ...
            );
            return serialize($data);
        }
    }
    

    【讨论】:

    • 干杯! thatns 没有接口名称,非常感谢
    【解决方案2】:

    你可以覆盖一个方法

    看看下面这个类的小例子;

     class User { 
     //To hide
     private $pass;
    
     //To show
     private $log;
     private $nbPoints;
    
      {...}
      public function serialize()
      {
        $arr = [];
        $arr['LOG'] = $this->log;
        $arr['POINTS'] = $this->nbPoints;
        return ($arr);
      }
    }
    

    你可以var_dump User->serialize方法的返回值,密码不会显示出来。

    如果你需要你的所有类,然后加密或散列你需要隐藏的所有变量。

    这是密码学中两个著名(但不安全)的方法:MD5Ceaser cipher

    只需了解散列和加密数据之间的区别

    (哈希:https://en.wikipedia.org/wiki/MD5);

    (加密:https://en.wikipedia.org/wiki/Caesar_cipher);

    【讨论】:

    • 问题是我无法控制此类可能被序列化的方式和时间,所以我想覆盖 php 默认的序列化方法
    • 我不建议您这样做,而是使用加密或散列方法来隐藏特定数据
    【解决方案3】:

    对于简单的解决方案,您还可以使用 __sleep Magic Method。

    https://www.php.net/manual/en/language.oop5.magic.php

    class UserModel {
        protected $id;
        protected $password;
        protected $username;
        protected $email;
    
        public function __sleep(){
           return array('id','username','email');
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-23
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多