2

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のコンストラクターは、要件を実装しているかどうかを確認する前に呼び出されるためです。掘る?

4

2 に答える 2

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');
}
于 2011-01-27T00:02:10.590 に答える
0

テストされていませんが、理論的にはこれが 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

于 2011-01-26T23:50:14.993 に答える