PHP/Magento:有可能编辑一个“;“受保护”;对象中的成员


PHP/Magento: Is it possible to edit a "protected" member in an object?

我有兴趣修改这个对象中的一些受保护的值。更具体地说,如果可能的话,我想根据method修改price。。此对象是从XML运费请求到UPS的响应。我遇到的问题是,不同方法的返回率不是我所需要的。我没有提供具体的尺寸(确切的数字不可用于任意请求),所以除了UPS Ground之外的任何方法都会产生不合适的价格。请注意,一种解决方案是首先在XML请求中为它提供一些估计的维度(我正在以这种方式进行测试),但我也想知道如何处理这个对象。

我试图简单地访问这个对象中的一些值,但它似乎受到了保护,它们不会打印到浏览器中?我试过$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
            (
            )
        )
....
)

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

这意味着你可能会得到这样的东西:

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

更改价格的方法记录在Magento文档中。

但是,使用"反射"通常可以更改特性/方法的可见性。

例如,您可以使用以下内容:

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

但是,这通常不是你想要的方式!这不是OOP方式。