【问题标题】:PHP - reset namespace to globalPHP - 将命名空间重置为全局
【发布时间】:2018-08-03 16:10:44
【问题描述】:

我想从声明了namespace 的页面中访问全局namespace 函数,而不必麻烦在每个函数之前添加\

如何重置回全局命名空间?

示例:

<?php
namespace Stupid\Namespace;
$page = new page;

function zipUp() {
  $zip = new ZipArchive();
  //doesn't matter what the rest of this function is,
  //because it will already have had a fatal error
  //unless I add a leading \, like new \ZipArchive();
}

理想情况下,我只想声明全局命名空间,就像我可以使用其他命名空间一样,只是为了这个函数:

function zipUp() {
  namespace \; \\ OR namespace global; etc.
  $zip = new ZipArchive();
}

唯一可行的方法(我能找到)是将函数包装在大括号中(namespace { function foo(){...} },但是我必须将使用主命名空间的所有内容也包装在大括号中,这是不可行的。

希望我是愚蠢的并且错过了一些明显的东西,或者有一个很好的理由说明为什么应该如此基本的东西是不可能的,但我似乎找不到任何证据证明这两个原因。

【问题讨论】:

  • 在命名空间声明后添加use \ZipArchive;

标签: php namespaces


【解决方案1】:

只需使用use 导入类

例子:

<?php
namespace Stupid\Namespace;
use \zipArchive;
//use \zipArchive as zipArch; (You could use the class as a custom shorthand to interact with that class if you want)

$page = new page;

function zipUp() {
  $zip = new ZipArchive();
  //new zipArchive() should not throw a fatal exception
}

【讨论】:

  • +1 因为从我的示例中看起来确实会有所帮助。然而,虽然我只使用了一个函数作为示例,但这个特定函数使用了RecursiveIteratorIteratorRecursiveDirectoryIterator 和其他几个全局函数,这就是我只想编写一个namespace 声明的原因。否则,我可以用use 语句列出每个函数,或者在它们前面加上`\`,但这不是我想做的。
  • @JoeP 我真的不知道你怎么能告诉你的脚本加载东西而不确切地声明这些东西是什么,你可能对你想要的东西不走运。也就是说,您可能会创建一个包含您想要加载的所有内容的数组,并使用循环将它们包含在use 中,但我也不确定这是否是您想要的。也许我没有完全理解您所说的“编写一个 namespace 声明是什么意思?服务器必须知道从哪个命名空间加载它们。
  • 完全不声明命名空间,该函数将毫无问题地运行。但是,例如,我需要声明命名空间以使用$page。如果它在没有声明命名空间的情况下工作,那么肯定有一种方法可以“取消设置”命名空间以返回global 或默认命名空间。
  • @JoeP 我不认为有办法做到这一点,但如果你只是调换角色呢?删除命名空间声明并尝试执行use Stupid\Namespace。它可能有用吗?我不确定您的设置或其他东西,但如果不是,您可能会不走运:(
  • 看起来没有办法,这看起来很愚蠢。我不愿意接受你的回答,因为这实际上不是我想要的,但它确实有效,并且实际上可能是避免需要单独在函数调用前加上 `\` 的唯一另一种方法,所以它会很苛刻不要。我会暂时离开它,如果没有更好的解决方案浮出水面,我会接受它。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2013-11-22
  • 2012-11-07
  • 2010-12-20
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
相关资源
最近更新 更多