可以安全地序列化类实例化并存储在file_put_contents中吗?

时间:2017-03-14 20:23:58

标签: php oop serialization

我正在尝试找到在我的项目中的所有文件中进行类实例化的最佳/最安全的方法。目前我使用以下方法。这样安全吗?我应该将它存储在$ _SESSION中吗?任何指导将不胜感激! TY!

(./classes/test-class.php)
class MyTestClass {
  private $name; 
  function __construct($newName){
    $this->name = $newName;
  }
  public function get_name(){
    return $this->name;
  }
}


(index.php)
require_once('./classes/test-class.php');
$user = new MyTestClass("Bob");
$s = serialize( $user );
file_put_contents('store-obj.php', $s);


(user-profile.php)
require_once('./classes/test-class.php');
$s = file_get_contents('store-obj.php');
$user = unserialize($s);
echo $user->get_name(); // Returns "Bob"

2 个答案:

答案 0 :(得分:0)

如果类只包含普通数据(字符串,数字,数组,其他对象),那么序列化并将其保存在文件中就可以了。

如果它包含与外部实体(例如数据库和网络连接)相关的任何动态信息,则需要在序列化时定义__sleep() and __wakeup()魔术方法以清除它,并在反序列化时恢复它。

答案 1 :(得分:0)

我想知道你想要实现什么样的功能。在文件中保留序列化实例以在请求之间共享对象将起作用,是的。您也可以将其存储在数据库中。 (并注意Barmar暗示__sleep()__wakeup)。但在大多数情况下,标准方法是使用每个新请求重新实例化您的对象。

您的文件名index.phpuser-profile.php让我怀疑您正在处理用户内容。使用您提出的解决方案,您将为每个请求加载相同的实例(无论发出请求的用户如何)。如果你正在处理某种用户对象,那可能不是你想要的。在这种情况下,您应该使用$ _SESSION作为存储。