站長資訊網
        最全最豐富的資訊網站

        小編帶你學命名空間的調用順序

        上一篇文章中我們了解了訪問命名空間內部元素,有需要的請看《小編帶你了解如何訪問命名空間內部元素(php版)》。這次我們向大家介紹命名空間的順序,有需要的可以參考參考。

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

        <?php namespace A; use BD, CE as F;  // 函數調用  foo();      // 首先嘗試調用定義在命名空間"A"中的函數foo()             // 再嘗試調用全局函數 "foo"  foo();     // 調用全局空間函數 "foo"   myfoo();   // 調用定義在命名空間"Amy"中函數 "foo"   F();        // 首先嘗試調用定義在命名空間"A"中的函數 "F"              // 再嘗試調用全局函數 "F"  // 類引用  new B();    // 創建命名空間 "A" 中定義的類 "B" 的一個對象             // 如果未找到,則嘗試自動裝載類 "AB"  new D();    // 使用導入規則,創建命名空間 "B" 中定義的類 "D" 的一個對象             // 如果未找到,則嘗試自動裝載類 "BD"  new F();    // 使用導入規則,創建命名空間 "C" 中定義的類 "E" 的一個對象             // 如果未找到,則嘗試自動裝載類 "CE"  new B();   // 創建定義在全局空間中的類 "B" 的一個對象             // 如果未發現,則嘗試自動裝載類 "B"  new D();   // 創建定義在全局空間中的類 "D" 的一個對象             // 如果未發現,則嘗試自動裝載類 "D"  new F();   // 創建定義在全局空間中的類 "F" 的一個對象             // 如果未發現,則嘗試自動裝載類 "F"  // 調用另一個命名空間中的靜態方法或命名空間函數  Bfoo();    // 調用命名空間 "AB" 中函數 "foo"  B::foo();   // 調用命名空間 "A" 中定義的類 "B" 的 "foo" 方法             // 如果未找到類 "AB" ,則嘗試自動裝載類 "AB"  D::foo();   // 使用導入規則,調用命名空間 "B" 中定義的類 "D" 的 "foo" 方法             // 如果類 "BD" 未找到,則嘗試自動裝載類 "BD"  Bfoo();   // 調用命名空間 "B" 中的函數 "foo"   B::foo();  // 調用全局空間中的類 "B" 的 "foo" 方法             // 如果類 "B" 未找到,則嘗試自動裝載類 "B"  // 當前命名空間中的靜態方法或函數  AB::foo();   // 調用命名空間 "AA" 中定義的類 "B" 的 "foo" 方法               // 如果類 "AAB" 未找到,則嘗試自動裝載類 "AAB"  AB::foo();  // 調用命名空間 "A" 中定義的類 "B" 的 "foo" 方法               // 如果類 "AB" 未找到,則嘗試自動裝載類 "AB" ?>

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

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

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

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

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

        現在讓我們歸納一下。

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

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

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

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

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

          • 在當前命名空間中查找名為 ABfoo() 的函數

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

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

          • 在當前命名空間中查找ABC類。

          • 嘗試自動裝載類ABC。

        • new DE()的解析:

          • 在類名稱前面加上當前命名空間名稱變成:ABDE,然后查找該類。

          • 嘗試自動裝載類 ABDE。

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

        就說到這里了,有其他想知道的,可以點擊這個哦。→ →php視頻教程

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲欧美精品综合中文字幕| 精品无码久久久久久午夜| 午夜精品久久影院蜜桃| 999精品在线| 亚洲精品无码久久久久去q| 亚洲国产精品嫩草影院| 精品人妻va出轨中文字幕| 无码AⅤ精品一区二区三区| 99热热久久这里只有精品68| 91久久精品91久久性色| 亚洲AV无码国产精品色午友在线| 久久国产精品无码网站| 99在线观看视频免费精品9| 97人妻无码一区二区精品免费| 亚洲精品tv久久久久久久久| 久久久久亚洲精品天堂久久久久久 | 国产在线精品国自产拍影院| 精品国产欧美另类一区| 久久国产热精品波多野结衣AV| 四虎国产精品永久地址入口| 国产一区二区三区精品视频| 1区1区3区4区产品芒果精品| 国产亚洲精品激情都市| 亚洲精品综合一二三区在线| 99久久国语露脸精品国产| 国产精品国产三级国产av品爱网 | 国产伦精品一区二区三区视频猫咪 | 国产韩国精品一区二区三区| 亚洲综合精品一二三区在线| 国产一区二区三区久久精品| 国产精品9999久久久久| 久久99精品国产自在现线小黄鸭 | 无码人妻精品一区二区蜜桃AV| 青青久久精品国产免费看| 日韩精品无码Av一区二区| 华人亚洲欧美精品国产| 久久er国产精品免费观看2| 国产精品免费看久久久| 少妇人妻无码精品视频| 亚洲精品国产字幕久久不卡| 最新欧美性爱精品一区二区三区|