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

时间:2012-03-29 18:01:23

标签: 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) {

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

4 个答案:

答案 0 :(得分:6)

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

选项1 - Reflection

维基百科将反思定义为

  

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

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

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

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

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

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

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

class Subclass extends BaseClass
{
    public function getData()
    {
        return $this->_data
    }
}

希望这会有所帮助。

答案 1 :(得分:4)

如果您 - 或者班级作者 - 希望其他人可以访问受保护或私有财产,您需要通过类本身的getter方法提供。

所以在课堂上:

public function getData()
{
  return $this->_data;
}

在您的计划中:

$object->getData();

答案 2 :(得分:0)

您可以将着名的getter和setter方法用于私有/受保护的属性。 例如:

<?php

class myClass
{
    protected $helloMessage;

    public function getHelloMessage()
    {
        return $this->helloMessage;
    }

    public function setHelloMessage( $value )
    {
        //Validations
        $this->helloMessage = $value;
    }
}

?>

问候,

埃斯特凡诺。

答案 3 :(得分:0)

要检索受保护的属性,可以使用ReflectionProperty接口。

phptoolcase对此任务有一种奇特的方法:

public static function getProperty( $object , $propertyName )
        {
            if ( !$object ){ return null; }
            if ( is_string( $object ) ) // static property
            {
                if ( !class_exists( $object ) ){ return null; }
                $reflection = new \ReflectionProperty( $object , $propertyName );
                if ( !$reflection ){ return null; }
                $reflection->setAccessible( true );
                return $reflection->getValue( );
            }
            $class = new \ReflectionClass( $object );
            if ( !$class ){ return null; }
            if( !$class->hasProperty( $propertyName ) ) // check if property exists
            {
                trigger_error( 'Property "' . 
                    $propertyName . '" not found in class "' . 
                    get_class( $object ) . '"!' , E_USER_WARNING );
                return null;
            }
            $property = $class->getProperty( $propertyName );
            $property->setAccessible( true );
            return $property->getValue( $object );
        }


$value = PtcHandyMan::getProperty( $your_object , ‘propertyName’);

$value = PtcHandyMan::getProperty( ‘myCLassName’ , ‘propertyName’); // singleton