2012-07-11 38 views
1

我很想修改此对象中的一些受保护值。更具体地说,如果可能的话,我想修改price,具体取决于method。此对象是从XML运输速率请求到UPS的响应。我遇到的问题是,针对不同方法返回的费率并非我所需。我不提供具体的尺寸(确切的数字不可用于任意的请求),因此除了UPS Ground以外的任何方法都会产生不合适的费率。请注意,一种解决方案是首先在XML请求中给它一些估计的维度(我正在以这种方式进行测试),但我想知道如何使用此对象。PHP/Magento:是否可以编辑对象中的“受保护”成员?

我试图简单地访问此对象内的一些值,但它似乎被保护,它们不打印到浏览器?我试过$object->_rates[0]$object->{_rates[0]}但他们不打印任何东西。有人能够在修改此对象中的price值时指向正确的方向吗?

$object = 
Mage_Shipping_Model_Rate_Result Object 
(
    [_rates:protected] => Array 
    (
      [0] => Mage_Shipping_Model_Rate_Result_Method Object 
      (
       [_data:protected] => Array 
       (
        [carrier] => ups 
        [carrier_title] => UPS 
        [method] => 03 
        [method_title] => UPS Ground 
        [cost] => 8.9 
        [price] => 8.9 
       ) 
      [_hasDataChanges:protected] => 1 
      [_origData:protected] => 
      [_idFieldName:protected] => 
      [_isDeleted:protected] => 
      [_oldFieldsMap:protected] => Array 
      (
      ) 
      [_syncFieldsMap:protected] => Array 
      (
      ) 
     ) 
.... 
) 

回答

3

通常受保护的属性受到保护是有原因的。有一种方法getAllRates(),它允许你编辑你想要的。

这意味着你可能会得到这样的事情:

foreach($object->getAllRates() as $rate) { 
    $rate->setPrice($rate->getPrice() * 123); 
} 

改价格的方法,该Magento Documentation被记录在案。

但是,通过Reflection可以改变一般财产/方法的可见性。

例如,你可以使用这个:

$object = new Mage_Shipping_Model_Rate_Result(); 
$rp = new ReflectionProperty($object, '_rates'); 
$rp->setAccessability(true); 

但尽管如此,这通常不是你想要做到这一点的方式!这不是OOP的方式。