Получить строку внутри защищенного объекта - PullRequest
4 голосов
/ 29 марта 2012

Я пытаюсь получить строку «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 ]

6 голосов
/ 04 июня 2014

Есть несколько альтернативных способов получить закрытые / защищенные свойства объекта, которые не требуют изменения исходного кода.

Вариант 1 - Отражение :

Википедия определяет отражение как

... способность компьютерной программы проверять и изменять структуру и поведение (в частности, значения, метаданные, свойства и функции) программы во время выполнения. [Reflection (computer_programming)]

В этом случае вы можете использовать отражение для проверки свойств объекта и установить в качестве доступное защищенное свойство _data

Я не рекомендую рефлексию, если у вас нет особых случаев использования, где это может потребоваться. Это пример того, как получить ваш закрытый / защищенный параметр, используя Reflection с PHP:

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

Вариант 2 - Подклассы (только защищенные свойства):

Если класс не final , вы можете создать подкласс оригинала. Это даст вам доступ к защищенным свойствам. В подклассе вы можете написать свои собственные методы получения:

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

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

Надеюсь, это поможет.

4 голосов
/ 29 марта 2012

Если вы - или автор класса - хотите, чтобы другие люди имели доступ к защищенному или частному свойству, вы должны предоставить его через метод получения в самом классе.:

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

А в вашей программе:

$object->getData();
0 голосов
/ 09 ноября 2014

Для получения защищенного свойства вы можете использовать интерфейс 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
0 голосов
/ 29 марта 2012

Вы можете использовать известные методы получения и установки для приватных / защищенных свойств.Пример:

<?php

class myClass
{
    protected $helloMessage;

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

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

?>

Привет,

Эстефано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...