PHP类不完整的其他原因

PHP类不完整的其他原因,php,class,session,Php,Class,Session,问题: 在这种情况下,如何避免得到PHP不完整的类I 背景: 代码是从表单接收POST变量的脚本,在\$\u会话['objectCart']上执行一些操作,最后将访问者重新定向到另一个页面。 $\u会话['objectCart']包含文件中定义的'cart'类的实例 __DIR__ . $lib . 'user.class.php' 当我运行这个脚本时,它停止了,进一步的调查揭示了_PHP__不完整的类 我的代码: require_once __DIR__ . $lib . 'util

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

背景: 代码是从表单接收POST变量的脚本,在\
$\u会话['objectCart']
上执行一些操作,最后将访问者重新定向到另一个页面。
$\u会话['objectCart']
包含文件中定义的'cart'类的实例

__DIR__ . $lib . 'user.class.php'    
当我运行这个脚本时,它停止了,进一步的调查揭示了_PHP__不完整的类

我的代码:

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] => ...
解决方案-部分:

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']);
}
与此问题的正常情况一样,会话已启动。通过放置

echo session_id(); 

在启动cart类之前。

注释中提到了一个非常好的副本,正如我所评论的,您可能希望在这里使用
serialize()
,但是我发现很少有好的理由在会话中保存对象以供进一步使用

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

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

如果存储标识符并在每次刷新时查询数据库以获取用户的所有其他信息,可能会增加额外的开销,但如果我真的没有看到显著的应用程序速度减慢,我还是会选择它

main\u entry\u 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),但这与此处无关,重点是长话短说-从会话中存储的特定内容注册您的购物车对象。

Hi@MagnusN请参阅此处:-我不确定您是否真的需要尝试执行的操作,但不是将原始实例保存到会话中,save it serialized__php_未序列化的类是在未序列化失败时创建的。我尝试使用serialize/unserialize命令,但没有成功。输出没有改变。奇怪的是,在昨天之前,这个脚本已经运行了6个多月了,从来没有出现过这样的问题。也许在调用session_start()之前,会话(重新)启动了?可能是在代码之前执行的另一个脚本(文件),可能是由自动加载器触发的,可能是设置了session.auto_start或…其他内容。仅出于测试目的,您可以在会话开始之前添加对会话id()的调用。如果返回的内容不同于空字符串,则会话已在运行。