将use Blog;
置于顶部时出现此错误。
警告:具有非复合名称“Blog”的use语句无效 在...
Blog
是我的命名空间,其中我有3个类:文章,列表和类别以及一些函数。
如果我将状态更改为use Blog\Article;
,那么它可以正常工作......
我不能只指定我想要使用的命名空间吗?我需要提供课程吗?
如果我在该命名空间中有函数怎么办?当我在命名空间之外调用它们时,我不得不在每个人的名字前加上\Blog\
...
答案 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