了解命名空間

2021-08-09 04:48:35 字數 2705 閱讀 5749

命名空間的作用

解決檔案中引用另乙個檔案時存在相同類名,函式名以及常量名的問題,比如test.php檔案如下

然後在test1.php中載入這個檔案

如果兩者的命名空間相同,包括兩者都沒有設定命名空間的情況下,執行test1.php會報衝突,因為兩個檔案有相同的類test,這是不被允許的,然而命名空間可以很好的解決這個問題,如果將test1.php的命名空間進行修改,如下:

現在兩個檔案的類test在不同的命名空間下,因此不會發生衝突,不過具體要例項化哪個類,且看下文分析

use的作用

命名空間類名

php的命名空間類名總有三種方式

非限定名稱,或不包含字首的類名稱,例如 $a=new foo(); 或 foo::staticmethod(),foo 將被解析為 currentnamespace\foo

限定名稱,或包含字首的名稱,例如 $a = new subnamespace\foo(),如果當前的命名空間是 currentnamespace,則 foo 被解析為currentnamespace\subnamespace\foo

完全限定名稱,或包含了全域性字首操作符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在這種情況下,foo 總是被解析為**中的文字名(literal name)currentnamespace\foo。

下面從官網找來一張圖,詳細的介紹了類名的引用

<?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"

?>

總結

命名空間應用非常廣泛,想要了解命名空間的執行原理還要去了解自動載入。這裡就不說了

如有不準確的地方歡迎指正

C 命名空間,你了解多少?

在c c 中,變數 函式和類的名稱都將存在於全域性作用域中,可能會導致很多衝突。namespace關鍵字的出現就是針對這種問題的。使用命名空間的目的 對識別符號的名稱進行本地化,以避免命名衝突或名字汙染 定義命名空間需要用到namespace關鍵字,後面會跟命名空間的名字,然後接一對 中的內容就是命...

命名空間和函式基礎了解

作用域 命名空間所能夠作用的範圍 內建命名空間 程式任何階段任何位置均可使用 全域性有效 全域性命名空間 程式任何階段任何位置均可使用 全域性有效 區域性命名空間 一般情況下只在各自的區域性命名空間中有效 函式名遇到括號就會呼叫!用法1 函式名可以當做變數名賦值 def index print fr...

C 命名空間 預設命名空間與匿名命名空間

2.匿名命名空間 預設命名空間也叫全域性命名空間,所有沒有置於某一具體命名空間下的 即在預設命名空間下,例如func main 函式。include void func void intmain int argc,char ar void func void 需要注意的是 這個就是類似於c語言裡簡單...