首頁 後端開發 php教程 PHP中命名空間這部分內容的詳解

PHP中命名空間這部分內容的詳解

Aug 03, 2018 pm 02:45 PM
命名空間 空間

這篇文章跟大家介紹的內容是關於PHP中命名空間這部分內容的詳解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

PHP的命名空間(namespace)是php5.3之後才有的。這個概念在C#已經很早就有了,php中的namespace其實跟c#的概念是一樣的。

為什麼php中要使用namespace?

假設如果不使用namespace,那麼每個類別在一個專案中的名字就必須是固定的。因為php在new的時候不管是呼叫autoload還是呼叫已載入過的類,都存在一個類別名稱對應的檔案。所以在沒有namespace的時候,我們會想各種命名規則來區分不同的類別,例如project1_school1_class1_Student或是project2_school_class_Student。

引入namespace之後就可以將這個有效規避了,一個namespace就等於對應一個檔案路徑,尋找這個類別的時候,就會去對應的檔案路徑尋找類別定義檔了。

namespace的定義和使用

定義:

<code class="php"><?php<br/><br/>namespace Myproject;</code>
登入後複製

<code class="php"><?php<br/><br/>namespace Myproject {<br/><br/>}</code>
登入後複製

使用:

<code class="php"><?php<br/><br/>use Myproject/School;</code>
登入後複製
<code class="php"><?php<br/><br/>use Myproject/School as School1;   // 别名</code>
登入後複製

#命名空間是運行時解析的。 use就相當於一種聲明,不解析、載入。例如下面這個範例:

test.php

<code class="php"><?php<br/>use my\name;<br/>require_once("/home/yejianfeng/handcode/test/namespace1.php");<br/>$a = new my\name\A();<br/>$a->Print1();</code>
登入後複製

namespace1.php

<code class="php"><?php<br/>namespace my\name;<br/>class A {<br/>        public function Print1(){<br/>                echo 11;<br/>        }<br/>}</code>
登入後複製

雖然require_once在use下面,也是可以正常運作的,因為程式只有在new my\ name\A()的時候才去載入命名空間my\name

全域類別和命名空間類別

如果要new一個全域類別使用new \A( )

如果要new一個命名空間類,使用new my\namespace\A()

#命名空間的順序

自從有了命名空間之後,最容易出錯的該是使用類別的時候,這個類別的尋找路徑是什麼樣的了。

如果能弄清楚manual中的這個例子就能全部弄清楚尋找順序了。

<code class="php"><?php<br/>namespace A;<br/>use B\D, C\E as F;<br/><br/>// 函数调用<br/><br/>foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()<br/>            // 再尝试调用全局函数 "foo"<br/><br/>\foo();     // 调用全局空间函数 "foo" <br/><br/>my\foo();   // 调用定义在命名空间"A\my"中函数 "foo" <br/><br/>F();        // 首先尝试调用定义在命名空间"A"中的函数 "F" <br/>            // 再尝试调用全局函数 "F"<br/><br/>// 类引用<br/><br/>new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象<br/>            // 如果未找到,则尝试自动装载类 "A\B"<br/><br/>new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象<br/>            // 如果未找到,则尝试自动装载类 "B\D"<br/><br/>new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象<br/>            // 如果未找到,则尝试自动装载类 "C\E"<br/><br/>new \B();   // 创建定义在全局空间中的类 "B" 的一个对象<br/>            // 如果未发现,则尝试自动装载类 "B"<br/><br/>new \D();   // 创建定义在全局空间中的类 "D" 的一个对象<br/>            // 如果未发现,则尝试自动装载类 "D"<br/><br/>new \F();   // 创建定义在全局空间中的类 "F" 的一个对象<br/>            // 如果未发现,则尝试自动装载类 "F"<br/><br/>// 调用另一个命名空间中的静态方法或命名空间函数<br/><br/>B\foo();    // 调用命名空间 "A\B" 中函数 "foo"<br/><br/>B::foo();   // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法<br/>            // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"<br/><br/>D::foo();   // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法<br/>            // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"<br/><br/>\B\foo();   // 调用命名空间 "B" 中的函数 "foo" <br/><br/>\B::foo();  // 调用全局空间中的类 "B" 的 "foo" 方法<br/>            // 如果类 "B" 未找到,则尝试自动装载类 "B"<br/><br/>// 当前命名空间中的静态方法或函数<br/><br/>A\B::foo();   // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法<br/>              // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"<br/><br/>\A\B::foo();  // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法<br/>              // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"<br/>?></code>
登入後複製

相關文章推薦:

php變數的命名規則以及php變數的用法(附程式碼)

php如何利用32進位實作對id的加密解密(附程式碼)

以上是PHP中命名空間這部分內容的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

機器學習基礎之數字上的距離:點在空間中的距離 機器學習基礎之數字上的距離:點在空間中的距離 Apr 11, 2023 pm 11:40 PM

本文轉載自微信公眾號「活在資訊時代」,作者活在資訊時代。轉載本文請聯絡活在資訊時代公眾號。在機器學習中,一個基礎的概念就是如何判斷兩個樣本之間的差異,以便能夠評估兩個樣本之間的相似性和類別等資訊。而判斷這種相似性的測量就是兩個樣本在特徵空間內的距離。根據資料特徵的不同,度量方法有很多種。一般而言,對兩個資料樣本x,y,定義一個函數d(x,y),如果定義其為兩個樣本之間的距離,那麼d(x,y)則需要滿足以下幾個基本性質:非負性:d(x,y)&gt;=0同一性:d(x,y)=0 ⇔ x=y對

如何在 Ubuntu 上新增交換空間 22.04 LTS 如何在 Ubuntu 上新增交換空間 22.04 LTS Feb 20, 2024 am 11:12 AM

交換空間在Linux系統中扮演著重要角色,特別是在系統記憶體不足時。它充當一個備用的記憶體儲存空間,可以幫助系統平穩運行,即使在負載高的情況下也能保持穩定性。本文為您提供了在Ubuntu22.04LTS上新增交換空間的詳細指南,以確保您的系統效能經過最佳化並能應付各種工作負載。了解交換空間交換空間提供虛擬內存,用於補充系統的實體RAM。當系統的RAM不足時,核心會將資料交換到磁碟,以防止記憶體不足和系統崩潰。 Linux系統常用交換空間來處理這種情況。同時運行多個內存密集型應用程式處理非常大的檔案或數據

解決PHP報錯:未找到指定的命名空間類 解決PHP報錯:未找到指定的命名空間類 Aug 18, 2023 pm 11:28 PM

解決PHP報錯:未找到指定的命名空間類別在使用PHP進行開發時,我們經常會遇到各種各樣的報錯資訊。其中一個常見的報錯就是「未找到指定的命名空間類別」。這個錯誤通常是由於引入的類別檔案沒有被正確地命名空間引用所引起的。本文將介紹如何解決這個問題,並提供一些程式碼範例。首先,讓我們來看看一個常見的報錯訊息範例:Fatalerror:UncaughtError:C

c盤剩餘空間多大合適 c盤剩餘空間多大合適 Jun 27, 2023 pm 02:51 PM

c盤剩餘空間50-80G比較適合。由於系統在日後使用當中會產生垃圾檔案,快取檔案等因此建議至少預留50GB-80GB的空間給C碟;如果您不習慣在安裝軟體時選擇路徑,日常也不是經常清理電腦,那麼至少需要100GB 。

升級win11需要的C盤空間介紹 升級win11需要的C盤空間介紹 Dec 23, 2023 am 08:57 AM

眾所周知,如果系統安裝完成後佔用系統碟太大,可能會導致系統運行卡頓、延遲,甚至是檔案遺失。因此大家在安裝win11系統之前,需要先了解升級win11需要多大C盤空間,下面就跟著小編一起來看看吧。升級win11需要多大C碟空間:答:升級win11需要20-30GB的C碟空間。 1.根據微軟的win11設定要求可以看到,win11安裝需要64GB的硬碟空間。 2、但其實一般來說是不需要這麼大的空間的。 3.根據已經安裝win11的用戶回饋,win11升級大概需要20-30GB的C碟空間。 4.但是如果我門只有

如何在F3框架中使用命名空間(Namespace)? 如何在F3框架中使用命名空間(Namespace)? Jun 03, 2023 am 08:02 AM

F3框架是一款簡單易用,靈活可擴充的PHPWeb框架,它的命名空間(Namespace)機制為我們提供了一個更規範、可讀性更強、程式碼結構更為清晰的程式設計方式。在這篇文章中,我們將探討如何在F3框架中使用命名空間。一、什麼是命名空間命名空間常被用來解決在PHP中命名衝突的問題,它可以將一個或多個類別、函數或常數封裝在一個命名空間中,相當於為它們加上一個前綴。例

Redis的命名空間與過期機制的設計想法與實作方式 Redis的命名空間與過期機制的設計想法與實作方式 May 11, 2023 am 10:40 AM

Redis是一個開源的高效能的鍵值儲存資料庫。在使用Redis進行資料儲存的時候,我們需要考慮到鍵的命名空間與過期機制的設計,來維護Redis的效能和資料完整性。本文將介紹Redis的命名空間和過期機制的設計想法和實作方式。一、Redis的命名空間設計思路在Redis中,鍵是可以任意設定的。為了方便管理和區分不同的資料類型,Redis引入了命名空間的概念。命

iOS 17.2:如何在 iPhone 15 Pro 上錄製空間視頻 iOS 17.2:如何在 iPhone 15 Pro 上錄製空間視頻 Dec 15, 2023 pm 01:09 PM

如果您使用的是iPhone15或iPhone15ProMax,iOS17.2允許您錄製空間視頻,以便在Apple即將推出的VisionPro耳機上的照片應用程式中查看。這是你如何做到的。 Apple的VisionPro耳機預計將於2024年&lt;&gt;月左右發售。在那之前,您可以為此做好準備的一種方法是使用iPhone以一種稱為空間視頻的特殊格式錄製視頻,該格式可在Apple的耳機上觀看。在iPhone上觀看時,空間視頻顯示為普通視頻,但它們在VisionPro上提供了近乎三維

See all articles