疑难解答“使用非复合名称的使用声明......无效”

时间:2012-02-16 18:34:37

标签: php namespaces

use Blog;置于顶部时出现此错误。

  

警告:具有非复合名称“Blog”的use语句无效   在...

Blog是我的命名空间,其中我有3个类:文章,列表和类别以及一些函数。

如果我将状态更改为use Blog\Article;,那么它可以正常工作......

我不能只指定我想要使用的命名空间吗?我需要提供课程吗?

如果我在该命名空间中有函数怎么办?当我在命名空间之外调用它们时,我不得不在每个人的名字前加上\Blog\ ...

5 个答案:

答案 0 :(得分:75)

PHP的use与C ++的using namespace不同;它允许您定义别名,而不是“导入”命名空间,从而完全省略命名空间限定符。

所以,你可以这样做:

use Blog\Article as BA;

...缩短它,但你不能完全摆脱它。


因此,use Blog没用,但我相信你可以写:

use \ReallyLongNSName as RLNN;

请注意,您必须在此处使用前导\来强制解析器知道ReallyLongNSName是完全合格的。对于Blog\Article来说,情况并非如此,Foo\Bar显然已经是一系列命名空间:

  

请注意,名称空间名称的 (包含名称空间分隔符的完全限定名称空间名称,例如FooBar ,而不是{{1}}的全局名称。 ),前导反斜杠是不必要的,不建议使用,因为导入名称必须是完全限定的,并且不会相对于当前名称空间进行处理。

答案 1 :(得分:21)

由于此问题是Google首次出现此错误的结果,因此我将说明我是如何修复它的。

基本上如果你有一个框架,比如像Yii2那么你将习惯于做类似的声明:

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

您将在Use Yii上收到此错误,因为此类没有命名空间。

由于此类没有命名空间,因此它会自动继承全局符号表,因此不需要像这样定义的东西,只需删除它。

答案 2 :(得分:4)

use statement in PHP实际上只是方便将长命名空间别名化为可能更容易阅读的东西。除了提供方便之外,它实际上不包含任何影响您开发的文件或做任何其他事情。因为,Blog没有任何别名,你没有获得任何便利。我可以想象你可以做类似

的事情

use \Blog as B;

这甚至可能有效。 (可能有人认为你通过模糊实际上在这里失去了方便,但这不是关于的问题)因为你实际上是将Blog命名空间别名化为别的东西。使用Blog\Article有效,因为根据文档:

// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;

所以你的代码片段相当于:

use Blog\Article as Article;

答案 3 :(得分:2)

如果您尝试在类定义之前使用特征,则会弹出错误“使用语句...无效...”。

use My_trait; // should not be here

class My_class{
// use My_trait; should be here instead
}

答案 4 :(得分:1)

如果您不想使用'as'语法,如

use \Blog as B;

定义文件的命名空间

namespace anyname;

use Blog