如何在php中保存对象状态

时间:2011-04-22 18:33:39

标签: php class object methods state

我有3个文件

  1. class.myclass.php
  2. test1.php
  3. test2.php
  4. 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页面

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

2 个答案:

答案 0 :(得分:5)

最简单的方法是将对象以序列化形式保存在$ _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获取每次重新包含文件时都会覆盖。

答案 1 :(得分:1)

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

例如:

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;

<强> file2.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;