Получить строку в защищенном объекте

Я пытаюсь получить строку «эта информация» внутри этого объекта, позвонив ему в $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

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

Итак, в классе:

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

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

 $object->getData(); 

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

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

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

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

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

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

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

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

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

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

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

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

 <?php class myClass { protected $helloMessage; public function getHelloMessage() { return $this->helloMessage; } public function setHelloMessage( $value ) { //Validations $this->helloMessage = $value; } } ?> 

Приветствую,

Estefano.

Чтобы получить защищенное свойство, вы можете использовать интерфейс 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