3

次のようなFQCNを含む文字列があれば、静的に(つまり、インスタンスを作成せずに)チェックすることができます$fqcn

function checkCreatingInstance($fqcn)
{
    // Create a new instance
    $instance = new $fqcn;

    return ($instance instanceof 'MyNamespace\Entity\SendMessage');
}

function checkStatically($fqcn)
{
    /* TODO */
}

$fqcn = 'MyNamespace\Entity\SendSmallTextMessage';
var_dump(checkCreatingInstance($fqcn)); // true

特定のタイプですか?階層の例:

namespace MyNamespace\Entity;

class SendMessage { /* Stuff */ }

namespace MyNamespace\Entity;

class SendNewsletter extends SendMessage { /* Stuff */ }

namespace MyNamespace\Entity;

class SendSmallTextMessage extends SendMessage { /* Stuff */ }
4

2 に答える 2

3

はい。3番目の引数として渡すis_a()と、それが実行されます。TRUE

これの利点は、オブジェクトまたは文字列を受け入れてどちらの方法でも機能するように関数を記述できることです。静的およびインスタンス化されたチェックのために2つの関数を用意する必要はありません。

function checkIsChildOf ($objOrFQCN, $parent)
{
    return is_a($objOrFQCN, $parent, TRUE);
}

PHPマニュアルが貧弱であるさらに別の例-この振る舞いは、私が知る限り、マニュアルに文書化されていますが、なぜあなたがそれを見なかったのか分かりません。

于 2012-06-06T10:20:47.380 に答える
2
namespace Foo;

class A { }

class B extends A { }

class C { }

is_subclass_of('\Foo\A', '\Foo\A');  // false
is_subclass_of('\Foo\B', '\Foo\A');  // true
is_subclass_of('\Foo\C', '\Foo\A');  // false

http://php.net/is_subclass_of

于 2012-06-06T10:22:49.943 に答える