在我的函数内部尝试使用命名空间时,我遇到了解析错误。
require('/var/load.php');
function go(){
use test\Class;
$go = 'ok';
return $go;
}
echo go();
在我的函数内部尝试使用命名空间时,我遇到了解析错误。
require('/var/load.php');
function go(){
use test\Class;
$go = 'ok';
return $go;
}
echo go();
根据导入的作用域规则,use关键字必须在文件的最外层范围(全局范围)或命名空间声明内部声明。这是因为导入是在编译时而不是运行时完成的,所以它不能是块级作用域。
所以你应该像这样使用,在全局级别指定use
require('/var/load.php');
use test\Class;
function go(){
$go = 'ok';
return $go;
}
echo go();
请查看以下手册中的示例 5 请参考其手册:http://php.net/manual/en/language.namespaces.importing.php
use Foo\Bar as MyClass
,但在同一文件中的另一个函数中,你又使用了use Foo\Baz as MyClass
。这很容易在阅读源代码时引入非常令人困惑的小错误。因此,use
指令一次只适用于整个文件/命名空间。无论如何,我还没有遇到过不足以解决的情况。 - deceze来自手册:
use
关键字必须在文件的最外层作用域(全局作用域)中声明,或者在命名空间声明内部。
use
语句只能出现在文件打开时立即运行的代码部分。如果将其放在类或函数内部,则会在调用类或函数时执行。这与 PHP 命名空间和解析代码的系统不兼容,因此必须将 use
语句放在文件的最外层范围内。 - lonesomedaynamespace foo/bar
require('func.php')
f();
并且在 func.php 中
function f() {
StaticClass::static_method();
}
你只需要在 func.php 中声明命名空间 foo/bar (就像在 index.php 中声明的一样),所以代码应该如下:
namespace foo\bar
function f() {
StaticClass::static_method();
}
必须注意以下事项:现在显而易见,但是之前我曾困惑过,即func.php文件中的命名空间声明不会被包含(require)func.php文件的文件继承。Fatal error: Uncaught Error: Class 'StaticClass' not found in func.php
use
只是建立一个文件范围内的别名,没有更多或更少。在函数中这样做有什么意义呢? - deceze