在会话中序列化对象时PHP类不完整

在会话中序列化对象时PHP类不完整,php,session,serialization,object-serialization,Php,Session,Serialization,Object Serialization,我正在做一个购物车(购物车模型)。它的一个受保护的属性是“_items”,它包含一个产品对象数组。它们(产品)都存储在DB中,用于填充会话(使用ZF、Zend_session_SaveHandler_DbTable()等) 在控制器中,我使用ProductMapper从DB中获取一个Product obj,并将其提供给“addItem()”: getProductByName()返回新填充的模型\u产品对象 我通常会得到 请确保您尝试操作的对象的类定义“Model\u Product”已在加载

我正在做一个购物车(购物车模型)。它的一个受保护的属性是“_items”,它包含一个产品对象数组。它们(产品)都存储在DB中,用于填充会话(使用ZF、Zend_session_SaveHandler_DbTable()等)

在控制器中,我使用ProductMapper从DB中获取一个Product obj,并将其提供给“addItem()”:

getProductByName()
返回新填充的模型\u产品对象


我通常会得到

请确保您尝试操作的对象的类定义“Model\u Product”已在加载之前加载。

错误消息,会话转储明显显示

[''PHP\u不完整的类名称']=>“模型产品”


我知道“在序列化类之前声明类”。我的问题是:如果产品类首先被注入(第一个参数),如何在
addItem()
中声明它?新声明(如
newmodel\u Product()
)不会覆盖
addItem()
中的参数(原始对象)吗?我必须在购物车模型中再次声明它吗


此外,如果我。。。在购物车中重新声明。

在ZF的引导程序中,会话在自动加载之前启动

    /**
     * Make XXX_* classes available
     */
    protected function _initAutoloaders()
    {
        $loader = new Zend_Application_Module_Autoloader(array(
                    'namespace' => 'XXX',
                    'basePath' => APPLICATION_PATH
                ));
    }

    public function _initSession()
    {
        $config = $this->_config->custom->session;

        /**
         * For other settings, see the link below:
         * http://framework.zend.com/manual/en/zend.session.global_session_management.html
         */
        $sessionOptions = array(
            'name'             => $config->name,
            'gc_maxlifetime'   => $config->ttl,
            'use_only_cookies' => $config->onlyCookies,
//            'strict'           => true,
//            'path'             => '/',
        );

        // store session info in DB
        $sessDbConfig = array(
            'name'           => 'xxx_session',
            'primary'        => 'id',
            'modifiedColumn' => 'modified',
            'dataColumn'     => 'data',
            'lifetimeColumn' => 'lifetime'
        );

        Zend_Session::setOptions($sessionOptions);
        Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($sessDbConfig));
        Zend_Session::start();
    }
当我得到我所说的错误时,方法声明是另一种方式:
\u initSession()
首先是,然后是
\u initAutoloaders()
——这就是ZF处理它们的确切顺序


我将测试更多,但这似乎有效(而且合乎逻辑)。谢谢您的建议。

您是否在任何地方使用require函数?没有。ZF的autoloader会处理这个问题。如果我愿意,我会得到一个
无法重新声明的…
。当我使用
$prod=new Product()检索/填充新产品时,实际的“声明”在ProductMapper中;return$prod->populate($values)
。奇怪的是我必须声明它才能正确地将其序列化,但不能,因为它已经声明了。我不知道在哪里重新申报。嗨,也许你能在这里找到答案或想法:我想我知道了。在ZF的引导中,会话初始化是在自动加载之前进行的。我现在无法发布答案(因此延迟了8小时),但我会尽快发布。先生,你是救命恩人。我花了2个小时的大部分时间试图了解Zend_Auth到底发生了什么,结果发现它是模块引导中的模块自动加载程序!非常感谢。我不确定在ZF文档/示例中,会话是在自动加载程序之前完成的,还是没有指定,大多数开发人员都认为,因为您希望会话_start()尽早启动,这是引导程序中的第一个函数,但我们已经接管了至少十二个在自动加载程序之前有会话的项目。
    $product1 = $prodMapper->getProductByName('cap');
    $this->_cart->addItem($product1, 2);
    /**
     * Make XXX_* classes available
     */
    protected function _initAutoloaders()
    {
        $loader = new Zend_Application_Module_Autoloader(array(
                    'namespace' => 'XXX',
                    'basePath' => APPLICATION_PATH
                ));
    }

    public function _initSession()
    {
        $config = $this->_config->custom->session;

        /**
         * For other settings, see the link below:
         * http://framework.zend.com/manual/en/zend.session.global_session_management.html
         */
        $sessionOptions = array(
            'name'             => $config->name,
            'gc_maxlifetime'   => $config->ttl,
            'use_only_cookies' => $config->onlyCookies,
//            'strict'           => true,
//            'path'             => '/',
        );

        // store session info in DB
        $sessDbConfig = array(
            'name'           => 'xxx_session',
            'primary'        => 'id',
            'modifiedColumn' => 'modified',
            'dataColumn'     => 'data',
            'lifetimeColumn' => 'lifetime'
        );

        Zend_Session::setOptions($sessionOptions);
        Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($sessDbConfig));
        Zend_Session::start();
    }