Я пытался перекрыть частные свойства класса. Метод, который будет выполнять этот цикл, содержится в родительском классе. Рассмотрим следующий код:
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 и отражение использует это имя для определения свойств?
Я думаю, что я ответил на свой собственный вопрос здесь, но все равно хотел бы узнать мнение других людей по этому вопросу.
Второй вариант, foreach, может видеть только общедоступные и защищенные значения, как вы говорите, но я думаю, что \ReflectionClass использует фильтр по умолчанию ALL.
Вы не можете видеть родительские частные свойства в ChildClass, я думаю, вам нужно создать конструкцию /gettter для доступа или изменить $ parentProp для защиты.
print_r ($ this) -> Я считаю очевидным ограничение конфиденциальности, поэтому см. все
foreach ($ this) -> Я думаю, возьмем $ this только доступные значения parentClass, где он создан, и может обращаться только к переменным parentClass
ReflectionProperty -> Я думаю, создаю класс "Дети" и не могу получить доступ к закрытым свойствам parentClass
Извините за мой плохой английский ^^ U