use MyNamespace;
class NonPersistentStorage implements StorageInterface
兩者都在MyNamespace中。然而PHP尋找MyNamespace \ NonPersistentStorage和StorageInterface(而不是MyNamespace \ StorageInterface)。我錯過了什麼嗎?PHP命名空間和implements關鍵字
use MyNamespace;
class NonPersistentStorage implements StorageInterface
兩者都在MyNamespace中。然而PHP尋找MyNamespace \ NonPersistentStorage和StorageInterface(而不是MyNamespace \ StorageInterface)。我錯過了什麼嗎?PHP命名空間和implements關鍵字
其實,這 「使用」 的聲明絕對沒有。當命名空間層次結構中的命名空間更深時(例如,使用Foo \ Bar \ Baz)或者當您想給它們一個別名時(例如,使用Foo作爲Bar),您應該導入(使用)命名空間。我想你想聲明的是,文件本身屬於myNameSpace對象:
namespace MyNamespace;
class NonPersistentStorage implements StorageInterface { /* ... */ }
或者,你也可能要導入獨立的函數和類,使用相同的語法命名空間。
嘗試使用:
use MyNamespace;
class NonPersistentStorage implements MyNamespace\StorageInterface
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中沒有「全部導入」。如果你想做上面所做的事情,你必須爲你想要導入的每個類別做別名。
呃,那的確是問題所在。我可以笑,現在完全是WTF一段時間了。 – koen 2009-08-11 17:20:36