Страницы

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

Показаны сообщения с ярлыком php5. Показать все сообщения
Показаны сообщения с ярлыком php5. Показать все сообщения

понедельник, 30 марта 2020 г.

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

#php #интерфейс #рефлексия #php5


Можете, пожалуйста, подсказать почему в 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 лишён этого недостатка


Ответы

Ответ 1



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

пятница, 10 января 2020 г.

Как в php избавится от конструкции if isset()?

#php #php5


Чем можно заменить данную конструкцию?

В коде очень много подобных проверок, а выносить в отдельную функцию не очень хочется
и данный массив берется после обработки xml файла.

if(isset($dict_notification->{'purchaseDocumentation'}->{'grantStartDate'})) {
    $date = $dict_notification->{'purchaseDocumentation'}->{'grantStartDate'};
} else {
    return; // old - $date = null;
}

    


Ответы

Ответ 1



либо вынести в отдельную функцию, массив по ссылке передавайте в нее - ничего страшного. Что-то в духе: function turboset(&$array, $key, $default=''){ if (!isset($array[$key])){ return $default; } return $array[$key]; } либо PHP7, пример оттуда

пятница, 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) { // Перед нами абстрактный класс }
Демонстрация

четверг, 21 февраля 2019 г.

Как в php избавится от конструкции if isset()?

Чем можно заменить данную конструкцию?
В коде очень много подобных проверок, а выносить в отдельную функцию не очень хочется и данный массив берется после обработки xml файла.
if(isset($dict_notification->{'purchaseDocumentation'}->{'grantStartDate'})) { $date = $dict_notification->{'purchaseDocumentation'}->{'grantStartDate'}; } else { return; // old - $date = null; }


Ответ

либо вынести в отдельную функцию, массив по ссылке передавайте в нее - ничего страшного. Что-то в духе:
function turboset(&$array, $key, $default=''){ if (!isset($array[$key])){ return $default; } return $array[$key]; }
либо PHP7, пример оттуда
// Coalescing can be chained: this will return the first // defined value out of $_GET['user'], $_POST['user'], and // 'nobody'. $username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; ?>