PHP is_subclassof関数の一つのバグと解決方法


is_subclassofの役割:
bool is_subclass_of ( object object, string class_name )
対象がobjectに属するクラスならクラスクラスクラスクラスです。nameのサブクラスは、TRUEに戻り、そうでなければFALSEに戻ります。注:PHP 5.0.3からは一つの文字列でobjectパラメータ(クラス名)を指定することもできます。
使用例:

# $className $type
is_subclass_of($className,$type);
php 5.3.7バージョンの前にinterfaceに対して一つのbugがあります。
bug:https://bugs.php.net/bug.php?id=53727

interface MyInterface {}
class ParentClass implements MyInterface { }
class ChildClass extends ParentClass { }

# true
is_subclass_of('ChildClass', 'MyInterface');
# false
is_subclass_of('ParentClass', 'MyInterface');
解決策:
function isSubclassOf($className, $type){
    // $className $type , TRUE  
    if (is_subclass_of($className, $type)) {
        return true;
    }

    // php >=5.3.7 interface bug $className $type
    if (version_compare(PHP_VERSION, '5.3.7', '>=')) {
        return false;
    }

    // $type bug $className $type
    if (!interface_exists($type)) {
        return false;
    }

    // 
    $r = new ReflectionClass($className);
    //  $type
    return $r->implementsInterface($type);
}