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

时间:2017-06-21 11:07:47

标签: php serialization getter-setter

我可以覆盖对序列化和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);

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

您可以覆盖方法

请看下面的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_dump返回User->serialize方法,并且密码将会显示。

如果您需要所有课程,则加密或散列您需要隐藏的所有变量。

以下是密码学中两种着名(但不安全)的方法:MD5 Ceaser cipher

完全理解散列和加密数据之间的区别

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

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

答案 2 :(得分:0)

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

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