2012-07-11 69 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的方式。