故障排除“具有非化合物名称的使用声明……无效”


95

当我放在use Blog;顶部时得到此错误。

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

Blog 是我的命名空间,其中有3个类:Article,List和Category和一些函数。

如果我将statememnt更改为,use Blog\Article;那么它将起作用...

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

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


不,我没有使用任何框架
thelolcat 2012年

1
当我namespace 在之后 声明我的文件时发生了use Blah;
Derek Illchuk '16

这也可能意味着“博客”已经包含在内,而您正在尝试第二次使用它。如果您使用的框架已经包含了较高的框架,那么这是很常见的。

@DerekIllchuk,如果这只是我可以支持的答案。救了我很多头。
我着急,但我哭更难

Answers:


90

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

因此,您可以执行以下操作:

use Blog\Article as BA;

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


因此,use Blog是没有用的,但我相信您可以这样写:

use \ReallyLongNSName as RLNN;

请注意,您必须\在此处使用引号来强制解析器知道其ReallyLongNSName完全合格。对于Blog\Article,这不是正确的,它显然已经是一系列名称空间:

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


22
真烂 因此,该use内容实际上是无用的,也可能是它的首字母缩写:)
thelolcat 2012年

1
@thelolcat:它有它的用途……只是不是您想要的那个。:)它确实看起来像它可能是一个恼人的限制。
Lightness Races in Orbit

7
此答案仅对未命名的文件正确。1)在命名空间文件中,无需在use语句中使用前导\ ,因为其参数始终被视为绝对参数(即,从全局命名空间开始)。2)use Blog;不一定是无用的:例如,从命名为的文件中Blog\Util\CLI,它将使您能够编写Blog\Entry::method()而不是\Blog\Entry::method()。并不是说这确实是必要的,但确实有效果。有关此用法的示例,请参见Nette框架。
Zilk

24

由于此问题是该错误在Google上的第一个结果,因此,我将说明如何解决此问题。

基本上,如果您有一个框架,例如说Yii2,您将习惯于必须声明以下类:

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

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

由于此类没有名称空间,因此它会自动继承全局符号表,因此不需要此类定义,只需删除它即可。


是!这很合理!:)
马丁斯Briedis

1
对我来说,问题是我试图使用全局命名空间中的符号,例如,use \Password但是当您尝试不使用别名时,php不喜欢它,因此即使use \Password as Password工作也很好。
Kzqai

因主持人在寻找有关名称空间使用的更一般答案时建议使用OOD而被打败。
乔什·哈布达斯

1
@JoshH你在说什么?我什至没有收到您的最后答复。您已经从说这不是某些主持人正在寻找的东西,
转而给某人

1
@JoshH(顺便说一句,当人们引用诸如此类的有意见的博客作为回答问题的权威材料时,我讨厌它)
Sammaye

6

usePHP中语句实际上只是将长名称空间命名为可能更易于阅读的东西的一种方便。除了提供便利之外,它实际上不包含任何文件或执行任何其他操作,不会影响您的开发。既然,“ 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;

1
B除非您正在积极编写无法维护的代码或严格希望引起他人头痛,否则请不要调用任何东西。
乔什·哈布达斯

2

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

use My_trait; // should not be here

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

2

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

use \Blog as B;

为文件定义一个名称空间

namespace anyname;

use Blog
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.