2009-08-11 92 views
1
use MyNamespace; 

class NonPersistentStorage implements StorageInterface 

兩者都在MyNamespace中。然而PHP尋找MyNamespace \ NonPersistentStorage和StorageInterface(而不是MyNamespace \ StorageInterface)。我錯過了什麼嗎?PHP命名空間和implements關鍵字

回答

2

其實,這 「使用」 的聲明絕對沒有。當命名空間層次結構中的命名空間更深時(例如,使用Foo \ Bar \ Baz)或者當您想給它們一個別名時(例如,使用Foo作爲Bar),您應該導入(使用)命名空間。我想你想聲明的是,文件本身屬於myNameSpace對象:

namespace MyNamespace; 

class NonPersistentStorage implements StorageInterface { /* ... */ } 

或者,你也可能要導入獨立的函數和類,使用相同的語法命名空間。

+0

呃,那的確是問題所在。我可以笑,現在完全是WTF一段時間了。 – koen 2009-08-11 17:20:36

0

嘗試使用:

use MyNamespace; 

class NonPersistentStorage implements MyNamespace\StorageInterface 
3

PHP命名空間的工作方式與其他語言有所不同。當你導入一個名字空間時,你並沒有真正把類引入到範圍中,你只是在命名空間中進行別名。只導入一個級別的名稱空間完全沒有。即使你導入了一些東西,你仍然需要引用其最底層的命名空間。

舉例來說,如果你有這樣的:

foo.php:

namespace Bar\Baz\Biz; 

class Foo 
{} 

這裏是你如何使用它:

blah.php:

use Bar\Baz\Biz; 

$var=new Biz\Foo(); 

查看詳情即使我導入它,我仍然必須使用Biz引用它?

但是,可以解決這個問題使用別名: blah.php:

use Bar\Baz\Biz\Foo as Foo; 

$var=new Foo(); 

正如你所看到的,我再也不用限定它。

不幸的是,PHP中沒有「全部導入」。如果你想做上面所做的事情,你必須爲你想要導入的每個類別做別名。