获取类方法
如果您只想知道可以调用哪些方法$item
,请使用
var_dump(get_class_methods($item));
获取类方法列表。
识别类文件
如果你想知道哪个文件包含 的类定义$item
,首先使用
var_dump(get_class($item));
获取类名(Mage_Sales_Model_Quote_Item
在这种情况下)。
_
然后用斜杠 ( )替换所有下划线 ( )/
并附.php
加到它。这将为您提供类文件的相对文件路径(Mage/Sales/Model/Quote/Item.php
在本例中)。
现在检查文件夹
app/code/local/
app/code/community/
app/code/core/
lib/
按照给定的相对路径的顺序。第一个匹配通常是你想要的类文件。
创建访问自定义报价属性的方法
你不必。Magento 将为您执行此操作。
像许多其他 Magento 模型一样,报价对象基于Varien_Object
. 后者提供了一种_call()
方法,这是 PHP 的神奇方法之一:
public function __call($method, $args)
{
switch (substr($method, 0, 3)) {
case 'get' :
//Varien_Profiler::start('GETTER: '.get_class($this).'::'.$method);
$key = $this->_underscore(substr($method,3));
$data = $this->getData($key, isset($args[0]) ? $args[0] : null);
//Varien_Profiler::stop('GETTER: '.get_class($this).'::'.$method);
return $data;
case 'set' :
//Varien_Profiler::start('SETTER: '.get_class($this).'::'.$method);
$key = $this->_underscore(substr($method,3));
$result = $this->setData($key, isset($args[0]) ? $args[0] : null);
//Varien_Profiler::stop('SETTER: '.get_class($this).'::'.$method);
return $result;
case 'uns' :
//Varien_Profiler::start('UNS: '.get_class($this).'::'.$method);
$key = $this->_underscore(substr($method,3));
$result = $this->unsetData($key);
//Varien_Profiler::stop('UNS: '.get_class($this).'::'.$method);
return $result;
case 'has' :
//Varien_Profiler::start('HAS: '.get_class($this).'::'.$method);
$key = $this->_underscore(substr($method,3));
//Varien_Profiler::stop('HAS: '.get_class($this).'::'.$method);
return isset($this->_data[$key]);
}
throw new Varien_Exception("Invalid method ".get_class($this)."::".$method."(".print_r($args,1).")");
}
现在,当您想在报价对象中包含自定义数据时,您只需调用
$quote->setMyCustomAttribute(911);
在这样的调用中,PHP 将检查引用对象中定义的方法setMyCustomAttribute()
。如果找不到这样的方法,它会检查对象是否有魔法__call()
方法并调用这个方法。
在我们的示例中,将匹配的set
大小写。__call()
现在发生的事情是,Magento 首先将驼峰式字符串setMyCustomAttribute
转换为带下划线的键my_custom_attribute
。然后它将值存储911
到受保护的属性Varien_Object::_data['my_custom_attribute']
中。
要从报价对象中读取自定义数据,您可以简单地调用
$value = $quote->getMyCustomAttribute();
原理是一样的:getMyCustomAttribute
转换成my_custom_attribute
,返回当前值Varien_Object::_data['my_custom_attribute']
。
这就是所有的魔法。
但请注意,这只是暂时的。如果您希望能够保存/加载自定义属性,则需要扩展报价对象。但那是另一回事了。