Каковы преимущества использования интерфейса без каких-либо методов? В php

Когда я смотрел код в проекте Laravel 5, я столкнулся с классом, как показано ниже -

class Abc extends Command implements SelfHandling, ShouldBeQueued
{

}

И где интерфейсы как ниже -

interface SelfHandling {}
interface ShouldBeQueued {}

Я запутался, если у него нет никаких методов, то что толку от этих интерфейсов?


person Abhishek    schedule 09.08.2016    source источник
comment
Возможный дубликат интерфейса без методов. Они называют их интерфейсами маркеров.   -  person RandomSeed    schedule 09.08.2016


Ответы (2)


Это позволяет обрабатывать объекты по поведению. Допустим, у вас есть массив объектов, реализующих другой интерфейс, затем вы можете различать их, выполнив следующие действия:

if($obj instanceof ShouldBeQueued){
    //do something
}
else if{$obj instanceof SelfHandling){
    //do something else
}

Этот пример немного грубоват, но я надеюсь, что он вам поможет.

person vincenth    schedule 09.08.2016
comment
Итак, что должно быть, если я создам экземпляр класса Abc, может ли он быть экземпляром как ShouldBeQueued, так и SelfHandling? тогда нет смысла для if и else if, как оно упадет в обоих случаях? - person Abhishek; 09.08.2016
comment
Имейте в виду, что это всего лишь грубый пример. Но у вас могут быть объекты, которые реализуют один, оба или ни один из этих интерфейсов и обрабатывают их соответствующим образом. - person vincenth; 09.08.2016
comment
Кто-то придумал лучший ответ, чем я: wpkrauts.com/2013/how-to-build-f flexible-php-interfaces/. В вашем случае я думаю для того, чтобы использовать внутренние типы - person vincenth; 09.08.2016

Они используются как своего рода «флаг». Это можно проверить, выполнив $command instanceof ShouldBeQueued.

Альтернативой было бы включение метода, но для этого потребовалось бы несколько строк избыточного кода. (Большинство реализаций все равно вернет true.)

interface ShouldBeQueued
{
    /**
     * @return bool
     */
    function shouldBeQueued();
}

class Abc extends Command implements ShouldBeQueued
{
    function shouldBeQueued()
    {
        return true;
    }
}

Проверить это тоже будет немного сложнее:

if ($command instanceof ShouldBeQueued && $command->shouldBeQueued()) { /*...*/ }

Другой вопрос, будет ли это хорошей практикой.

person ShiraNai7    schedule 09.08.2016