【问题标题】:Other reasons for __PHP_Incomplete_Class__PHP_Incomplete_Class 的其他原因
【发布时间】:2015-03-07 13:17:46
【问题描述】:

问题: 在这种情况下,如何避免获得 PHP Incomplete Class?

背景: 该代码是一个从表单接收 POST 变量的脚本,对 \$_SESSION['objectCart'] 执行一些操作,最后将访问者重定向到另一个页面。 $_SESSION['objectCart'] 包含文件中定义的“购物车”类的实例

__DIR__ . $lib . 'user.class.php'    

当我运行脚本时,它会停止,进一步调查显示 __PHP__Incomplete 类。

我的代码:

require_once __DIR__ . $lib . 'utility.class.php';
require_once __DIR__ . $lib . 'productcatalog.class.php';
require_once __DIR__ . $lib . 'user.class.php';
require_once __DIR__ . $lib . 'cart.class.php';

session_start();

print_r( $_SESSION['objectCart'] );

HTML 输出:

__PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => cart [itemsExtended:protected] => Array ( [0] => Array ( [item_name] => ...

解决方案 - 部分:

一个会话已经开始,因为它通常是有这个问题的。它是通过放置来识别的

echo session_id(); 

在购物车类启动之前。

【问题讨论】:

  • 嗨@MagnusN 参考这里:- stackoverflow.com/questions/2010427/…
  • 我不确定您是否真的需要您正在尝试做的事情,但不是将原始实例保存到会话中,而是将其序列化保存
  • __php_incomplete 类在反序列化失败时创建。
  • 我尝试使用序列化/反序列化命令,但没有成功。输出没有改变。奇怪的是,这个脚本已经运行了 6 个多月,在昨天之前从来没有出现过这样的问题。
  • 也许会话在您调用 session_start() 之前(重新)开始了?可能是在您的代码之前执行的另一个脚本(文件),可能由自动加载器触发,可能 session.auto_start 已设置或...其他东西。仅出于测试目的,您可以在 session_start 之前添加对session_id() 的调用。如果它返回不同于空字符串的内容,则会话已经在运行。

标签: php class session


【解决方案1】:

cmets 中提到了一个很好的重复项,正如我评论的那样,您可能想在此处使用 serialize(),但是我发现很少有充分的理由在会话中保存对象以供进一步使用。

我宁愿将创建对象所需的东西存储在会话中,然后从单个入口点注册必要的对象。其中,使用数据库保存需要的字段,并且只在会话中存储一个标识符。

假设您需要在成功登录后通过所有应用程序获取当前登录用户的信息。我不会将User 类的实例分配到会话中,而是将其详细信息存储到会话中,并在每次请求新页面时构造对象。

如果您存储标识符并查询数据库以在每次刷新时为用户获取所有其他信息,这可能会增加额外的开销,但如果我真的没有看到显着的应用程序变慢,我仍然会这样做.

ma​​in_entry_point.php:

if (isset($_SESSION['user_id'])) {
    $row = $db->query("SELECT name, email, age, role_id FROM users WHERE id = " . $_SESSION['user_id']);
    $user = new User($row['name'], $row['email'], $row['age'], $row['role_id']);
}

这里可能有很多进一步的糖,例如将用户实例注入到您的应用程序类(如果有的话)等等,所以您将无法使用全局变量($user 在这种情况下是一个伪对我来说是全局变量,因为你有一个主入口点,每次刷新都包含它,比如 MVC 框架中的 index.php ),但这在这里不相关,重点是长话短说 - 从特定的注册你的购物车对象存储在会话中的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多