【问题标题】:Change protected value in object (PHP)更改对象中的受保护值 (PHP)
【发布时间】:2013-11-12 14:52:36
【问题描述】:

当我对数组 $mailer 进行 var_dump 时,我得到:

object(Fooman_EmailAttachments_Model_Core_Email_Template_Mailer)#352 (8) {
["_emailInfos":protected]=>
array(3) {
[0]=>
object(Mage_Core_Model_Email_Info)#409 (11) {
["_bccNames":protected]=>
array(0) {
}
["_bccEmails":protected]=>
array(0) {
}
["_toNames":protected]=>
array(1) {
[0]=>
string(13) "My Name"
}
["_toEmails":protected]=>
array(1) {
[0]=>
string(17) "justatest@test.com"
}
["_data":protected]=>
array(0) {
}
["_hasDataChanges":protected]=>
bool(false)
["_origData":protected]=>
NULL
["_idFieldName":protected]=>
NULL
["_isDeleted":protected]=>
bool(false)
["_oldFieldsMap":protected]=>
array(0) {
}
["_syncFieldsMap":protected]=>
array(0) {
}
}

我想编辑_toEmails,但如何访问和编辑它?

【问题讨论】:

  • 你不能直接这样做。我不知道您正在使用的库,但它可能有一个 setter 方法来更改此值,例如 $object->setToEmails
  • 它不是一个数组而是一个对象。请向我们展示Fooman_EmailAttachments_Model_Core_Email_Template_Mailer 类的代码,可能该属性有一个setter 方法。

标签: php object visibility


【解决方案1】:

这是一个非常简单的示例(没有错误检查),说明如何使用 ReflectionClass 执行此操作:

function setProtectedProperty($obj, $property, $value) {
  $reflection = new ReflectionClass($obj);
  $property = $reflection->getProperty($property);
  $property->setAccessible(true);
  return $property->setValue($obj, $value);
}

setProtectedProperty($mailer, '_toEmails', ['foo@bar.com']);

【讨论】:

    【解决方案2】:

    我不必告诉你隐藏它可能是有原因的,而且很可能有一种方法可以在不直接访问它的情况下设置它(正如其他人确保告诉你的那样),但是你可以扩展该类并添加您自己的设置方法:

    <?php
        class Foo {
            protected $_destroyDatabase = false;
        }
    
        class Bar extends Foo {
            public function SetDestroyDatabase($destroyDatabase) {
                $this->_destroyDatabase = $destroyDatabase;
            }
        }
    
        $foo = new Foo();
        $foo->_destroyDatabase = true; //Fatal error
        var_dump($foo);
        /*
            object(Foo)#1 (1) {
              ["_destroyDatabase:protected"]=>
              bool(false)
            }
        */
    
        $bar = new Bar();
        $bar->SetDestroyDatabase(true); //Success
        var_dump($bar);
        /*
            object(Bar)#2 (1) {
              ["_destroyDatabase:protected"]=>
              bool(true)
            }
        */
    ?>
    

    DEMO

    【讨论】:

      【解决方案3】:

      阅读Fooman_EmailAttachments_Model_Core_Email_Template_Mailer 类的文档。应该有一个方法你可以调用来编辑信息,
      类似$mailer-&gt;setEmails('foo')。如果没有,则数据不应被修改。

      【讨论】:

        猜你喜欢
        • 2012-03-28
        • 2019-05-21
        • 2018-03-12
        • 2018-06-30
        • 2012-12-23
        • 1970-01-01
        • 2014-10-15
        • 2018-07-19
        • 1970-01-01
        相关资源
        最近更新 更多