nepster-web
@nepster-web

Как правильно сравнивать объекты ?

Есть интерфейс
\common\modules\notification\interfaces\NoticeInterface


Его реализуют необходимые классы классы.

Есть компонент, который отсылает уведомления пользователям. В этот компонент по средствам конфигурации попадает класс, который должен реализовать интерфейс NoticeInterface, тоесть к примеру:

$noticeModel = 'common\modules\merchant\modules\transfers\communication\notifications\Notice';


В компоненте мне нужно проверить, действительно ли $noticeModel реализует нужный интерфейс.

Я сделал вот такой тест:
if ($noticeModel instanceof NoticeInterface) {
          echo "success";
        } else {
          echo "fail";
        }
        
        echo '<br/>';
        
        if ($noticeModel instanceof \common\modules\notification\interfaces\NoticeInterface) {
          echo "success";
        } else {
          echo "fail";
        }
        
        echo '<br/>';
        

        if (is_subclass_of($noticeModel, 'NoticeInterface')) {          
            echo "success";
        } else {
          echo "fail";
        }
        
        echo '<br/>';

        if (is_subclass_of($noticeModel, '\common\modules\notification\interfaces\NoticeInterface')) {
            echo "success";
        } else {
          echo "fail";
        }


Результат:

fail
fail
fail
success


Хотя интерфейс в компоненте подключен. Подскажите пожалуйста почему так происходит ?
  • Вопрос задан
  • 2328 просмотров
Решения вопроса 2
KorsaR-ZN
@KorsaR-ZN
Вы не правильно пользуйтесь instanceof , он проверят объект, а вы ему имя класса подсовываете.

is_subclass_of , может проверять по имени классу, по этому он success.

Из выше сказанного, остальные fail т.к:
1. неправильное использование оператора instanceof;
2. для проверки реализации нужного интерфейса, нужно указывать полное имя класса (интерфейса), т.е включая его namespace;
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
use common\modules\notification\interfaces\NoticeInterface;

class NoticeModel implements NoticeInterface {
  // .. реализация
}

$noticeModel = new NoticeModel();
if ($noticeModel instanceof NoticeInterface) {
   // как-то так
}

if(is_subclass_of(get_class($noticeModel), NoticeInterface::class) {
   // вот так еще начиная с php5.5+
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы