簡體   English   中英

php - 檢查存儲在字符串中的類名是否正在實現接口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM