我正在尝试使用Reflection获取类的所有属性,但是某些属性仍然在混乱。
这是我的代码中发生的一个小例子
Class Test {
public $a = 'a';
protected $b = 'b';
private $c = 'c';
}
$test = new Test();
$test->foo = "bar";
所以此时我的 $ test 对象有4个属性(a,b,c和foo)。
foo 属性被视为公共属性,因为我可以
echo $test->foo; // Gives : bar
相反, b 或 c 被视为私有财产
echo $test->b; // Gives : Cannot access protected property Test::$b
echo $test->c; // Gives : Cannot access private property Test::$c
我尝试了两个解决方案来获取 $ test 对象的所有属性(a,b,c和foo)
第一个
var_dump(get_object_vars($test));
哪个给出了
array (size=2)
'a' => string 'a' (length=1)
'foo' => string 'bar' (length=3)
第二个解决方案
$reflection = new ReflectionClass($test);
$properties = $reflection->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PRIVATE | ReflectionProperty::IS_PROTECTED);
foreach($properties as $property) {
echo $property->__toString()."<br>";
}
哪个给出了
Property [ public $a ]
Property [ protected $b ]
Property [ private $c ]
在第一种情况下,缺少私有属性,在第二种情况下,“实例化后”属性丢失。
我不知道如何获得所有财产? (最好是反思,因为我也想知道一个财产是公共的,私人的...)
答案 0 :(得分:2)
如果您还需要列出动态创建的对象属性,请使用ReflectionObject
代替ReflectionClass
:
$test = new Test();
$test->foo = "bar";
$class = new ReflectionObject($test);
foreach($class->getProperties() as $p) {
$p->setAccessible(true);
echo $p->getName() . ' => ' . $p->getValue($test) . PHP_EOL;
}
请注意,我已使用ReflectionProperty::setAccessible(true)
来访问protected
或private
属性的值。
输出:
a => a
b => b
c => c
foo => bar