我了解我的问题在某种程度上是错误的,但我仍在尝试解决此问题。

我有一个接口(interface)Programmer:

interface Programmer {
    public function writeCode();
}

和几个命名空间的类:
  • Students\BjarneProgrammer(实现Programmer)
  • Students\CharlieActor(实现Actor)

  • 我将此类名称存储在数组$students = array("BjarneProgrammer", "CharlieActor");

    我想编写一个函数,如果正在实现Programmer接口(interface),它将返回一个类的实例。

    示例:
    getStudentObject($students[0]);-因为它正在实现Programmer,所以它应该返回BjarneProgrammer的实例。
    getStudentObject($students[1]);-因为Charlie不是程序员,所以它应该返回false

    我使用instanceof运算符进行了尝试,但是主要问题是,如果未实现Programmer,我不想实例化一个对象。

    我检查了How to load php code dynamically and check if classes implement interface,但是没有适当的答案,因为我不想创建对象,除非它由函数返回。

    最佳答案

    您可以使用class_implements(需要PHP 5.1.0)

    interface MyInterface { }
    class MyClass implements MyInterface { }
    
    $interfaces = class_implements('MyClass');
    if($interfaces && in_array('MyInterface', $interfaces)) {
        // Class MyClass implements interface MyInterface
    }
    

    您可以将class name作为字符串传递为函数的参数。另外,您可以使用Reflection
    $class = new ReflectionClass('MyClass');
    if ( $class->implementsInterface('MyInterface') ) {
        // Class MyClass implements interface MyInterface
    }
    

    更新:(您可以尝试这样的操作)
    interface Programmer {
        public function writeCode();
    }
    
    interface Actor {
        // ...
    }
    
    class BjarneProgrammer implements Programmer {
        public function writeCode()
        {
            echo 'Implemented writeCode method from Programmer Interface!';
        }
    }
    

    检查并返回instanse/false的函数
    function getStudentObject($cls)
    {
        $class = new ReflectionClass($cls);
        if ( $class->implementsInterface('Programmer') ) {
            return new $cls;
        }
        return false;
    }
    

    获取实例或错误
    $students = array("BjarneProgrammer", "CharlieActor");
    $c = getStudentObject($students[0]);
    if($c) {
        $c->writeCode();
    }
    

    关于php - php-检查存储在字符串中的类名称是否正在实现接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20169805/

    10-11 17:17