【发布时间】:2011-08-19 03:41:37
【问题描述】:
我正在制作购物车(购物车模型)。其中一个受保护的属性是“_items”,它包含一个 Product 对象数组。它们(产品)都存储在数据库中以填充会话(使用 ZF、Zend_Session_SaveHandler_DbTable() 等)。
public function addItem(Model_Product $product, $qty)
{
$qty = (int) $qty;
$pId = $product->getId();
if ($qty > 0) {
$this->_items[$pId] = array('product' => $product, 'qty' => $qty);
} else {
// if the quantity is zero (or less), remove item from stack
unset($this->_items[$pId]);
}
// add new info to session
$this->persist();
}
在控制器中,我使用 ProductMapper 从 DB 中获取一个 Product obj 并将其提供给“addItem()”:
$product1 = $prodMapper->getProductByName('cap');
$this->_cart->addItem($product1, 2);
getProductByName() 返回一个新填充的 Model_Product 对象。
我通常会得到
Please ensure that the class definition "Model_Product" of the object you are trying to operate on was loaded _before_ ...
错误信息,会话转储明显显示
['__PHP_Incomplete_Class_Name'] => 'Model_Product'
我知道“在序列化之前声明类”。我的问题是:我如何在addItem() 中声明 Product 类,如果它首先被注入(第一个参数)?新声明(如new Model_Product())不会覆盖addItem() 中的参数(原始对象)吗?我必须在 Cart 模型中再次声明它吗?
此外,如果我...在购物车中重新声明它,我肯定会得到 Cannot redeclare class Model_Product。
【问题讨论】:
-
你在任何地方都使用 require 函数吗?
-
没有。 ZF 的自动装弹机可以解决这个问题。如果我愿意,我会得到一个
Cannot redeclare...。实际的“声明”在 ProductMapper 中,当我使用$prod = new Product(); return $prod->populate($values)检索/填充新产品时。 -
奇怪的是,我必须声明它才能正确序列化它,但不能,因为它已经声明了。我不知道在哪里重新声明它。
-
嗨,也许你在这里找到了答案或想法:stackoverflow.com/questions/5755473/…
-
我想我明白了。在 ZF 的引导程序中,会话初始化先于自动加载。我现在无法发布答案(SO 延迟 8 小时),但我会尽快发布。
标签: php session serialization object-serialization