如何在序列化期间隐藏 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
只是很好地理解散列和加密数据之间的区别
对于简单的解决方案,您还可以使用 __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');
}
}
我可以将负责序列化的函数和 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
只是很好地理解散列和加密数据之间的区别
对于简单的解决方案,您还可以使用 __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');
}
}