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