中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中命名空間是什么

發布時間:2021-10-11 10:41:25 來源:億速云 閱讀:149 作者:柒染 欄目:大數據

PHP中命名空間是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

PHP中命名空間是怎樣的存在

全局空間

當文件中定義了命名空間,也就是namesapce指定了當前的命名空間后,在調用全局類、函數、常量時,需要添加一個“\”,也就是完全限定訪問符號來標明這個類、函數、常量是全局的那個,而不是當前命名空間中的。特別是當前命名空間中包含與全局類、函數、常量同名的內容時。

namespace FILE6;

function show()
{
    echo strtoupper('aaa'), PHP_EOL; // 調用自己的
    echo \strtoupper('aaa'), PHP_EOL; // 調用全局的
}

function strtoupper($str)
{
    return __NAMESPACE__ . ':' . \strtoupper($str);
}

 

在這個FILE6命名空間中,我們定義了一個strtoupper()方法。之間說過,命名空間就是為了解決同名問題而出現的,這個方法和全局php自帶的那個方法是完全相同的名稱的。所以,在調用的時候我們需要調用的是哪個方法。那么如果當前命名空間中沒有定義這個方法呢?別急,接下來的內容就是講這個問題。

 

后備全局函數/常量

從上個例子中,我們就可以看出全局完全限定訪問符的作用,當沒有使用全局符時,strtoupper()方法會先調用當前命名空間下的方法。那么后備的作用就是如果當前命名空間中沒有找到時,會去全局找相關的函數。在文檔中的定義是這樣的:

當 PHP 遇到一個非限定的類、函數或常量名稱時,它使用不同的優先策略來解析該名稱。類名稱總是解析到當前命名空間中的名稱。因此在訪問系統內部或不包含在命名空間中的類名稱時,必須使用完全限定名稱。對于函數和常量來說,如果當前命名空間中不存在該函數或常量,PHP 會退而使用全局空間中的函數或常量。

意思也就是說,函數和常量,會有后備去全局查找的能力。但是類不行!!如果要使用全局類,一定要加全局完全限定符。我們通過一個例子來看:

namespace FILE7;

// 類必須使用完全限定的全局空間
$o1 = new \stdClass();
// $o2 = new stdClass(); // Fatal error: Uncaught Error: Class 'FILE7\stdClass' not found

// 方法會先在本命名空間查找,如果沒找到會去全局找
function strlen($str)
{
    return __NAMESPACE__ . ':' . (\strlen($str) - 1);
}
echo strlen('abc'), PHP_EOL; // FILE7:2 ,當前命名空間
echo \strlen('abc'), PHP_EOL; // 3 , 全局

echo strtoupper('abc'), PHP_EOL; // ABC, 全局

// 常量也是有后備能力的

const E_ERROR = 22; 
echo E_ERROR, PHP_EOL; // 22, 當前命名空間
echo \E_ERROR, PHP_EOL; // 1, 全局

echo INI_ALL, PHP_EOL; // 7, 全局
   

名稱解析規則

  1. 對完全限定名稱的函數,類和常量的調用在編譯時解析。例如 new \A\B 解析為類 A\B。
  2. 所有的非限定名稱和限定名稱(非完全限定名稱)根據當前的導入規則在編譯時進行轉換。例如,如果命名空間 A\B\C 被導入為 C,那么對 C\D\e() 的調用就會被轉換為 A\B\C\D\e()。
  3. 在命名空間內部,所有的沒有根據導入規則轉換的限定名稱均會在其前面加上當前的命名空間名稱。例如,在命名空間 A\B 內部調用 C\D\e(),則 C\D\e() 會被轉換為 A\B\C\D\e() 。
  4. 非限定類名根據當前的導入規則在編譯時轉換(用全名代替短的導入名稱)。例如,如果命名空間 A\B\C 導入為C,則 new C() 被轉換為 new A\B\C() 。
  5. 在命名空間內部(例如A\B),對非限定名稱的函數調用是在運行時解析的。例如對函數 foo() 的調用是這樣解析的:
    • 在當前命名空間中查找名為 A\B\foo() 的函數
    • 嘗試查找并調用 全局(global) 空間中的函數 foo()。
  6. 在命名空間(例如A\B)內部對非限定名稱或限定名稱類(非完全限定名稱)的調用是在運行時解析的。下面是調用 new C() 及 new D\E() 的解析過程:new C()的解析:
    • 在當前命名空間中查找A\B\C類。
    • 嘗試自動裝載類A\B\C。

new D\E()的解析:

  1. 在類名稱前面加上當前命名空間名稱變成:A\B\D\E,然后查找該類。
  2. 嘗試自動裝載類 A\B\D\E。

為了引用全局命名空間中的全局類,必須使用完全限定名稱 new \C()。


看完上述內容,你們掌握PHP中命名空間是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

梓潼县| 嘉善县| 衢州市| 壤塘县| 康马县| 凤冈县| 德兴市| 宁晋县| 冷水江市| 平舆县| 光泽县| 丰台区| 宣恩县| 北票市| 恩施市| 密云县| 阿拉善左旗| 仁寿县| 交城县| 清徐县| 桐柏县| 云阳县| 延边| 辽源市| 牡丹江市| 凤城市| 怀宁县| 克东县| 怀柔区| 乌什县| 阳朔县| 罗田县| 桦川县| 湘西| 武冈市| 聊城市| 延边| 临武县| 永济市| 瑞丽市| 梅河口市|