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

the*_*cat 80 php namespaces

当我放在use Blog;顶部时出现此错误.

警告:非复合名称'Blog'的use语句对...没有影响

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

如果我改变我的状态,use Blog\Article;那么它有效......

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

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

Lig*_*ica 80

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

所以,你可以这样做:

use Blog\Article as BA;
Run Code Online (Sandbox Code Playgroud)

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


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

use \ReallyLongNSName as RLNN;
Run Code Online (Sandbox Code Playgroud)

请注意,您必须\在此处使用前导强制解析器知道它ReallyLongNSName是完全限定的.这不是真的Blog\Article,显然已经是一系列命名空间:

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

  • 啊,太烂了.所以`use`的东西实际上是无用的,也可能是那个的首字母缩略词:) (16认同)
  • 此答案仅适用于非命名空间的文件.1)在命名空间文件中,不需要在`use`语句中使用前导\,因为它的参数总是被视为绝对的(即,从全局命名空间开始).2)`使用Blog;`不一定是无用的:例如,从名为`Blog\Util\CLI`的命名空间文件中,它将使你能够编写`Blog\Entry :: method()`而不是`\ Blog \进入::方法()`.并非这确实是必要的,但确实有效果.有关此用法的示例,请参阅Nette框架. (6认同)

Sam*_*aye 23

由于这个问题似乎是谷歌针对此错误的第一个结果,我将说明我是如何修复它的.

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

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 对我来说,问题是我试图使用全局命名空间中的符号,例如“use \Password”,但是当你尝试在没有别名的情况下这样做时,php不喜欢它,所以即使“use \Password as Password” ` 工作得很好。 (2认同)

Cha*_*rry 7

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

use \Blog as B;

这甚至可能奏效。(可能有人会争辩说,您实际上通过遮蔽而失去了便利性,但这不是问题所在)因为您实际上是将Blog名称空间别名为其他名称。使用Blog\Article作品是因为,根据文档:

// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;
Run Code Online (Sandbox Code Playgroud)

所以你的代码段相当于:

use Blog\Article as Article;
Run Code Online (Sandbox Code Playgroud)


sam*_*war 6

如果您不想使用“as”语法,例如

use \Blog as B;
Run Code Online (Sandbox Code Playgroud)

为文件定义命名空间

namespace anyname;

use Blog
Run Code Online (Sandbox Code Playgroud)