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

溫馨提示×

溫馨提示×

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

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

php中命名空間的調用順序

發布時間:2021-09-05 18:51:36 來源:億速云 閱讀:119 作者:小新 欄目:編程語言

小編給大家分享一下php中命名空間的調用順序,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

首先讓我們看一個小例子。

<?php
namespace A;
use B\D, C\E as F;

// 函數調用

foo();      // 首先嘗試調用定義在命名空間"A"中的函數foo()
            // 再嘗試調用全局函數 "foo"

\foo();     // 調用全局空間函數 "foo" 

my\foo();   // 調用定義在命名空間"A\my"中函數 "foo" 

F();        // 首先嘗試調用定義在命名空間"A"中的函數 "F" 
            // 再嘗試調用全局函數 "F"

// 類引用

new B();    // 創建命名空間 "A" 中定義的類 "B" 的一個對象
            // 如果未找到,則嘗試自動裝載類 "A\B"

new D();    // 使用導入規則,創建命名空間 "B" 中定義的類 "D" 的一個對象
            // 如果未找到,則嘗試自動裝載類 "B\D"

new F();    // 使用導入規則,創建命名空間 "C" 中定義的類 "E" 的一個對象
            // 如果未找到,則嘗試自動裝載類 "C\E"

new \B();   // 創建定義在全局空間中的類 "B" 的一個對象
            // 如果未發現,則嘗試自動裝載類 "B"

new \D();   // 創建定義在全局空間中的類 "D" 的一個對象
            // 如果未發現,則嘗試自動裝載類 "D"

new \F();   // 創建定義在全局空間中的類 "F" 的一個對象
            // 如果未發現,則嘗試自動裝載類 "F"

// 調用另一個命名空間中的靜態方法或命名空間函數

B\foo();    // 調用命名空間 "A\B" 中函數 "foo"

B::foo();   // 調用命名空間 "A" 中定義的類 "B" 的 "foo" 方法
            // 如果未找到類 "A\B" ,則嘗試自動裝載類 "A\B"

D::foo();   // 使用導入規則,調用命名空間 "B" 中定義的類 "D" 的 "foo" 方法
            // 如果類 "B\D" 未找到,則嘗試自動裝載類 "B\D"

\B\foo();   // 調用命名空間 "B" 中的函數 "foo" 

\B::foo();  // 調用全局空間中的類 "B" 的 "foo" 方法
            // 如果類 "B" 未找到,則嘗試自動裝載類 "B"

// 當前命名空間中的靜態方法或函數

A\B::foo();   // 調用命名空間 "A\A" 中定義的類 "B" 的 "foo" 方法
              // 如果類 "A\A\B" 未找到,則嘗試自動裝載類 "A\A\B"

\A\B::foo();  // 調用命名空間 "A" 中定義的類 "B" 的 "foo" 方法
              // 如果類 "A\B" 未找到,則嘗試自動裝載類 "A\B"
?>

仔細觀察上面的小例子,我們可以觀察到什么?當當當,我們現在就給出答案。

在函數調用的時候,如果我們只寫了“foo()”,先調用的命名空間中的函數,然后在調用全局函數;但如果是“\foo()”,這就只調用全局函數了。

在類應用的時候,如果我們寫了“new B();”,將會創建命名空間中定義的類"B"的一個對象,但如果未找到,則嘗試自動裝載類"A\B"。

在調用另一個命名空間中的靜態方法或命名空間函數的時候,如何我們寫了“B\foo()”,這表明我們將調用命名空間中的函數“foo()”;但如果寫的是“B::foo();”就不一樣了,他先調用命名空間中的函數“foo()”,但如果未找到,則嘗試自動裝載類"A\B"。

在當前命名空間中的靜態方法或函數的時候,如何我們寫了“A\B::foo();”,這表明我們會調用命名空間 "A\A" 中定義的類 "B" 的 "foo" 方法,在沒有找到的情況下,自動裝載類 "A\A\B"。

現在讓我們歸納一下。

  • 完全限定函數、類和常量的調用將會在編譯的時候解析。例如,new\a\B解析為類a\B。

  • 所有的非限定名稱和限定名稱(非完全限定名稱)根據當前的導入規則在編譯的時候進行轉換。例如,如果命名空間 A\B\C 被導入為 C,那么對 C\D\e() 的調用就會被轉換為 A\B\C\D\e()。

  • 所有非限定名和限定名(非完全限定名)都在編譯時根據當前導入規則進行轉換。例如,如果命名空間a\B\C作為C導入,則對C\D\e()的調用將轉換為a\B\C\D\e()。

  • 非限定類名在編譯時根據當前導入規則進行轉換(將短導入名替換為全名)。例如,如果命名空間a\B\C作為C導入,則新的C()將轉換為新的a\B\C()。

  • 在命名空間(例如,a\b)中,對非限定名稱的函數調用在運行時解析。例如,對函數foo()的調用解析如下:

    • 在當前命名空間中查找名為 A\B\foo() 的函數

    • 嘗試查找并調用 全局(global) 空間中的函數 foo()。

  • 對命名空間(如a\b)內的非限定名或限定名類(非完全限定名)的調用在運行時解析。以下是調用new c()和new d\e()的解析過程:解析new c():

    • 在當前命名空間中查找A\B\C類。

    • 嘗試自動裝載類A\B\C。

  • new D\E()的解析:

    • 在類名稱前面加上當前命名空間名稱變成:A\B\D\E,然后查找該類。

    • 嘗試自動裝載類 A\B\D\E。

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

以上是“php中命名空間的調用順序”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

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

php
AI

麻栗坡县| 客服| 鹤山市| 龙里县| 富源县| 乐清市| 宁海县| 楚雄市| 朝阳市| 青龙| 哈巴河县| 高邑县| 扶沟县| 闵行区| 乌恰县| 嘉善县| 神木县| 晋中市| 婺源县| 简阳市| 文安县| 遂川县| 乐平市| 泸溪县| 巨野县| 海丰县| 阳信县| 涟水县| 安徽省| 延庆县| 金塔县| 泸州市| 禹城市| 维西| 德保县| 湛江市| 宁安市| 伊宁市| 常宁市| 天台县| 改则县|