我了解我的问题在某种程度上是错误的,但我仍在尝试解决此问题。
我有一个接口(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/