在PHP命名空间中定义全局函数

25

在PHP命名空间中(在带有namespace声明的文件内),是否可以定义全局函数?如果可以,如何实现?

<?php
namespace my_module;

# bunch of namespaced functions
# ...
# then I want to define a global function my_module()
# that is an alias to my_module\mymodule()

2
你可能不应该这样做,因为它会在代码中流露出“糟糕的设计,糟糕的结构”的味道。你这样做的特定原因是什么? - Sven
@Sven 请看问题更新。我宁愿将所有内容放在一个文件中,而不是创建一个单独的文件来定义一个函数。 - ryanve
@ryanve:我同意Sven的观点。我建议提供整体视角,并询问是否有比这种解决方法更好的方式来完成任务。 - RonaldBarzell
@user1161318 我不认为这是一个权宜之计。我想了解所有可能的选择,然后再决定如何使用它 ;] - ryanve
一个合理的使用案例可能是全局调试工具(如kint-php)的安全回退。调试调用有时会滑入生产环境,保持全局回退函数可以帮助找到这些错误(记录调用),并防止这些调用导致网站崩溃。 - joemaller
1
另一个不幸合理的用例是与WordPress一起工作,并且必须覆盖可插入函数... - dingo_d
2个回答

38
这是可能的,但除了设计不良之外,您还需要为每个命名空间将代码用大括号括起来,并且不能使用namespace my_module;,而必须是namespace my_module { ... }

例如:

namespace my_module {

    function module_function()
    {
        // code
    }
}

namespace {
    // global namespace.

    function my_module()
    {
        // call your namespaced code
    }
}

3
虽然将多个命名空间合并到同一文件中被强烈反对作为编码实践,但有许多合法的原因导致一个人可能需要以这种方式完成,这并不一定意味着“糟糕的设计”、“糟糕的结构”或“糟糕的编码”。我们应该解释和教育而不是引起混乱和批评。毕竟,语言允许某些“自由”是有原因的。 http://php.net/manual/zh/language.namespaces.definitionmultiple.php - Julio Marchi
1
当我尝试为旧版本的PHP实现polyfills时,我发现这非常有帮助。我有一个文件作为入口点,其中包含所有其他所需文件。它包含我认为是我的“主”命名空间。在其末尾,我在全局命名空间中编写了所有我的polyfills(例如https://www.php.net/manual/en/function.array-key-first.php)。 - Rémi Breton

1

'included'文件中定义的函数具有全局作用域。

因此(我还没有验证),您可以将函数声明放在一个小文件中,然后将其包含进来。

这不完全符合问题的设想。

另一种方法是创建一个本地函数,在其中使用“global”关键字,并将闭包分配给全局变量-然后可以在任何地方“作为函数”使用它。 我肯定已经对普通变量做到了这一点,并且我认为它也适用于闭包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接