PHP命名空間解析規則

2021-07-06 08:10:10 字數 2424 閱讀 9983

名稱中不包含命名空間分隔符的識別符號,例如foo
名稱中含有命名空間分隔符的識別符號,例如:foo\bar
名稱中包含命名空間分隔符,並以命名空間分隔符開始的識別符號,例如:\foo\bar.

namespace\foo 也是乙個完全限定名稱。

對完全限定名稱的函式,類和常量的呼叫在編譯時解析。例如 new \a\b 解析為類 a\b。

所有的非限定名稱和限定名稱(非完全限定名稱)根據當前的匯入規則在編譯時進行轉換。例如,如果命名空間 a\b\c 被匯入為 c,那麼對 c\d\e() 的呼叫就會被轉換為 a\b\c\d\e()。

在命名空間內部,所有的沒有根據匯入規則轉換的限定名稱均會在其前面加上當前的命名空間名稱。例如,在命名空間 a\b 內部呼叫 c\d\e(),則 c\d\e() 會被轉換為 a\b\c\d\e()。

非限定類名根據當前的匯入規則在編譯時轉換(用全名代替短的匯入名稱)。例如,如果命名空間 a\b\c 匯入為c,則 new c() 被轉換為 new 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

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" 中定義的類 "b" 的 "foo" 方法

// 如果類 "a\b" 未找到,則嘗試自動裝載類 "a\b"

?>

PHP命名空間規則解析及高階功能

2010 03 09 17 48 小大 分享至 詞庫網 監控 伺服器監控 seo監控 手機遊戲 iphone遊戲 日前發布的php 5.3中,最重要的乙個新特性就是命名空間的加入。本文介紹了php命名空間的一些術語,其解析規則,以及一些高階功能的應用,希望能夠幫助讀者在專案中真正使用命名空間。在這裡...

PHP命名空間規則解析及高階功能

日前發布的php 5 3中,最重要的乙個新特性就是命名空間的加入。本文介紹了php命名空間的一些術語,其解析規則,以及一些高階功能的應用,希望能夠幫助讀者在專案中真正使用命名空間。在這裡中我們介紹了php命名空間的用途和namespace關鍵字,在這篇文章中我們將介紹一下use命令的使用以及php如...

php 命名空間,PHP使用命名空間

介紹 命名空間中的類,函式或常量可以通過以下方式使用 在當前命名空間中使用類 指定相對於當前命名空間的命名空間 提供命名空間的全限定名稱 從當前命名空間 在此示例中,從test1.php載入了命名空間。沒有命名空間引用的函式或類名稱將訪問當前命名空間中的功能或類名稱 示例 test1.php nam...