Как я смотрел код в проекте Laravel 5, я столкнулся с классом
Как ниже —
class Abc extends Command implements SelfHandling, ShouldBeQueued
{
}
И где интерфейсы, как показано ниже —
interface SelfHandling {}
interface ShouldBeQueued {}
Я запутался, если у него нет никаких методов, то в чем польза от этих
интерфейсы?
Это позволяет обрабатывать объекты по поведению. Допустим, у вас есть массив объектов, реализующих различные интерфейсы, затем вы можете различить их, выполнив это:
if($obj instanceof ShouldBeQueued){
//do something
}
else if{$obj instanceof SelfHandling){
//do something else
}
Этот пример немного грубоват, но я надеюсь, что он поможет вам.
Они используются как своего рода «флаг». Это можно проверить, выполнив $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()) { /*...*/ }
Является ли это хорошей практикой, это другой вопрос.