首頁 後端開發 php教程 什麼是命名空間

什麼是命名空間

Nov 14, 2017 am 10:34 AM
什麼 命名 空間

命名空間一個最明確的目的是解決重名問題,PHP中不允許兩個函數或類別出現相同的名字,否則會產生一個致命的錯誤。這種情況只要避免命名重複就可以解決,最常見的做法就是約定一個前綴。

範例:專案中有兩個模組:article和message board,它們各自有一個處理使用者留言的類別Comment。之後我可能想要增加對所有用戶留言的一些資訊統計功能,比如說我想得到所有留言的數量。這時候呼叫它們Comment提供的方法是很好的做法,但是同時引入各自的Comment類別顯然是不行的,程式碼會出錯,在另一個地方重寫任何一個Comment也會降低維護性。那這時只能重構類別名,我約定了一個命名規則,在類別名稱前面加上模組名,像這樣:Article_Comment、MessageBoard_Comment

可以看到,名字變得很長,那意味著以後使用Comment的時候會寫更多的程式碼(至少字元多了)。並且,以後如果要對各個模組增加更多的一些整合功能,或者是互相調用,發生重名的時候就需要重構名字。當然在專案開始的時候就注意到這個問題,並規定命名規則就能很好的避免這個問題。另一個解決方法可以考慮使用命名空間

在宣告一個命名空間時,花括弧內不僅可以包含變量,而且還可以包含以下類型:

變數(可以帶有初始化)

常數

函數(可以是定義或宣告)

結構體

類別

模板

#命名空間(命名空間可以嵌套定義)

命名空間的使用概要:

Tips:在以下範例中成為了兩個文件,一個Demo. php,一個index.php,兩個檔案處於同級目錄下;Demo.php檔案中書寫命名空間以及Demo類,index.php呼叫Demo.php中的Demo類別;如下範例中的「輸出結果」即表示瀏覽器存取index.php。

簡單的範例

Demo.php檔案程式碼

<?php
  namespace DemoNameSpace;
 class Demo {   
     private $mysqlHandle;  
     public function construct(){     
     echo &#39;This is namespace of PHP demo ,The Demo magic constant "NAMESPACE" is &#39;.NAMESPACE; 
     }}?>
登入後複製

index.php檔案程式碼

<?php 
 include &#39;Demo.php&#39;; 
 use DemoNameSpace\Demo;
 $DemoObj = new Demo();
 ?>
登入後複製

輸出結果1:“ This is namespace of PHP demo ,The Demo magic constant "NAMESPACE" is DemoNameSpace」

以上範例的說明:Demo.php中有一個_NAMESPACE魔法常數;「它包含目前命名空間名稱的字串。在全域的,不包括在任何命名空間中的程式碼,它包含一個空的字串。文件,如下:

<?php
include &#39;Demo.php&#39;;
$Demo = new Demo();
?>
登入後複製

輸出結果2:「Fatal error: Class 'Demo' not found in F:\JJserver\demo\index.php on line 4」

這個是常見的「致命錯誤」訊息了。依照常規的php程式思路,這裡的輸出應該是跟「輸出結果1」一致的,但這裡它偏要來個致命錯誤,這下要抓狂了吧? ~

行,先把抓狂的麻煩解決,去掉(或註解掉)Demo.php檔案中的:「namespace DemoNameSpace;」這個語句,就正常了。這是咱們平常寫class、呼叫class最常見的書寫方法,就不再解釋這種不使用namespace的情況了。

比較使用namespace與不使用namespace的兩種輸出情況,並加入namespace的定義理解後,上述出現致命錯誤的情況就很好理解了。在Demo.php中定義了一個namespace,也就是命名空間後,接著定義了Demo類,然後這個Demo類別就被歸併到了DemoNameSpace命名空間中去了,那麼要呼叫這個Demo類時,自然要先呼叫這個DemoNameSpace命名空間了,也就是在index.php檔案中使用「useDemoNameSpace\Demo」語句了。

二、複雜一點的範例

Demo.php檔案程式碼

<?php
namespace DemoNameSpace; 
class Demo {  
  private $mysqlHandle;    
  public function construct(){        
  echo &#39;This is namespace of PHP demo ,The Demo magic constant "NAMESPACE" is &#39;.NAMESPACE;
  }} 
  namespace DemoNameSpace1; 
  const constDefine = &#39;JJonline1&#39;; 
  class Demo {   
  private $mysql; 
  const constDefine = &#39;JJonline2&#39;; 
  public function construct() { 
  echo &#39;The const constant outside class is: &#39;.constDefine; 
  echo &#39;===cut-off rule of god!!!!===&#39;;
  echo &#39;The const constant inside class is: &#39;.self::constDefine;
   }}?>
登入後複製

index.php檔案程式碼

<?php 
include &#39;Demo.php&#39;; 
use DemoNameSpace1\Demo as Test; 
$Demo = new Test(); 
echo &#39;||||&#39;.DemoNameSpace1\constDefine;?>
登入後複製

輸出結果3:「The const constant outside class is: JJonline1===cut-off rule of god!!!!===The const constant inside class is: JJonline2||||JJonline1”

这个结果在没有命名空间的时候,就直接报诸如“Fatal error: Cannot redeclare class Demo”的致命错误了。但运行没有报错,这也就是php5.3以后引入的命名空间的好处了,就诸如本文开头引用的官方解释中以不同目录下的相同文件名的文件可以存在一样是一个道理了。Demo.php文件中,定义的第一个名称叫做Demo的class类被归并到了DemoNameSpace的命名空间,而定义的第二个名称叫做Demo的class被归并到了DemoNameSpace1的命名空间,故而并不会出现不能重复定义某一个类的致命错误。以上的书写方法是要尽量避免的,因为类外部const常量名与类内部const常量名是一样的,很容易混淆,这里这样书写的目的就是看看不同位置申明的const常量,在调用时的情况;输出结果3已经很明显了,就不再多墨迹解释了。

Demo.php中DemoNameSpace1命名空间下还将const常量constDefine提出,拿到了定义class之外,这又要抓狂了,因为之前的知识是define定义全局常量,const定义class内部常量;这儿却将const拿出来玩了...具体就不再讲解了,Demo.php文件代码以及运行后的结果已经很明确的表明了相关知识。class内部定义的const只能在class的内部调用,采用self::constName形式,而class内部调用命名空间下、class外的const常量,则可以直接使用诸如define定义的常量一样使用。当需要使用该命名空间下、class外定义的const常量时,就使用类似路径形式的方式调用(index.php文件中的输出)。

该例子还有一点说明,就是在index.php中使用了use as语句,看index.php的代码,意义一目了然,new的一个class名称叫Test,但Test这个类并没有在Demo.php中定义,却没有出错,这就在于了use as语句了,具体意义不再解释。

通过上述的了解,namespace关键字可以将实现各种功能的class通过指定不同的命名空间分门别类存放,而且不同命名空间下的class可以同名;另外const常量定义也可以提出到class外部,当然也会有作用范围这么一个“内涵”~

总结下namespace的相关知识:

1、当前脚本文件的第一个命名空间前面不能有任何代码,例如如下代码就是会报致命错误的:

<?php
define("GREETING","Hello world!"); 
namespace DemoNameSpace;
class Demo { 
private $mysqlHandle; 
public function construct() { 
echo &#39;This is namespace of PHP demo ,The Demo magic constant "NAMESPACE" is &#39;.NAMESPACE;
 }}
 $Demo = new Demo();
 ?>
登入後複製

运行上述代码,会出现致命错误:“Fatal error: Namespace declaration statement has to be the very first statement in xxxx”

2、命名空间下直接new该命名空间中的class名称,可以省略掉use语法,这是php按脚本书写顺序执行导致的。例如如下代码是可以运行的

<?php
namespace DemoTest;
class Demo {   
 public function construct() {       
 echo &#39;this is a test script&#39;;   
 }}
 namespace DemoNameSpace;
 class Demo {   
 private $mysqlHandle;
 public function construct() { 
 echo &#39;This is namespace of PHP demo ,The Demo magic constant "NAMESPACE" is &#39;.NAMESPACE; 
 }}$
 Demo = new Demo();
 ?>
登入後複製

运行结果4:“This is namespace of PHP demo ,The Demo magic constant "NAMESPACE" is DemoNameSpace”

这个结果表明,同一脚本下new一个没有指定use哪个命名空间时,会顺着该脚本,使用最靠近new语句之前的一个命名空间中的class

3、公共空间:可以简单的理解,没有定义命名空间的方法(函数)、类库(class)、属性(变量)都默认归属于公共空间。这样就解释了为php5.3.0以前版本书写的代码大部分为何在php5.3.0及其以上版本还能正常运行的原因。另外:公共空间中的代码段被引入到某个命名空间下后,该公共空间中的代码段不属于任何命名空间!

命名空间的引入,让php面向对象编程更加的贴切,合理利用命名空间,也可以让项目文件规划,以上就是介绍命名空间的所有内容。

相关推荐:

实例详解PHP命名空间用法

PHP命名空间、性状与生成器相关介绍

php中命名空间与性状以及生成器新特性的详解

php namespace命名空间的定义方法实例详解

以上是什麼是命名空間的詳細內容。更多資訊請關注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)

熱門話題

Java教學
1658
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1231
24
如何在技嘉主機板上設定鍵盤啟動功能 (技嘉主機板啟用鍵盤開機方式) 如何在技嘉主機板上設定鍵盤啟動功能 (技嘉主機板啟用鍵盤開機方式) Dec 31, 2023 pm 05:15 PM

技嘉的主機板怎麼設定鍵盤開機首先,要支援鍵盤開機,一定是PS2鍵盤! !設定步驟如下:第一步:開機按Del或F2進入bios,到bios的Advanced(進階)模式普通主機板預設進入主機板的EZ(簡易)模式,需要按F7切換到進階模式,ROG系列主機板預設進入bios的進階模式(我們用簡體中文來示範)第二步:選擇到-【進階】-【進階電源管理(APM)】第三步:找到選項【由PS2鍵盤喚醒】第四步:這個選項預設是Disabled(關閉)的,下拉之後可以看到三種不同的設定選擇,分別是按【空白鍵】開機、按組

i7 3770的最佳搭配顯示卡是什麼? i7 3770的最佳搭配顯示卡是什麼? Dec 29, 2023 am 09:12 AM

酷睿i73770配什麼顯卡好啊RTX3070是一款非常強大的顯示卡,它具有出色的性能和先進的技術。無論是玩遊戲、渲染圖形或是進行機器學習,RTX3070都能輕鬆應付。它採用了NVIDIA的Ampere架構,擁有5888個CUDA核心和8GB的GDDR6內存,能夠提供流暢的遊戲體驗和高品質的圖形效果。 RTX3070也支援光線追蹤技術,能夠呈現逼真的光影效果。總而言之,RTX3070是一款強大且先進的顯示卡,適合那些追求高效能和高品質的使用者使用。 RTX3070是一款NVIDIA系列的顯示卡。採用第2代NVID

機器學習基礎之數字上的距離:點在空間中的距離 機器學習基礎之數字上的距離:點在空間中的距離 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系統常用交換空間來處理這種情況。同時運行多個內存密集型應用程式處理非常大的檔案或數據

選擇適合音樂生的平板電腦 選擇適合音樂生的平板電腦 Jan 10, 2024 pm 10:09 PM

音樂生用什麼平板合適華為的ipad中的12.9吋音響是一款非常好的產品。它配備了四個揚聲器,音效非常出色。而且,它屬於pro系列,相比其他款式稍微更好。整體來說,ipadpro是一款非常優秀的產品。這款mini4手機的喇叭聲音較小,效果一般般。不能用來外放音樂,還是需要依賴耳機來享受音樂。耳機音質好的會有稍微好一些的效果,而便宜的三四十元的耳機就無法滿足要求了。鋼琴電子譜用什麼平板如果您想購買一台10寸以上的iPad,我推薦使用兩款應用程序,分別是Henle和Piascore。 Henle提供

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.但是如果我門只有

C++ 函數命名中參數順序的考慮 C++ 函數命名中參數順序的考慮 Apr 24, 2024 pm 04:21 PM

在C++函數命名中,考慮參數順序至關重要,可提高可讀性、減少錯誤並促進重構。常見的參數順序約定包括:動作-物件、物件-動作、語意意義和遵循標準函式庫。最佳順序取決於函數目的、參數類型、潛在混淆和語言慣例。

See all articles