這篇文章主要介紹了關於PHP的命名空間,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
(PHP 5 >= 5.3.0, PHP 7)
什麼是命名空間?從廣義來說,命名空間是一種封裝事物的方法。在很多地方都可以看到這種抽象概念。例如,在作業系統中目錄用來將相關檔案分組,而對於目錄中的檔案來說,它就扮演了命名空間的角色。具體舉個例子,檔案 foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 檔案。另外,在目錄 /home/greg 外存取 foo.txt 檔案時,我們必須將目錄名稱以及目錄分隔符號放在檔案名稱之前得到 /home/greg /foo.txt。這個原理應用在程式設計領域就是命名空間的概念。
在PHP中,命名空間用來解決在編寫類別庫或應用程式時創建可重複使用的程式碼如類別或函數時碰到的兩類問題:
使用者所寫的程式碼與PHP內部的類別/函數/常數或第三方類別/函數/常數之間的名字衝突。
為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高來源代碼的可讀性。
雖然任意合法的PHP程式碼都可以包含在命名空間中,但只有以下類型的程式碼受命名空間的影響,它們是:類別(包括抽象類別和traits)、介面、函數和常數。
命名空間透過關鍵字namespace 來宣告。如果一個檔案中包含命名空間,它必須在其它所有程式碼之前聲明命名空間,除了一個以外:declare關鍵字。
在宣告命名空間之前唯一合法的程式碼是用來定義原始檔編碼方式的 declare 語句。另外,所有非PHP 程式碼包括空白符號都不能出現在命名空間的宣告之前:
<html> <?php namespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句?>
另外,與PHP其它的語言特徵不同,同一個命名空間可以定義在多個檔案中,即允許將同一個命名空間的內容分割存放在不同的檔案中。
1. 範例一
首先我們建立兩個類別檔案
a.php
<?phpclass Test { public function ceshi(){ echo __FILE__; } }
b.php
<?phpclass Test { public function ceshi(){ echo __FILE__; } }
index.php
<?php require_once("a.php"); require_once("b.php");
現在運行index.php檔案
你會發現有一個致命錯誤: Fatal error: Cannot redeclare class Test in。 。 。很顯然,無法重新聲明Test類,因為你引入了兩次,而且兩個文件中的類名稱相同,衝突了。這個時候就需要命名空間來解決這個問題,而且很容易。
2. 例二
我們現在把兩個類別檔案稍作修改。
a.php
<?php namespace demo1\a\Test;class Test { public function ceshi(){ echo __FILE__; } }
b.php
<?php namespace demo1\b\Test;class Test { public function ceshi(){ echo __FILE__; } }
namespace關鍵字是用來宣告命名空間的。現在運行index.php發現沒有錯誤,修改index.php進行方法呼叫測試
#index.php
<?php require_once("a.php"); require_once("b.php"); $a1 = new demo1\a\Test\Test(); $a1->ceshi();
#現在運行index.php文件
D:\phpStudy\WWW\demo\demo1\a.php
3. 例三
#現在還有另一種情況,例如我需要實例化a.php中的Test類別多次,那麼每次我們都需要命名空間資訊完整寫的話比較麻煩怎麼辦呢?例如:
<?php require_once("a.php"); require_once("b.php"); $a1 = new demo1\a\Test\Test(); $a2 = new demo1\a\Test\Test(); $a1->ceshi();echo '
'; $a2->ceshi();
雖然也沒有錯誤,但是你會發現比較麻煩,每次都需要全寫命名空間名稱,雖然不報錯並且可以ctrl c,ctrl v,但是不太美觀(^_^ )。
你可以這樣做
index.php
<?php require_once("a.php"); require_once("b.php"); use demo1\a\Test\Test; $a1 = new Test(); $a2 = new Test(); $a1->ceshi(); echo '
'; $a2->ceshi();
use關鍵字是用來引入類,用命名空間的方式表示使用了某個類別。後面就可以直接實例化運算
4. 例五
接下來另一個問題又來了,如下:
#index.php
<?php require_once("a.php"); require_once("b.php"); use demo1\a\Test\Test; use demo1\b\Test\Test; $a = new Test(); $b = new Test(); $a->ceshi(); echo '
'; $b->ceshi();
現在運行index.php檔案
Fatal error: Cannot use demo1\b\Test\Test as Test because the name is already in use in D:\phpStudy\WWW\demo\demo1\index.php on line 5
#因為雖然使用了命名空間,但是兩個類別名稱相同,都是Test,程式不知道第二個Test類別是b.php中的Test類,這時候你就用到了as關鍵字
index .php
<?php require_once("a.php"); require_once("b.php"); use demo1\a\Test\Test; use demo1\b\Test\Test as bTest; $a = new Test();$b = new bTest(); $a->ceshi();echo '
'; $b->ceshi();
as關鍵字是對類別名稱定義別名,可以有效防止類別名稱相同衝突
5. 例六
例如我們在a.php同級再建立一個全域類別檔案:c.php:
c.php
<?php class Test{ public function ceshi(){ echo __FILE__; } }
在index.php文件中这样做即可调用c.php中的test方法
<?php require_once("a.php"); require_once("b.php"); require_once("c.php"); use demo1\a\Test\Test; use demo1\b\Test\Test as bTest; $a = new Test();$a->ceshi(); echo '
'; $b = new bTest(); $b->ceshi(); echo '
'; $c = new \Test(); $c->ceshi(); echo '
';
我们将这种类叫做全局类,如果要使用需要类前面加入反斜杠”\”
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上是PHP的命名空間的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!