强制动态加载的类来扩展或实现接口

时间:2011-01-26 23:44:21

标签: php constructor instanceof extends implements

任何人都知道在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;

显然这不起作用,但我需要一种在没有预先了解接口要求但却被迫遵守它们的类中加载的方法。

我的总体目标是检查该类是否实现了 BEFORE 的加载,并调用了它的构造函数。

所以我不能用这个:

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的构造函数。挖?

2 个答案:

答案 0 :(得分:2)

如果不使用第三方扩展名(例如:runkit),则无法修改已声明的类或接口定义。

Runkit具有runkit_class_adopt功能,可满足该需求。不幸的是我无法测试它,因为PECL版本无法在我的机器上编译。

对于问题的第一部分,您可以检查一个类是否实现了给定的接口而没有实例化它,并且没有Reflection API:

// checks if class Bar implements Foo
if (in_array('Foo', class_implements('Bar'))) {
    $foo = new Bar;
} else {
    throw new Exception('Interface not implemented');
}

答案 1 :(得分:1)

未经测试但理论上这是API:

<?php
$reflection = new ReflectionClass('DingleBerry');
$reflection->implementsInterface('Requirements');
?>

http://php.net/manual/en/book.reflection.php
http://mark-story.com/posts/view/using-the-php-reflection-api-for-fun-and-profit