循环遍历子类的私有属性的不一致

时间:2015-03-05 12:59:49

标签: php reflection

我试图遍历一个类的私有属性。执行此循环的方法包含在父类中。请考虑以下代码:

class ChildClass extends ParentClass {
    private $childProp = "childPropValue";
}

class ParentClass {
    private $parentProp = "parentPropValue";

    public function PrintProperties()
    {
        echo "--- print_r(\$this) ---\n";
        print_r($this);

        echo "\n\n--- foreach(\$this) ---\n";
        foreach($this as $propKey => $propValue) {
            print_r($propKey . ":");
            print_r($propValue . "\n");
        }

        echo "\n\n--- reflection->getProperties ---\n";
        $refl = new \ReflectionClass($this);
        print_r($refl->getProperties());
    }
}

$child = new ChildClass();
$child->PrintProperties();

输出:

--- print_r($this) ---
ChildClass Object
(
    [childProp:ChildClass:private] => childPropValue
    [parentProp:ParentClass:private] => parentPropValue
)


--- foreach($this) ---
parentProp:parentPropValue


--- reflection->getProperties ---
Array
(
    [0] => ReflectionProperty Object
        (
            [name] => childProp
            [class] => ChildClass
        )

)

print_r($ this)正确地将$ this标识为ChildClass对象,然后为该对象列出2个私有属性,并列出该属性的2个对应类。可以认为print_r仅用于调试目的,因此打印这两个属性在这方面都很有用。

现在,foreach($ this)循环使用与print_r相同的变量,但这里只列出了parentProp。此行为可能很直观,因为此构造用于循环访问可访问的属性。

然而,反射方法完全相反地打印,并且仅列出了在该范围内无法访问的' childProp'这是否会产生不同的结果,因为类名是ChildClass,而反射使用该名称来确定属性?

我想我在这里回答了自己的问题,但仍想知道别人对此事的看法。

1 个答案:

答案 0 :(得分:0)

第二个选项foreach只能看到公共值和受保护的值,就像你说的那样,但我认为\ ReflectionClass默认使用过滤器ALL。

我认为您无法在ChildClass中看到父私有属性,您需要为访问创建一个构造/ gettter,或者将$ parentProp更改为protected。

print_r($ this) - > 我认为显然有任何隐私限制,所以请看所有

foreach($ this) - > 我认为只需要在$ this中获取parentClass可访问键值,这是创建它的地方,并且只能访问parentClass的变量

ReflectionProperty - > 我认为创建一个Children类并且无法访问parentClass的私有属性

抱歉我的英语不好^^ U