Страницы

Поиск по вопросам

пятница, 7 июня 2019 г.

Почему в php рефлексия показывает что интерфейс это абстрактный класс?

Можете, пожалуйста, подсказать почему в php 5.6.30 данный код:
interface IInterface { public function someMethod(); public function anotherMethod(); } function classData( ReflectionClass $class ) { $details = ""; $name = $class->getName();
if ( $class->isInterface() ) { $details .= "$name -- это интерфейс
"; }
if ( $class->isAbstract() ) { $details .= "$name -- это абстрактный класс
"; } return $details; }
$class_info = new ReflectionClass('IInterface'); echo classData($class_info);
выводит следующий результат:
IInterface -- это интерфейс IInterface -- это абстрактный класс
Т.е. почему интерфейс определяется как абстрактный класс?
Если удалить методы из интерфейса, то отобразится:
IInterface -- это интерфейс

Интересный факт: hhvm лишён этого недостатка


Ответ

Существует 2 типа «абстрактности» в php:
explicit - класс, явно определённый, как abstract. implicit - класс/интерфейс, содержащий абстрактные методы.
Проверить на explicit абстрактность можно так:
if ($class->getModifiers() & ReflectionClass::IS_EXPLICIT_ABSTRACT) { // Перед нами абстрактный класс }
Демонстрация

Комментариев нет:

Отправить комментарий