4

I am trying to get the the string "this info" inside this object lets call it $object, but data is protected, how can I access that pocket?

    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) {

Obviously $object->_data gives me an errorCannot access protected property

ThomasReggi
  • 55,053
  • 85
  • 237
  • 424

4 Answers4

6

There are a few alternative ways to get a private/protected properties of an object that doesn't require you to modify the original source code.

Option 1 - Reflection:

Wikipedia defines Reflection as

... the ability of a computer program to examine and modify the structure and behavior (specifically the values, meta-data, properties and functions) of the program at runtime. [Reflection (computer_programming)]

In this case you may want to use reflection to examine the properties of the object and set as accessible the protected property _data

I do not recommend reflection unless you have very specific use cases where it may be required. This is an example on how to get your private/protected parameter using Reflection with PHP:

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

Option 2 - Subclasses (protected properties only):

If the class is not final, you can create a subclass of the original. This will give you access to the protected properties. In the subclass you could write your own getter methods:

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

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

Hope this helps.

Onema
  • 7,331
  • 12
  • 66
  • 102
4

If you - or the writer of the class - want other people to have access to a protected or private property, you need to provide that via a getter method in the class itself.

So in the class:

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

And in your program:

$object->getData();
jeroen
  • 91,079
  • 21
  • 114
  • 132
0

To retrieve a protected property you can use the ReflectionProperty interface.

The phptoolcase has a fancy method for this task:

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
Charlie
  • 61
  • 3
0

You can use the famous getters and setters methods to private/protected properties. Ex:

<?php

class myClass
{
    protected $helloMessage;

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

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

?>

Greetings,

Estefano.

Estefano Salazar
  • 419
  • 4
  • 15