疑难解答“非复合名称的使用语句…没有任何作用”
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