Php “故障排除”;具有非复合名称的use语句。。。没有任何影响”;

Php “故障排除”;具有非复合名称的use语句。。。没有任何影响”;,php,namespaces,Php,Namespaces,当我把使用Blog时,得到这个错误在顶部 警告:具有非复合名称“Blog”的use语句无效 在 Blog是我的命名空间,其中我有3个类:Article、List和Category以及一些函数 如果我将状态更改为使用Blog\Article然后它工作 我不能只指定要使用的名称空间吗?我需要提供课程吗 如果我在那个名称空间中有函数呢?当我在名称空间之外调用它们时,我被迫在每个人的名字前面加上\Blog\。PHP的使用与C++使用名称空间的不同;它允许您定义一个别名,而不是“导入”一个名称空间,因此从

当我把
使用Blog时,得到这个错误在顶部

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

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

如果我将状态更改为
使用Blog\Article然后它工作

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


如果我在那个名称空间中有函数呢?当我在名称空间之外调用它们时,我被迫在每个人的名字前面加上
\Blog\

PHP的
使用与C++使用名称空间的
不同;它允许您定义一个别名,而不是“导入”一个名称空间,因此从此完全省略名称空间限定符

因此,你可以:

use Blog\Article as BA;
。。。缩短它,但你不能完全摆脱它


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

use \ReallyLongNSName as RLNN;
请注意,您必须在此处使用前导的
\
来强制解析器知道
reallyngsname
是完全限定的。对于
Blog\Article
,情况并非如此,它显然已经是一个名称空间链:

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

将一个长名称空间别名到一个可能更容易阅读的名称空间中,实际上只是一种方便。它实际上不包括任何文件,也不做任何其他影响开发的事情,除了提供方便。因为,
Blog
不会被冠以任何你无法获得任何便利的别名。我可以想象你可以做这样的事情

使用\Blog作为B

这甚至可能奏效。(有人可能会说,在这里你实际上因为模糊而失去了便利,但这不是问题所在),因为你实际上是在把
博客
名称空间别名为其他名称空间。使用
Blog\Article
有效,因为根据文档:

// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;
因此,您的代码片段相当于:

use Blog\Article as Article;

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

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

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}
您将在
Use Yii
上收到此错误,因为此类没有名称空间

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

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

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

不,当我在
use Blah之后声明我的文件
namespace
时,我没有使用任何发生在我身上的框架。这也可能意味着“博客”已经被收录,而你正试图再次使用它。如果你使用的框架已经包含了更高层次的内容,这是很常见的。@DerekIllchuk,如果这是一个我可以投票的答案就好了。帮我省去了很多头痛。啊,太糟糕了。因此,
使用
这个东西实际上是无用的,也可以是它的缩写:)@theolcat:它有它的用途。。。只是不是你想要的。:)这似乎确实是一个恼人的限制。这个答案只适用于无名称空间的文件。1) 在带名称空间的文件中,不需要在
use
语句中使用前导\,因为它的参数总是被视为绝对的(即从全局名称空间开始)。2)
使用博客并不一定是无用的:例如,从名为
Blog\Util\CLI
的文件中,它将使您能够编写
Blog\Entry::method()
,而不是
\Blog\Entry::method()
。这并不是说这真的有必要,但确实有效果。有关此用法的示例,请参阅Nette framework.YES!这很有道理!:)对我来说,问题是我试图使用全局名称空间中的符号,例如
use\Password
,但是php不喜欢在没有别名的情况下使用它,所以即使是
use\Password-as-Password
也可以很好地工作。当版主在寻找关于名称空间使用的更一般的答案时,反对使用OOD。@josh你在说什么?我甚至没有得到你最后的答复。你已经从说这不是某个版主想要的,变成了给某个人关于OOP的链接trolling@JoshH(顺便说一句,我讨厌人们把这种固执己见的博客作为回答问题的权威材料)请永远不要调用任何
B
,除非您正在积极编写无法维护的代码或严格希望引起他人的头痛。