2012-06-06 73 views
2

將有可能檢查靜態(意思,而無需創建一個實例),如果包含FQCN像$fqcn的字符串:是否可以「靜態」檢查FQCN在PHP中是否屬於給定類型?

function checkCreatingInstance($fqcn) 
{ 
    // Create a new instance 
    $instance = new $fqcn; 

    return ($instance instanceof 'MyNamespace\Entity\SendMessage'); 
} 

function checkStatically($fqcn) 
{ 
    /* TODO */ 
} 

$fqcn = 'MyNamespace\Entity\SendSmallTextMessage'; 
var_dump(checkCreatingInstance($fqcn)); // true 

是給定類型的?示例層級:

namespace MyNamespace\Entity; 

class SendMessage { /* Stuff */ } 

namespace MyNamespace\Entity; 

class SendNewsletter extends SendMessage { /* Stuff */ } 

namespace MyNamespace\Entity; 

class SendSmallTextMessage extends SendMessage { /* Stuff */ } 
+1

反射API可能能夠做的,但我不知道。儘管如此,仍然可能是一個開始尋找答案的好地方。 – GordonM

回答

3

是的。 is_a()會做到這一點,如果你通過TRUE作爲第三個參數。

Example

這樣做的好處是,你可以寫你的功能,所以它接受和對象或字符串,它會工作無論哪種方式,你不必擁有一個靜態和實例化檢查兩種功能:

function checkIsChildOf ($objOrFQCN, $parent) 
{ 
    return is_a($objOrFQCN, $parent, TRUE); 
} 

但是PHP手冊貧窮的另一個例子 - 這種行爲是記錄在手冊中,只要我可以告訴,但我不知道爲什麼你沒有看到它,因此手冊僅僅是不好使不可見。

+0

工作得很好,謝謝! – gremo

+0

@hakre有趣的編輯...我說它沒有記錄,因爲'is_a()'的文檔聲明第一個參數應該是'object'類型而不是'mixed'。文檔中也沒有提到「你可以傳遞一個字符串作爲第一個參數,它將被視爲一個類的名字」。我認爲有一個'$ allow_string'參數的事實確實會暗示*它會起作用,但我支持它沒有被明確記錄的聲明。 – DaveRandom

+0

@DaveRandom:它不是那麼突出,但它是爲第三個參數編寫的:*「如果此參數設置爲false,則不允許字符串類名稱作爲對象。」*可以閱讀:如果爲true,則可以。無論如何,這可能並不是那麼好,因爲它是後來的變化。我的英語不太好,但我嘗試了一下編輯。你知道你可以編輯這些手冊頁順便說一句? – hakre

2
namespace Foo; 

class A { } 

class B extends A { } 

class C { } 

is_subclass_of('\Foo\A', '\Foo\A'); // false 
is_subclass_of('\Foo\B', '\Foo\A'); // true 
is_subclass_of('\Foo\C', '\Foo\A'); // false 

http://php.net/is_subclass_of

+0

有趣的 - 我不'真的不明白這個和'is_a()'之間的區別,手冊似乎沒有充分解釋。 +1雖然是一個很好的工作答案。 – DaveRandom

+1

'is_subclass_of'的工作方式與名稱相同,當且僅當該類是* sub * -class時才返回'true'。如果is_a('\ Foo \ A','\ Foo \ A')'也是'true',那麼'is_a'也返回'true'。 – deceze

+0

噢,是的。當你這樣說時很明顯。 – DaveRandom

相關問題