在受保护对象中获取字符串

Tho*_*ggi 4 php object

我试图让这个对象里面的字符串"this info"让我们调用它$object,但数据受到保护,我该如何访问那个口袋?

    object(something)#29 (1) {
  ["_data":protected]=>
  array(10) {
    ["Id"]=>
    array(1) {
      [0]=>
      string(8) "this info"
    }
    ["SyncToken"]=>
    array(1) {
      [0]=>
      string(1) "0"
    }
    ["MetaData"]=>
    array(1) {
Run Code Online (Sandbox Code Playgroud)

显然$object->_data给了我一个错误Cannot access protected property

One*_*ema 6

有一些替代方法可以获取对象的私有/受保护属性,而不需要您修改原始源代码.

选项1 - 反思:

维基百科将反思定义为

...计算机程序在运行时检查和修改程序的结构和行为(特别是值,元数据,属性和函数)的能力.[反思(computer_programming)]

在这种情况下,您可能希望使用反射来检查对象的属性,并将其设置为可访问受保护的属性_data

除非您有可能需要的非常具体的用例,否则我不建议使用反射.这是一个如何使用Reflection with PHP获取私有/受保护参数的示例:

$reflector = new \ReflectionClass($object);
$classProperty = $reflector->getProperty('_data');
$classProperty->setAccessible(true);
$data = $classProperty->getValue($object);
Run Code Online (Sandbox Code Playgroud)

选项2 - 子类(仅限受保护的属性):

如果类不是final,则可以创建原始的子类.这将使您可以访问受保护的属性.在子类中,您可以编写自己的getter方法:

class BaseClass
{
    protected $_data;
    // ...
}

class Subclass extends BaseClass
{
    public function getData()
    {
        return $this->_data
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.