【问题标题】:How can I prevent built in PHP functions from becoming namespaced?如何防止内置 PHP 函数成为命名空间?
【发布时间】:2018-04-24 15:47:03
【问题描述】:

我是 PHP 命名空间的新手,我所拥有的是:

namespace Foo\Bar;
class JsonAssetRest{
    static function ini(){
        $headers = getallheaders(); 
    }
}
JsonAssetRest::ini();

这是造成错误

Uncaught Error: Call to undefined function Foo\Bar\getallheaders() in /var/www/html/class JsonAssetRest.php

如何使用 getallheaders()(内置函数)而不出现此错误?

编辑:问题与我将代码转换为命名空间类时删除库有关。所述库为 nginx 定义了 getallheaders。我对添加命名空间的错误消息感到困惑,并认为这是问题所在。

如果其他人在调试时对错误感到困惑,请保留此内容。而且因为 cmets 提高了我对 PHP 命名空间的理解。

Edit2:如果有人偶然发现此错误并想知道如何解决实际问题(getallheaders 未在 nginx 下定义),已在此处回答:Get the http headers from current request in PHP

【问题讨论】:

  • 如果您在我的回答方面需要任何帮助,请告诉我。

标签: php namespaces


【解决方案1】:

全局函数可从任何命名空间使用。您不需要像其他答案建议的那样添加 \ 前缀。

此错误意味着在名为 getallheaders() 的全局或当前命名空间中没有定义函数。此函数是 apache_response_headers() 的别名,它也可能不存在。我假设 PHP 没有作为这些函数所需的 apache 模块运行。

【讨论】:

  • 我对其他答案感到困惑。因为我有多个 3rd 方库,它们在其命名空间类中调用标准 php 函数。他们在每 100 个内置 php 函数前面没有反斜杠......但是类定义文件充满了名称空间(例如,paypal rest api)。所以你的回答是最有意义的!
  • 如果有另一个命名空间定义了同名的函数,这是必要的。
  • @TomMettam 如果您在当前命名空间中定义了另一个名为 getallheaders() 的函数,那么您将使用 \getallheaders() 访问全局函数,但这里不是这种情况。
  • 这是正确答案。问题是,当我将代码转换为命名空间类时,我还删除了一些库。上述库之一可能为 nginx 定义了 getallheaders。
【解决方案2】:

通过在函数前面添加反斜杠,如下所示:$headers = \getallheaders();

如果你不在函数前面添加这个反斜杠,它将假定函数与调用它的类在同一个命名空间中。添加反斜杠后,它将在全局命名空间中查找该函数,这是函数所在的位置。

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2016-09-18
    • 2015-11-05
    相关资源
    最近更新 更多