Заставить динамически загруженный класс расширить или реализовать интерфейс - PullRequest
2 голосов
/ 27 января 2011

Кто-нибудь знает, возможно ли в PHP заставить класс расширять или реализовывать интерфейс без объявления его дочерним классом?

Пример:

interface Requirements
{
    public function __construct();
    public function kittens();
}

class DingleBerry
{
    public function __construct()
    {
        // yadda yadda yadda    
    }
}

// Example of my initial hope
// of what you could do

$kittens = new DingleBerry implements Requirements;

Очевидно, что это не такне работает, но мне нужен способ загрузки в классы, которые не имеют заранее определенных требований к интерфейсу, но вынуждены их соблюдать.

Моя общая цель - проверить, реализует ли класс Требования ДО он загружен, и вызывается его конструктор.

Поэтому я НЕ МОГУ использовать это:

interface Requirements
{
    public function __construct();
    public function kittens();
}

class DingleBerry
{
    public function __construct()
    {
        // DO BAD STUFF (i.e. eat your soul)
    }
}

// Example of what I CANNOT
// do.

$kittens = new DingleBerry;

if( !($kittens instanceof Requirements) )
{
    // eat pizza.    
}

Потому что тогда конструктор DingleBerry вызывается раньше, чем япроверьте, реализует ли он Требования.Dig

Ответы [ 2 ]

2 голосов
/ 27 января 2011

Вы не можете изменить уже объявленный класс или определение интерфейса без использования стороннего расширения (например: runkit ).

Runkit имеет runkit_class_adopt функцию, котораяможет удовлетворить эту потребность.К сожалению, я не могу проверить это, потому что версия PECL не будет компилироваться на моем компьютере.

Для первой части вашего вопроса вы можете проверить, реализует ли класс данный интерфейс, не создавая его и безAPI отражения:

// checks if class Bar implements Foo
if (in_array('Foo', class_implements('Bar'))) {
    $foo = new Bar;
} else {
    throw new Exception('Interface not implemented');
}
0 голосов
/ 27 января 2011

Непроверенный, но теоретически это API-для-забавы и прибыли

...