1. 程式人生 > 程式設計 >詳解PHP中的名稱空間

詳解PHP中的名稱空間

名稱空間其實早在php5.3就已經出現了。不過大部分同kieRR學可能在各種框架的使用中才會接觸到名稱空間的內容,當然,現代化的開發也都離不開這些能夠快速產出的框架。這次我們不從框架的角度,僅從簡單的程式碼角度來解析一下名稱空間的概念和使用。

首先,我們要定義名稱空間是個什麼東西。

其實就像作業系統的目錄一樣,名稱空間就是為了解決類似於作業系統中同一個資料夾不能有相同的檔名一樣的問題。假設我們只有一個檔案,一個目錄,那麼在這個目錄中,是不能有兩個完全相同的檔案的。如果有這樣名稱完全相同的檔案,那麼作業系統也不知道我們到底應該開啟的是哪一個檔案。同理,在一個PHP檔案中,我們也不能起相同名稱的函式或者類名,PHP也不知道我們到底要呼叫的是哪一個函式或者類。

理解了上述內容之後,再來看名稱空間的語法,其實非常像我們的目錄的定義。

namespace A\B\C;

這個名稱空間的定義就是指出了當前名稱空間是A\B\C。就像是C:\A\B\C這樣一個資料夾一樣。光說不練假把式,直接上程式碼來看看:

// file1.php
namespace FILE1;

const CONST_A = 2;
function testA(){
    echo 'FILE1\testA()',PHP_EOL;
}

class objectA{
    function test(){
        e程式設計客棧cho 'FILE1\ObjectA',Phttp://www.cppcns.com
HP_EOL; } }
// file2.php
namespace FILE2;

const CONST_A = 3;
function testA(){
    echo 'FILE2\testA()',PHP_EOL;
}

class objectA{
    function test(){
        echo 'FILE2\ObjectA',PHP_EOL;
    }
}

我們在namespace目錄下建立了這兩個php檔案,函式和類名都是一樣的,但定義了不同的名稱空間,一個是FILE1,一個是FILE2。

namespace A;

include 'namespace/file1.php';
include 'namespace/file2.php';

use FILE1,FI
程式設計
客棧
LE2; use FILE1\objectA as objectB; const CONST_A = 1; function testA(){ echo 'A\testA()',PHP_EOL; } class objectA{ function test(){ echo 'A\ObjectA',PHP_EOL; } } // 當前名稱空間 echo CONST_A,PHP_EOL; // 1 testA(); // A\testA() $oA = new objectA(); $oA->test(); // A\ObjectA // FILE1 echo FILE1\CONST_A,PHP_EOL; // 2 FILE1\testA(); // FILE1\testA() $oA = new FILE1\objectA(); $oA->test(); // FILE1\ObjectA $oB = new objectB(); $oB->test(); // FILE1\ObjectA // FILE2 echo FILE2\CONST_A,PHP_EOL; // 3 FILE2\testA(); // FILE2\testA() $oA = new FILE2\objectA(); $oA-&gkieRRt;test(); // FILE2\ObjectA

在測試程式碼中,我們又定義了當前的名稱空間為A。並include了file1.php和file2.php。並在這個檔案中同時也定義了與file1.php和file2.php中相同的函式和類名。接下來我們依次呼叫這些靜態變數、函式和類。

  • 在預設情況下,靜態變數、函式、類呼叫的是當前名稱空間下的內容
  • 在使用了FILE1\和FILE2\之後,呼叫的是就是指定名稱空間下的內容
  • 需要使用use引入名稱空間,否則無法使用名稱空間裡的內容
  • use中可以使用as關鍵字為名稱空間或者其中的類指定別名

名稱空間的使用其實就是這麼的簡單。可以看出我們在不同的名稱空間中就可以使用相同的函式或者類名了。這一點正是各類現代化開發框架的基礎。同時也是composer能夠實現的最主要的原因之一。

接下來,我們嘗試一個問題是否符合我們的預期,那就是兩個檔案定義相同的名稱空間是否能夠定義相同的類名呢?

// file1-1.php
namespace FILE1;

const CONST_A = 1.1;
function testA(){
    echo 'FILE1-1\testA()',PHP_EOL;
}

class objectA{
    function test(){
        echo 'FILE1-1\ObjectA',PHP_EOL;
    }
}

我們定義了一個file1-1.php,並且使用了和file1.php相同的FILE1名稱空間。然後和file1.php一起include到測試程式碼中。

include 'namespace/file1.php';
include 'namespace/file1-1.php'; // Cannot redeclare FILE1\testA()

好吧,在執行時直接就報錯,不能重複定義同名的函式名。如果註釋掉函式,那麼會繼續報類名不能重複。我們再定義一個file1-2.php,這次還是使用FILE1這個名稱空間,但是內容不一樣了。

// file1-2.php
namespace FILE1;

const CONST_A = 1.2;
function testA1_2(){
    echo 'FILE1-2\testA()',PHP_EOL;
}

class objectA1_2{
    function test(){
        echo 'FILE1-2\ObjectA',PHP_EOL;
    }
}

這樣當然就沒問題啦。這兩個檔案在同一個名稱空間下,但是卻有著不同的能力,這樣是完全OK的操作。

include 'namespace/file1.php';
include 'namespace/file1-2.php';
use FILE1;

// FILE1
echo FILE1\CONST_A,PHP_EOL; // 2
FILE1\testA(); // FILE1\testA()
$oA = new FILE1\objectA();
$oA->test(); // FILE1\ObjectA

// FILE1_2
echo FILE1\CONST_A,PHP_EOL; // 3
FILE1\testA1_2(); // FILE1-2\testA()
$oA = new FILE1\objectA1_2();
$oA->test(); // FILE1-2\ObjectA

測試程式碼: github.com/zhangyue050…

以上就是詳解PHP中的名稱空間的詳細內容,更多關於PHP 名稱空間的資料請關注我們其它相關文章!