2013-04-05 53 views
12

如果您嘗試在PHP的類的方法內使用class_exists(),則必須指定類的全名 - 不尊重當前名稱空間。例如,如果我的類是:是否有PHP的class_exists()的名稱空間感知替代?

<? 
    namespace Foo; 

    class Bar{ 
     public function doesBooClassExist(){ 
      return class_exists('Boo'); 
     } 
    } 

而且噓是一個類(適當的自動加載),看起來像這樣

namespace Foo; 

    class Boo{ 
     // stuff in here 
    } 

,如果我嘗試:

$bar = new Bar(); 
$success = $bar->doesBooClassExist(); 
var_dump($success); 

你會得到一個錯誤...是否有另一種方法來做到這一點,而不必明確指定完整的類名稱(即class_exits('Foo\Boo'))?

+1

你有沒有試過在你的'doesBooClassExist()'方法中用'__NAMESPACE__'預先給出類名?或者我誤解你想要做的事情? (請參閱http://www.php.net/manual/en/language.namespaces.nsconstants.php) – Crontab

+1

@Crontab這可以在您指出是否沒有其他已知名稱空間感知的方式時完成 - 只是個人偏好。你應該讓這個答案。 – Ray

+0

我不確定,但我認爲它的正確性是class_exists不在名稱空間中搜索。如果直接在名稱空間中檢查,您將如何檢查內部任何名稱空間外的類? – Svetoslav

回答

23

此前5.5,要做到這一點的最好辦法是要始終使用完全合格的類名:

public function doesBooClassExist() { 
    return class_exists('Foo\Boo'); 
} 

這並不難,它使你指的是絕對清楚的。請記住,你應該追求可讀性。命名空間導入對於編寫而言非常方便,但會使閱讀變得混亂(因爲在閱讀代碼時需要記住當前命名空間和任何導入)。

然而,在5.5中,有一個新的結構來:

public function doesBooClassExist() { 
    return class_exists(Boo::class); 
} 

class僞魔常數可以放到任何標識,它會返回完全限定類名稱,它將解析爲... ...

+0

+這是一個更好的方法 – Baba

+0

哦,男人,Boo :: class將會很棒! – mattalxndr

+1

不應該反斜槓(每個[PHP命名空間常見問題](http://php.net/manual/en/language.namespaces.faq.php#language.namespaces.faq.quote))? – thirdender

相關問題