在函数内部使用 php 命名空间

Posted

技术标签:

【中文标题】在函数内部使用 php 命名空间【英文标题】:Use php namespace inside function 【发布时间】:2013-08-16 03:39:07 【问题描述】:

尝试在我自己的函数中使用名称空间时出现解析错误

require('/var/load.php');

function go()

  use test\Class;

    $go = 'ok';
    return $go;


    echo go();

【问题讨论】:

PHP 解析错误:语法错误,第 8 行 /var/www/test.php 中出现意外的 T_USE 一开始为什么要这样做? use 只是建立一个文件范围的别名,仅此而已。在函数中这样做有什么意义? 【参考方案1】:

来自the manual:

use 关键字必须在文件的最外层范围(全局范围)或命名空间声明中声明。

【讨论】:

@westnblue 表示use 语句只能出现在文件一打开就运行的代码部分。如果将它放在类或函数中,它将在调用类或函数时执行。这与 PHP 系统的命名空间和解析代码不兼容,因此您必须将 use 语句放在文件的最外层范围内。 让我不必担心我将“使用”放在函数中的命名空间问题。谢谢【参考方案2】:

来自Scoping rules for importing

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

【讨论】:

命名空间与 scope 无关,所以我会避免在这里使用该术语的模棱两可... @deceze 请指定一些链接以便清楚地了解 php 中的命名空间和范围 ...?您已链接到一个:手册。 变量范围命名空间只是两个完全不同的概念。 @deceze 据我了解,命名空间与 unix 中的“别名”命令相同,但为什么它只有全局范围?为什么我不能在一个函数中定义它,范围仅限于该函数?请帮助理解这一点 我想是因为它的使用非常有限,而且会引起混乱。在一个函数中,您 use Foo\Bar as MyClass 在同一文件中的另一个函数中,您 use Foo\Baz as MyClass。这很容易在阅读源代码时引入非常令人困惑的小错误。因此use 指令一次适用于整个文件/命名空间。我还没有遇到过这样还不够的情况。【参考方案3】:

据我所知,很多人在包含一个单独的函数文件并尝试在该函数中使用静态方法时都会遇到这种情况。例如在 index.php

namespace 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 中找不到类“StaticClass”

现在很明显,但我很困惑为什么 func.php 没有在“需要”func.php 的文件中继承命名空间声明

【讨论】:

以上是关于在函数内部使用 php 命名空间的主要内容,如果未能解决你的问题,请参考以下文章

命名空间

php使用命名空间时自动加载机制

PHP命名空间

关于PHP命名空间的讨论

PHP之命名空间

PHP之命名空间