【问题标题】:Safe to serialize class instantiation and store in file_put_contents?序列化类实例化并存储在 file_put_contents 中是否安全?
【发布时间】:2017-08-05 08:56:21
【问题描述】:

我正在尝试找到最好/最安全的方式来在我的项目中的所有文件中携带我的类实例化。目前我正在使用以下方法。这安全吗?我应该将它存储在 $_SESSION 中吗?任何指导将不胜感激!太棒了!

(./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"

【问题讨论】:

  • 根据$user的用途,我相信你应该把它存储在$_SESSION,另外php文件是编程文件,不仅仅是普通的文本文件或数据文件,如果你绝对需要存储它(也许您想要跨会话的信息)将其存储在普通文件、数组等中

标签: php oop serialization


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多