如何在序列化期间隐藏 class 的属性?

how to hide properties of class during serialization?

我可以将负责序列化的函数和 Php class 重写为 array/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);

实施 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);
    }
}

您可以覆盖一个方法

看看下面classe的小例子;

 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_dumpUser->serialize方法的return,密码不会显示。

如果您需要所有 class,那么加密或散列您需要隐藏的所有变量。

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

只是很好地理解散列和加密数据之间的区别

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

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

对于简单的解决方案,您还可以使用 __sleep 魔术方法。

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');
    }
}