PHP命名空间和implements关键字

时间:2009-08-11 16:57:58

标签: php namespaces

use MyNamespace;

class NonPersistentStorage implements StorageInterface

两者都在MyNamespace中。然而,PHP会查找MyNamespace \ NonPersistentStorage和StorageInterface(而不是MyNamespace \ StorageInterface)。我错过了什么吗?

3 个答案:

答案 0 :(得分: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中没有“全部导入”;如果你想做上面所做的事情,你必须为要导入的每个类别名。

答案 1 :(得分:2)

实际上,“使用”声明绝对没有任何意义。您应该在命名空间层次结构中更深入时导入(使用)命名空间(例如,使用Foo \ Bar \ Baz),或者当您想要为它们提供别名时(例如,使用Foo作为Bar)。我想你想声明文件本身属于MyNamespace:

namespace MyNamespace;

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

或者,您可能还想使用与命名空间相同的语法导入单独的函数和类。

答案 2 :(得分:0)

尝试使用:

use MyNamespace;

class NonPersistentStorage implements MyNamespace\StorageInterface