__PHP_Incomplete_Class 的其他原因

Other reasons for __PHP_Incomplete_Class

问题: 在这种情况下,如何避免得到 PHP 不完整 Class?

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

中定义的 'cart' class 的一个实例
__DIR__ . $lib . 'user.class.php'    

当我运行脚本时它停止了,进一步调查显示 __PHP__Incomplete Class.

我的代码:

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(); 

在购物车-class 启动之前。

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

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

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

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

main_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']);
}

这里可以有很多额外的好处,比如将用户实例注入你的应用程序 class 如果你有一个,等等,所以你不会使用全局变量($user 在这种情况下对我来说是一个伪全局变量,因为你有一个主入口点,它包含在每次刷新中,就像 MVC 框架中的 index.php 一样),但这在这里不相关,重点是长话短说简而言之 - 从会话中存储的特定事物注册您的购物车对象。