疑难解答“非复合名称的使用语句…没有任何作用”

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

警告:非复合名称“Blog”的使用声明在…中没有效果…

Blog是我的名字空间,我有3个类:文章,列表和类别和一些function。

如果我改变我的statememnt use Blog\Article; 那么它的作品…

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

如果我在这个名字空间中有函数呢? 当我在命名空间之外调用它们时,我不得不将\Blog\到每个人的名字中。

PHP的use与C ++ using namespace不一样, 它允许你定义一个别名 ,而不是“导入”一个名字空间,从而完全省略名字空间限定符。

所以,你可以这样做:

 use Blog\Article as BA; 

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


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

 use \ReallyLongNSName as RLNN; 

请注意,您必须使用领先的\ here来强制parsing器知道ReallyLongNSName是完全限定的。 对于Blog\Article ,这是不正确的,这显然已经是一系列的命名空间:

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

由于这个问题出现在谷歌这个错误的第一个结果,我会说明我是如何修复它。

基本上,如果你有一个框架,就像Yii2一样,你将习惯于必须声明类:

 use Yii; use yii\db\WhatEver; class AwesomeNewClass extends WhatEver { } 

你将在Use Yii上得到这个错误,因为这个类没有名字空间。

由于这个类没有名称空间,它会自动inheritance全局符号表,所以不需要像这样定义的东西,只是删除它。

PHP中的use语句实际上只是一个方便,可以将一个长名称空间别名到可能更容易阅读的东西中。 它实际上并不包含任何文件或做任何事情,除了提供方便之外,还会影响您的开发。 因为, 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; 

如果在类定义之前尝试使用特征,也会popup错误“使用语句…不起作用…”。

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

如果你不想使用“as”语法

 use \Blog as B; 

为文件定义一个名字空间

 namespace anyname; use Blog