PHP中命名空間是怎樣的存在(一)?

2022-06-05 06:18:08 字數 3096 閱讀 8813

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

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

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

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

namespace a\b\c;
這個命名空間的定義就是指出了當前命名空間是a\b\c。就像是c:\a\b\c這樣乙個資料夾一樣。光說不練假把式,直接上**來看看:

// file1.php

namespace file1;

const const_a = 2;

function testa()

class objecta

}

// file2.php

namespace file2;

const const_a = 3;

function testa()

class objecta

}

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

namespace a;

include 'namespace/file1.php';

include 'namespace/file2.php';

use file1, file2;

use file1\objecta as objectb;

const const_a = 1;

function testa()

class objecta

}// 當前命名空間

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->test(); // file2\objecta

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

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

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

// file1-1.php

namespace file1;

const const_a = 1.1;

function testa()

class objecta

}

我們定義了乙個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()

class objecta1_2

}

這樣當然就沒問題啦。這兩個檔案在同乙個命名空間下,但是卻有著不同的能力,這樣是完全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

測試**:

參考文件:

b站id:482780532

什麼是php命名空間

php命名空間是在5.3版本後加入的,命名空間反過來就是空間命名,在這裡的空間命名就像window下的資料夾命名,命名空間用關鍵字namespace來定義。在這裡用資料夾舉三個例子,比如相對於test資料夾下面的home.txt檔案,他相對於資料夾的路徑是 test home.txt,當前檔案下他的...

PHP 命名空間 一

無命名空間 class lister namespace my require once product.php class lister lister test 訪問本地 from my lister test 訪問全域性空間 from global前導的反斜槓告訴php從根命名空間而不是從當前命...

PHP中命名空間的引用

1 在介紹引用之前要知道命名空間中幾個術語的概念。1 完全限定名稱 任何php 都可以引用完全限定名稱,它是乙個命名空間反斜線開頭的識別符號,如 c root sub1,c root sub1 returnfunctionname 等。2 限定名稱 至少有乙個命名空間分隔符的識別符號,如sub1 r...