2014-09-11 5 views
1

Есть ли способ в PHP объявить, что два интерфейса несовместимы? То есть, чтобы класс не реализовал оба из них одновременно?PHP: Объявить несовместимость интерфейса

В идеале, не создавая бессмысленные фиктивные методы ..

+2

Как именно два интерфейса несовместимы? – deceze

+0

Как говорит @Machavity, интерфейсы - это просто контракты, поэтому вы не можете этого сделать. Вы можете попытаться достичь этого с помощью [Абстрактного класса] (http://php.net/manual/en/language.oop5.abstract.php), реализующего метод, который вызывает «сопряженные» (абстрактные) методы и выбрасывает исключение если оба интерфейса существуют. –

ответ

1

Единственный способ добавить функцию с тем же именем на обоих, но, как вы сказали .. вы предпочитаете не применять «бессмысленные фиктивные методы».

Это звучит для меня, что есть, вероятно, лучший способ, чтобы решить вашу проблему, хотя;)

2

Там не какой-либо способ сделать это в интерфейсе, потому что интерфейс не реально выполнить, он только определяет.

У вас всегда есть возможность выполнить такой тест, используя ReflectionClass::implementsInterface или class_implements, но похоже, что люди пишут новые классы, и это основная проблема.

0

@Machavity и @Evert являются правильными. Crutch :):

trait Compatibility{ 
private $incompatible_couples = array(
         'Foo'=> array('A','C') 
         ); 

public function checkInterfaces($classname){ 
    $class_interfaces = class_implements($classname); 
    // array(3) { ["A"]=> string(1) "A" ["B"]=> string(1) "B" ["C"]=> string(1) "C" } 

    $couple = $this->incompatible_couples[$classname]; 
    if (count($couple)==count(array_intersect($class_interfaces,$couple))){ 
     die('Error: interfaces '.implode(' and ',$couple).' are incompatible'); 
    } 
} 
} 

interface A{ 
//... 
} 

interface B{ 
    //... 
} 

interface C{ 
    //... 
} 

class Foo implements A,B,C{ 
    use Compatibility; 

    function __construct(){ 
    self::checkInterfaces(__CLASS__); // checing interface compatibility 
    //.... 
    } 
} 

var_dump(new Foo()); 
// Error: interfaces A AND C are incompatible. 
Смежные вопросы