2009-08-11 54 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中没有“全部导入”。如果你想做上面所做的事情,你必须为你想要导入的每个类别做别名。