我试图在此对象中获取字符串“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
答案 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