[英]php - check if class name stored in a string is implementing an interface
我明白我的問題有些不對勁,但我仍然在努力解決這個問題。
我有一個接口Programmer
:
interface Programmer {
public function writeCode();
}
以及一些命名空間類:
Students\\BjarneProgrammer
(實現Programmer
) Students\\CharlieActor
(實施Actor
) 我將這個類名存儲在數組$students = array("BjarneProgrammer", "CharlieActor");
我想編寫一個函數,如果它正在實現Programmer
接口,它將返回一個類的實例。
例子:
getStudentObject($students[0]);
- 它應該返回BjarneProgrammer
一個實例,因為它正在實現Programmer。
getStudentObject($students[1]);
- 它應該返回false
因為Charlie不是程序員。
我試了一下使用instanceof
運算符,但主要的問題是,我不想 ,如果它不執行編程實例化一個對象。
我檢查了如何動態加載PHP代碼並檢查類是否實現接口 ,但是沒有合適的答案,因為我不想創建對象,除非它是由函數返回的。
你可以使用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;
}
獲取實例或錯誤
$students = array("BjarneProgrammer", "CharlieActor");
$c = getStudentObject($students[0]);
if($c) {
$c->writeCode();
}
如果您使用的是現代版本的PHP(5.3.9+),那么最簡單(也是最好)的方法是使用is_a()
和第三個參數true
:
$a = "Stdclass";
var_dump(is_a($a, "stdclass", true));
var_dump(is_a($a, $a, true));
這兩個都將返回真實。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.