use MyNamespace;
class NonPersistentStorage implements StorageInterface
两者都在MyNamespace中。然而,PHP会查找MyNamespace \ NonPersistentStorage和StorageInterface(而不是MyNamespace \ StorageInterface)。我错过了什么吗?
答案 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