【问题标题】:How can I store object class into a session in PHP?如何将对象类存储到 PHP 中的会话中?
【发布时间】:2011-07-31 12:34:31
【问题描述】:

如何将对象类存储到 PHP 会话中,然后在我的下一页中将其作为变量获取。你能帮忙吗?

这是我的 class.inc.php

class shop {

var $shoeType;
var $color;

    public function __construct() {

        $shoeTypeService = new ShoeTypeService();
        $shoe = $shoeTypeService->getAllShoes();
        $this->shoeType = $shoe[20];
    }
}

【问题讨论】:

标签: php


【解决方案1】:

实例化类后,您可以将其分配给会话(假设它已启动)

$_SESSION['SomeShop'] = new Shop();

or 

$Shop = new Shop();
//stuff
$_SESSION['SomeShop'] = $Shop;

请记住,无论您在何处访问该对象,都需要包含 Shop 类。

【讨论】:

  • 您可以使用session_start()开始会话
  • __auto_load 将确保包含正确的类文件
  • This answer 另有说明:在这种情况下不需要序列化。
【解决方案2】:

您不能简单地将对象实例存储到会话中。否则,该对象将无法正确显示在您的下一页中,并且将是 __PHP_Incomplete_Class 的一个实例。 为此,您需要在第一次调用中 serialize 您的对象并在接下来的调用中 unserialize 它们以使对象定义和结构保持不变。

【讨论】:

  • 序列化和反序列化由php内部处理得很好
  • 为避免 PHP_Incomplete_Class 问题,您需要一个自动加载器。
  • 只有当你没有包含所需类的文件时,你才会得到一个不完整的类。使用自动加载器或使用require_once() 之类的函数应该可以解决这个问题。
  • This answer 另有说明:在这种情况下不需要序列化。
【解决方案3】:

Jakes 回答的扩展它可以像 php 中的所有内容一样轻松完成。这是一个测试用例:

session_start();

$_SESSION['object'] = empty($_SESSION['object'])? (object)array('count' => 0) : $_SESSION['object'];
echo $_SESSION['object']->count++;

每次页面加载时,输出计数都会增加 1。 但是,当您第一次启动 $_SESSION 变量以检查它是否已设置时,您必须小心。您不想每次都重写该值。所以一定要这样做:

if (empty($_SESSION['SomeShop']))
    $_SESSION['SomeShop'] = new Shop();

或者更好:

if (!$_SESSION['SomeShop'] instanceof Shop)
    $_SESSION['SomeShop'] = new Shop();

【讨论】:

    【解决方案4】:

    使用了这个代码 第一页

    $obj = new Object();
    
    $_SESSION['obj'] = serialize($obj);
    

    在第二页

    $obj = unserialize($_SESSION['obj']);
    

    【讨论】:

    • 不起作用,它仍然在未序列化的对象中显示“__PHP_Incomplete_Class_Name”。
    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 2012-01-26
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2023-03-09
    • 2013-12-06
    相关资源
    最近更新 更多