如何在php中保存对象状态


how to save object state in php

我有3个文件

  1. class.myclass.php
  2. test1.php
  3. test2.php

class.myclass.php包含

class myclass
    {
    public $value;
    function assign($input)
        {
        $this->value=$input;
        }
    function show()
        {
        echo $this->value;
        }
    }
$obj=new myclass();

test1.php包含

require("class.myclass.php");
$obj->assign(1);
$obj->show();

test2.php包含

require("class.myclass.php");
$obj->show();

在test2.php中$obj->show();方法没有显示$obj->assign(1);方法在test1.php中分配的值

我认为当我运行test2.php的对象$obj得到再次创建,所以分配的值离开。是否有办法保存对象的状态,以便我可以从其他php页面使用

非常感谢你的帮助。谢谢! !

最简单的方法是将对象以序列化的形式保存在$_SESSION变量中,这样它就会在您的站点点击之间自动保存。

test1.php:

session_start();
require('class.myclass.php');
$obj->assign(1);
$_SESSION['myobj'] = serialize($obj);

test2.php:

session_start();
$obj = unserialize($_SESSION['myobj']);
$obj->show();

对于这样一个简单的对象,这就是所需要的。如果你的对象包含资源句柄(mysql连接,curl对象等),那么你需要一些额外的逻辑在那里处理恢复这些连接,当对象在反序列化时被恢复。

但是,您可能希望重新考虑在类文件中自动实例化您的对象,或者至少使其成为单例对象,这样您的类文件可以包含在多个地方,而不会在每次重新包含该文件时覆盖最后一次的$obj。

我在项目中使用的一种技术是创建一个好的类构造函数。我的意思是创建一个可以用单个参数重新创建相同对象的构造函数。

例如:

class User {
    public $email;
    public $username;
    public $DOB;
    function __construct($input) {
        // by providing a single input argument, we can re-create the object...
        $this->email    = $input;
        $userData       = $this->getUserData();
        $this->username = $userData['username'];
        $this->DOB      = $userData['DOB'];
    }
    function getUserData() {
        $email = $this->email;
        $array = ["username" => "", "DOB" => ""];
        // Database query/queries to get all user info for $email go here...
        return $array;
    }
}

现在您可以重新创建对象,如果您将$email存储为$_SESSION变量,例如:

file1.php

<?php
    session_start();
    $email = "hi@example.com";
    $_SESSION['user'] = $email;

php

<?php
    session_start();
    include('User.class.php'); // this is the class example above
    $email = $_SESSION['user'];
    $userObject = new User($email);
    // now you can access the object again as you need...
    // for example:
    $username = $userObject->username;
    echo "Welcome back " . $username;