2011-01-26 87 views
1

任何人都知道在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的构造函数被调用之前,我可以检查它是否实现了要求。挖?

回答

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

+0

这将** **检查,如果该接口实现,但不会让班级执行它。 – netcoder 2011-01-26 23:53:44

+0

嗯,那就是你的问题的第二部分,关于在调用DingleBerry的构造函数之前,你可以检查它是否实现了它。 – scragz 2011-01-26 23:56:14

1

,而无需使用第三方扩展(例如: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'); 
} 
相关问题