类反思:缺少属性

时间:2014-04-10 18:42:45

标签: php reflection properties

我正在尝试使用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 ]


在第一种情况下,缺少私有属性,在第二种情况下,“实例化后”属性丢失。

我不知道如何获得所有财产? (最好是反思,因为我也想知道一个财产是公共的,私人的...)

1 个答案:

答案 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)来访问protectedprivate属性的值。

输出:

a => a
b => b
c => c
foo => bar

Demo