站長資訊網
最全最豐富的資訊網站

PHP中的命名空間定義與使用(實例詳解)

在之前的文章中給大家帶來了《怎樣去搞定PHP類的繼承?(總結分享)》,其中詳細介紹了在PHP類中有關繼承的相關知識,本篇我們繼續來看一下PHP命名空間的相關知識,希望對大家有幫助!

PHP中的命名空間定義與使用(實例詳解)

命名空間其實是個抽象的概念,舉個例子,在我們日常生活中,操作系統中目錄用來將相關文件分組,對于目錄中的文件來說,它就扮演了命名空間的角色。

那么什么是命名空間呢?其實,命名空間可以理解為封裝事物的方法,在PHP中的類、函數、常量是不能夠同名的,為了不讓他們同名,解決三者的同名問題,所以需要用到命名空間。

在PHP中,命名空間主要用來解決用戶編寫的代碼與PHP內部或者第三方的類、函數、常量之間的命名沖突,文件太多的時候總會有可能命名會重復;還有為很長的標識符名稱創建一個很簡短的名稱,這樣的話會提高代碼的可讀性。

那么命名空間是怎樣聲明也就是定義和使用的呢?接下來我們來看一下應該如何定義命名空間吧!

定義命名空間

在PHP中任意正確的代碼都可以包含在命名空間中,但是只有類、函數、常量等類型的代碼才會收到命名空間的影響。

我們通過namespace關鍵字來完成命名空間的定義,它的語法格式如下:

namespace 命名空間名;

示例如下:

<?php   // 定義代碼在 'named' 命名空間中   namespace named;    //在這里可以不使用大括號   // ... 代碼 ...   ?>
  • 定義兩個命名空間:

<?php namespace MyProject {    //這里建議大家使用大括號,這里定義了一個名為MyProject的命名空間     const CONNECT_OK = 1;     class Connection { /* ... */ }     function connect() { /* ... */  } } namespace Another {   //這里定義了一個名為Another的命名空間     const CONNECT_OK = 1;     class Connection { /* ... */ }     function connect() { /* ... */  } } ?>
  • 定義子命名空間

PHP中的命名空間與目錄和文件的關系是很像的,可以允許指定層次化的命名空間名稱。因此,命名空間的名字可以使用分層次的方式來定義,它的語法格式如下:

namespace AppModel; namespace AppControllerHome;

示例如下:

<?php namespace MyProjectSubLevel;  //聲明分層次的單個命名空間 const CONNECT_OK = 1; class Connection { /* ... */ } function Connect() { /* ... */  } ?>

在上述事例中,創建了常量 MyProjectSubLevelCONNECT_OK,類 MyProjectSubLevelConnection 和函數 MyProjectSubLevelConnect

  • 在同一個文件中,定義多個命名空間

我們有兩種語法格式可以在一個文件中定義多個命名空間,示例如下:

首先就是簡單的語法組合

<?php     namespace named;     const CONNECT_OK = 1;     class className {         /* ... */     }     namespace names;     const CONNECT_OK = 1;     class className {         /* ... */     } ?>

然后就是大括號{}

<?php     namespace named{         const CONNECT_OK = 1;         class className {             /* ... */         }     }     namespace names{         const CONNECT_OK = 1;         class className {             /* ... */         }     } ?>

通過上述的介紹,我們已經知道了應該如何定義命名空間,只是定義命名空間還不夠,我們在PHP中使用它才是比較重要的,那接下來看一下應該如何使用命名空間。

使用命名空間

在了解應該如何使用命名空間之前,我們應該要了解的是在PHP中是怎么知道要是用哪一個命名空間中的元素的,這時候我們就需要知道PHP中命名空間元素訪問的原理了。首先PHP中的我們不太清楚,但是文件系統我們可以總結出訪問文件的三種方式:

相對文件名、相對路徑名和絕對路徑名。

PHP命名空間的元素只用同樣的原理,例如命名空間下的類名可以通過三種方式引出:

  • 非限定名稱,或不包含前綴的類名稱,例如$a = new test()或者test,如果當前命名空間是currentnamespace,那么test將被解析為currentnamespacetest。如果test的代碼是全局的,不包含任何命名空間中的代碼,那么test會被解析為test。

  • 限定名稱,或包含前綴名稱,例如$a = new subnamespacetest(),如果當前命名空間是currentnamespace,則 test 會被解析為 currentnamespacesubnamespacetest,如果test的代碼是全局的,不包含任何命名空間中的代碼,那么test會被解析為subnamespacefoo

  • 完全限定名稱,或包含了全局前綴操作符的名稱,例如$a = new currentnamespacetest(),這種情況下,test 總是被解析為代碼中的文字名 currentnamespacetest

下面是一個使用這三種方式的實例,我們需要兩個 PHP 源文件,分別是 demo.php index.php,示例代碼如下:

<?php     namespace TestBarDemo;     const FOO = 1;     function foo() {}     class foo     {         public function demo() {             echo '命名空間為:TestBarDemo';         }     } ?>
<?php     namespace FooBar;     include 'Demo.php';     const FOO = 2;     function foo() {         echo 'FooBar 命名空間下的 foo 函數<br>';     }     class foo     {         static function demo(){             echo '命名空間為:FooBar<br>';         }     }     /* 非限定名稱 */     foo();                  // 解析為 FooBarfoo resolves to function FooBarfoo     foo::demo();            // 解析為類 FooBarfoo 的靜態方法 staticmethod。     echo FOO.'<br>';        // 解析為常量 FooBarFOO     /* 限定名稱 */     Demofoo();             // 解析為函數 FooBarDemofoo     Demofoo::demo();       // 解析為類 FooBarDemofoo,                             // 以及類的方法 demo     echo DemoFOO.'<br>';   // 解析為常量 FooBarDemoFOO                                           /* 完全限定名稱 */     FooBarfoo();         // 解析為函數 FooBarfoo     FooBarfoo::demo();   // 解析為類 FooBarfoo, 以及類的方法 demo     echo FooBarFOO.'<br>'; // 解析為常量 FooBarFOO ?>

在上述事例中,我們需要注意的是,訪問任意全局類、函數或常量,都可以使用完全限定名稱,例如 strlen()Exception 等。

別名、導入

PHP 允許通過別名引用或導入的方式來使用外部的命名空間,這是命名空間的一個重要特征。

在PHP中,通過use關鍵字和as配合可以實現命名空間的導入和設置別名。它的語法格式如下:

use 命名空間 as 別名;

示例如下:

<?php     namespace foo;     use MyFullClassname as Another;     // 下面的例子與 use MyFullNSname as NSname 相同     use MyFullNSname;     // 導入一個全局類     use ArrayObject;     // 導入一個函數     use function MyFullfunctionName;     // 導入一個函數并定義別名     use function MyFullfunctionName as func;     // 導入一個常量     use const MyFullCONSTANT;     $obj = new namespaceAnother;   // 實例化 fooAnother 對象     $obj = new Another;             // 實例化 MyFullClassname 對象     NSnamesubnsfunc();            // 調用 MyFullNSnamesubnsfunc 函數     $a = new ArrayObject(array(1)); // 實例化 ArrayObject 對象                                     // 如果不使用 "use ArrayObject" ,則實例化一個 fooArrayObject 對象     func();                         // 調用 MyFullfunctionName 函數     echo CONSTANT;                  // 打印 MyFullCONSTANT 常量 ?>

其中需要注意的是,導入操作只影響非限定名稱和限定名稱。完全限定名稱由于是確定的,故不受導入的影響。

大家如果感興趣的話,可以點擊《PHP視頻教程》進行

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
日韩美女专区中文字幕| 国产精品99久久久久久| 日韩精品无码免费专区午夜不卡| 国产日韩久久久精品影院首页| 亚洲日韩精品A∨片无码加勒比| 亚洲Av永久无码精品一区二区| 精品无码一级毛片免费视频观看 | 国产精品麻豆高清在线观看| 国产精品亚洲视频| 日韩在线免费视频| 国产在线高清精品二区色五郎| 人妻熟妇乱又伦精品视频| 日韩伦理片电影在线免费观看| 国内成人精品亚洲日本语音| 国产亚洲精品VA片在线播放| 亚洲精品制服丝袜四区| 国产成人精品福利网站在线观看| 精品香蕉久久久午夜福利| 91成人午夜在线精品| 99国产精品久久| 国产精品国产香蕉在线观看网| 久久久久无码精品国产| 久久久亚洲精品国产| 久久精品国产只有精品2020| 日韩乱码人妻无码中文字幕| 国内精品久久久久久影院| 精品国产线拍大陆久久尤物| 久久国产精品成人无码网站| 精品乱码一卡2卡三卡4卡网| 国产精品一区二区久久| 亚洲偷自精品三十六区| 精品国产sm捆绑最大网免费站| 亚洲精品亚洲人成在线麻豆| 亚洲国产精品久久网午夜| 中文字幕精品一区影音先锋| 91精品视品在线播放| 91精品久久久久久久久久小网站| 久久国产亚洲精品无码| 亚洲精品午夜在线观看| 人妖在线精品一区二区三区| 999久久久免费精品国产|