private function canAccessClassMember(ClassMemberReflection $classMemberReflection) : bool
{
if ($classMemberReflection->isPublic()) {
return true;
}
$class = $this->inClosureBindScopeClass !== null ? $this->inClosureBindScopeClass : $this->getClass();
if ($class === null) {
return false;
}
if (!$this->broker->hasClass($class)) {
return false;
}
$classReflectionName = $classMemberReflection->getDeclaringClass()->getName();
if ($classMemberReflection->isPrivate()) {
return $class === $classReflectionName;
}
$currentClassReflection = $this->broker->getClass($class);
// protected
if ($currentClassReflection->getName() === $classReflectionName || $currentClassReflection->isSubclassOf($classReflectionName)) {
return true;
}
return $classMemberReflection->getDeclaringClass()->isSubclassOf($class);
}