__PHP_Incomplete_Class的其他原因

时间:2015-01-09 08:54:24

标签: php class session

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

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

中定义的'cart'类的实例
__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] => ...

解决方案 - PARTIAL:

会话已经开始,因为通常是这个问题。它是通过放置

来确定的
echo session_id(); 

在购物车课程开始之前。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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