2017-11-11 104 views
0

我是新來的PHP命名空間,我有什麼是:如何防止內置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。我對添加命名空間的錯誤消息感到困惑,並認爲這是問題所在。

如果有其他人在調試過程中被錯誤困惑,就要離開它。還因爲這些評論提高了我對PHP中對命名空間的理解。

EDIT2:,以防有人絆倒在此錯誤並想知道如何解決實際問題(getallheaders沒有受到nginx的定義),它已經在這裏找到答案:Get the http headers from current request in PHP

+0

讓我知道如果你需要我的答案任何幫助。 –

回答

2

全局函數可從任何名稱空間獲得。您不需要像其他答案建議的那樣添加\前綴。

此錯誤表示在名爲getallheaders()的全局名稱空間或當前名稱空間中沒有定義函數。該函數是apache_response_headers()的別名,也可能不存在。我假設PHP不作爲這些功能所需的apache模塊運行。

+1

我被其他答案困惑了。因爲我有多個第三方庫,它們在名稱空間類中調用標準php函數。他們沒有在每百個內置的php函數前面有一個反斜槓......但類定義文件充斥着命名空間(比如,paypal rest api)。所以你的答案最有意義! – IncredibleHat

+0

如果有另一個名稱空間定義一個具有相同名稱的函數,則這是必需的。 –

+1

@TomMettam如果您已經在名爲getallheaders()的當前名稱空間中定義了另一個函數,那麼您將使用'\ getallheaders()'來訪問全局函數,但這不是這種情況。 – Devon

0

通過添加在前面一個反斜槓如下所示:$headers = \getallheaders();

如果您不在函數前面添加此反斜線,它會假定該函數與其從中調用的類位於同一個命名空間中。添加反斜槓使得它可以在全局命名空間中查找該函數,這是函數所在的位置。