php - 检查存储在字符串中的类名是否正在实现接口

2022-08-30 14:34:50

我知道我的问题在某种程度上是错误的,但我仍然在努力解决这个问题。

我有一个界面:Programmer

interface Programmer {
    public function writeCode();
}

和几个命名空间类:

  • Students\BjarneProgrammer(实现Programmer)
  • Students\CharlieActor(实现Actor)

我有这个类名存储在数组中$students = array("BjarneProgrammer", "CharlieActor");

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

例子:

getStudentObject($students[0]);- 它应该返回一个实例,因为它正在实现程序员。BjarneProgrammer

getStudentObject($students[1]);- 它应该回来,因为查理不是程序员。false

我尝试使用运算符,但主要问题是,如果它没有实现程序员,我不想实例化对象。instanceof

我检查了如何动态加载php代码并检查类是否实现接口,但没有适当的答案,因为我不想创建对象,除非它被函数返回。


答案 1

您可以使用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

$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;
}

获取实例或 false

$students = array("BjarneProgrammer", "CharlieActor");
$c = getStudentObject($students[0]);
if($c) {
    $c->writeCode();
}

答案 2

如果您使用的是PHP的现代版本(5.3.9 +),那么最简单(也是最好)的方法是将is_a()与第三个参数一起使用:true

$a = "Stdclass";

var_dump(is_a($a, "stdclass", true));
var_dump(is_a($a, $a, true));

这两个都会返回 true。


推荐