男女疯狂一边摸一边做羞羞视频|啊好深好硬快点用力别停动态图|亚洲一区无码中文字幕|特级无码毛片免费视频播放▽|久久狠狠躁免费观看|国内精品久久久久久网站

名稱(chēng)解析規則

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

在說(shuō)明名稱(chēng)解析規則之前,我們先看一些重要的定義:

命名空間名稱(chēng)定義
非限定名稱(chēng)(Unqualified name)

名稱(chēng)中不包含命名空間分隔符的標識符,例如 Foo

限定名稱(chēng)(Qualified name)

名稱(chēng)中含有命名空間分隔符的標識符,例如 Foo\Bar

完全限定名稱(chēng)(Fully qualified name)

名稱(chēng)中包含命名空間分隔符,并以命名空間分隔符開(kāi)始的標識符,例如 \Foo\Bar。 namespace\Foo 也是一個(gè)完全限定名稱(chēng)。

相對名稱(chēng)(Relative name)

這是個(gè)以 namespace 開(kāi)頭的標識符, 例如 namespace\Foo\Bar。

名稱(chēng)解析遵循下列規則:

  1. 完全限定名稱(chēng)總是會(huì )解析成沒(méi)有前綴符號的命名空間名稱(chēng)。 \A\B 解析為 A\B。
  2. 解析相對名稱(chēng)時(shí),會(huì )用當前命名空間的名稱(chēng)替換掉 namespace。 如果名稱(chēng)出現在全局命名空間,會(huì )截掉 namespace\ 前綴。 例如,在命名空間 X\Y 里的 namespace\A 會(huì )被解析成 X\Y\A。 在全局命名空間里,同樣的名字卻被解析成 A。
  3. 對于限定名稱(chēng),名字的第一段會(huì )根據當前 class/namespace 導入表進(jìn)行翻譯。 比如命名空間 A\B\C 被導入為 C, 名稱(chēng) C\D\E 會(huì )被翻譯成 A\B\C\D\E。
  4. 對于限定名稱(chēng),如果沒(méi)有應用導入規則,就將當前命名空間添加為名稱(chēng)的前綴。 例如,位于命名空間 A\B 內的名稱(chēng) C\D\E 會(huì )解析成 A\B\C\D\E。
  5. 根據符號類(lèi)型和對應的當前導入表,解析非限定名稱(chēng)。 這也就是說(shuō),根據 class/namespace 導入表翻譯類(lèi)名稱(chēng); 根據函數導入表翻譯函數名稱(chēng); 根據常量導入表翻譯常量名稱(chēng)。 比如,在 use A\B\C; 后,類(lèi)似 new C() 這樣的名稱(chēng)會(huì )解析為 A\B\C()。 類(lèi)似的,use function A\B\fn; 后, fn() 的用法,解析名稱(chēng)為 A\B\fn。
  6. 如果沒(méi)有應用導入規則,對于類(lèi)似 class 符號的非限定名稱(chēng),會(huì )添加當前命名空間作為前綴。 比如命名空間 A\B 內的 new C() 會(huì )把名稱(chēng)解析為 A\B\C。
  7. 如果沒(méi)有應用導入規則,非限定名稱(chēng)指向函數或常量,且代碼位于全局命名空間之外,則會(huì )在運行時(shí)解析名稱(chēng)。 假設代碼位于命名空間 A\B 中, 下面演示了調用函數 foo() 是如何解析的:
    1. 在當前命名空間中查找函數: A\B\foo()。
    2. 它會(huì )嘗試找到并調用 全局 的函數 foo()。

示例 #1 名稱(chēng)解析示例

<?php
namespace A;
use 
B\DC\as F;

// 函數調用

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

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

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

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

// 類(lèi)引用

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

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

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

new \B();   // 創(chuàng )建定義在全局空間中的類(lèi) "B" 的一個(gè)對象
            // 如果未發(fā)現,則嘗試自動(dòng)裝載類(lèi) "B"

new \D();   // 創(chuàng )建定義在全局空間中的類(lèi) "D" 的一個(gè)對象
            // 如果未發(fā)現,則嘗試自動(dòng)裝載類(lèi) "D"

new \F();   // 創(chuàng )建定義在全局空間中的類(lèi) "F" 的一個(gè)對象
            // 如果未發(fā)現,則嘗試自動(dòng)裝載類(lèi) "F"

// 調用另一個(gè)命名空間中的靜態(tài)方法或命名空間函數

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

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

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

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

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

// 當前命名空間中的靜態(tài)方法或函數

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

\A\B::foo();  // 調用命名空間 "A\B" 中定義的類(lèi) "B" 的 "foo" 方法
              // 如果類(lèi) "A\B" 未找到,則嘗試自動(dòng)裝載類(lèi) "A\B"
?>
男女疯狂一边摸一边做羞羞视频|啊好深好硬快点用力别停动态图|亚洲一区无码中文字幕|特级无码毛片免费视频播放▽|久久狠狠躁免费观看|国内精品久久久久久网站