Несоответствия в цикле через частные свойства подкласса

0

Я пытался перекрыть частные свойства класса. Метод, который будет выполнять этот цикл, содержится в родительском классе. Рассмотрим следующий код:

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 и отражение использует это имя для определения свойств?

Я думаю, что я ответил на свой собственный вопрос здесь, но все равно хотел бы узнать мнение других людей по этому вопросу.

Теги:
reflection

1 ответ

0

Второй вариант, foreach, может видеть только общедоступные и защищенные значения, как вы говорите, но я думаю, что \ReflectionClass использует фильтр по умолчанию ALL.

Вы не можете видеть родительские частные свойства в ChildClass, я думаю, вам нужно создать конструкцию /gettter для доступа или изменить $ parentProp для защиты.

print_r ($ this) -> Я считаю очевидным ограничение конфиденциальности, поэтому см. все

foreach ($ this) -> Я думаю, возьмем $ this только доступные значения parentClass, где он создан, и может обращаться только к переменным parentClass

ReflectionProperty -> Я думаю, создаю класс "Дети" и не могу получить доступ к закрытым свойствам parentClass

Извините за мой плохой английский ^^ U

Ещё вопросы

Сообщество Overcoder
Наверх
Меню