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