当我放在use Blog;
顶部时得到此错误。
警告:非复合名称“ Blog”的use语句在...中无效
Blog
是我的命名空间,其中有3个类:Article,List和Category和一些函数。
如果我将statememnt更改为,use Blog\Article;
那么它将起作用...
我不能只指定要使用的名称空间吗?我需要提供课程吗?
如果我在该命名空间中有函数怎么办?当我在命名空间之外调用它们时,我被迫\Blog\
在每个人的名字前加上...
当我放在use Blog;
顶部时得到此错误。
警告:非复合名称“ Blog”的use语句在...中无效
Blog
是我的命名空间,其中有3个类:Article,List和Category和一些函数。
如果我将statememnt更改为,use Blog\Article;
那么它将起作用...
我不能只指定要使用的名称空间吗?我需要提供课程吗?
如果我在该命名空间中有函数怎么办?当我在命名空间之外调用它们时,我被迫\Blog\
在每个人的名字前加上...
namespace
在之后 声明我的文件时发生了use Blah;
。
Answers:
PHP use
与C ++不同using namespace
;它允许您定义别名,而不是“导入”名称空间,因此此后将完全省略名称空间限定符。
因此,您可以执行以下操作:
use Blog\Article as BA;
...缩短它,但是您不能完全摆脱它。
因此,use Blog
是没有用的,但我相信您可以这样写:
use \ReallyLongNSName as RLNN;
请注意,您必须\
在此处使用引号来强制解析器知道其ReallyLongNSName
完全合格。对于Blog\Article
,这不是正确的,它显然已经是一系列名称空间:
请注意,对于命名空间名称(包含命名空间分隔符的完全限定的命名空间名称,例如,
Foo\Bar
与不FooBar
包含命名空间分隔符的全局名称相对),不需要也不建议使用前导反斜杠,因为导入名称必须完全限定并且不进行处理。相对于当前名称空间。
use
内容实际上是无用的,也可能是它的首字母缩写:)
use
语句中使用前导\ ,因为其参数始终被视为绝对参数(即,从全局命名空间开始)。2)use Blog;
不一定是无用的:例如,从命名为的文件中Blog\Util\CLI
,它将使您能够编写Blog\Entry::method()
而不是\Blog\Entry::method()
。并不是说这确实是必要的,但确实有效果。有关此用法的示例,请参见Nette框架。
由于此问题是该错误在Google上的第一个结果,因此,我将说明如何解决此问题。
基本上,如果您有一个框架,例如说Yii2,您将习惯于必须声明以下类:
use Yii;
use yii\db\WhatEver;
class AwesomeNewClass extends WhatEver
{
}
您将收到此错误 Use Yii
因为此类没有名称空间,。
由于此类没有名称空间,因此它会自动继承全局符号表,因此不需要此类定义,只需删除它即可。
use \Password
但是当您尝试不使用别名时,php不喜欢它,因此即使use \Password as Password
工作也很好。
use
PHP中的语句实际上只是将长名称空间命名为可能更易于阅读的东西的一种方便。除了提供便利之外,它实际上不包含任何文件或执行任何其他操作,不会影响您的开发。既然,“ 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;
B
除非您正在积极编写无法维护的代码或严格希望引起他人头痛,否则请不要调用任何东西。
如果尝试在类定义之前使用特征,则还会弹出错误“ 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