Можете, пожалуйста, подсказать почему в 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) {
// Перед нами абстрактный класс
}
Демонстрация
Комментариев нет:
Отправить комментарий