溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP中命名空間是怎樣的存在

發(fā)布時間:2021-07-13 14:36:00 來源:億速云 閱讀:154 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“PHP中命名空間是怎樣的存在”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“PHP中命名空間是怎樣的存在”吧!

 

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

命名空間其實早在PHP5.3就已經(jīng)出現(xiàn)了。不過大部分同學(xué)可能在各種框架的使用中才會接觸到命名空間的內(nèi)容,當(dāng)然,現(xiàn)代化的開發(fā)也都離不開這些能夠快速產(chǎn)出的框架。這次我們不從框架的角度,僅從簡單的代碼角度來解析一下命名空間的概念和使用。

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

其實就像操作系統(tǒng)的目錄一樣,命名空間就是為了解決類似于操作系統(tǒng)中同一個文件夾不能有相同的文件名一樣的問題。假設(shè)我們只有一個文件,一個目錄,那么在這個目錄中,是不能有兩個完全相同的文件的。如果有這樣名稱完全相同的文件,那么操作系統(tǒng)也不知道我們到底應(yīng)該打開的是哪一個文件。同理,在一個PHP文件中,我們也不能起相同名稱的函數(shù)或者類名,PHP也不知道我們到底要調(diào)用的是哪一個函數(shù)或者類。

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


namespace A\B\C;

 

這個命名空間的定義就是指出了當(dāng)前命名空間是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(){
       echo 'FILE1\ObjectA', PHP_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目錄下創(chuàng)建了這兩個php文件,函數(shù)和類名都是一樣的,但定義了不同的命名空間,一個是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(){
   echo 'A\testA()', PHP_EOL;
}

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

// 當(dāng)前命名空間
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

 

在測試代碼中,我們又定義了當(dāng)前的命名空間為A。并include了file1.php和file2.php。并在這個文件中同時也定義了與file1.php和file2.php中相同的函數(shù)和類名。接下來我們依次調(diào)用這些靜態(tài)變量、函數(shù)和類。

  • 在默認(rèn)情況下,靜態(tài)變量、函數(shù)、類調(diào)用的是當(dāng)前命名空間下的內(nèi)容
  • 在使用了FILE1\和FILE2\之后,調(diào)用的是就是指定命名空間下的內(nèi)容
  • 需要使用use引入命名空間,否則無法使用命名空間里的內(nèi)容
  • use中可以使用as關(guān)鍵字為命名空間或者其中的類指定別名

命名空間的使用其實就是這么的簡單。可以看出我們在不同的命名空間中就可以使用相同的函數(shù)或者類名了。這一點正是各類現(xiàn)代化開發(fā)框架的基礎(chǔ)。同時也是composer能夠?qū)崿F(xiàn)的最主要的原因之一。

接下來,我們嘗試一個問題是否符合我們的預(yù)期,那就是兩個文件定義相同的命名空間是否能夠定義相同的類名呢?

// 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()
 

好吧,在運(yùn)行時直接就報錯,不能重復(fù)定義同名的函數(shù)名。如果注釋掉函數(shù),那么會繼續(xù)報類名不能重復(fù)。我們再定義一個file1-2.php,這次還是使用FILE1這個命名空間,但是內(nèi)容不一樣了。

// 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;
   }
}
 

這樣當(dāng)然就沒問題啦。這兩個文件在同一個命名空間下,但是卻有著不同的能力,這樣是完全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

 

測試代碼:https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/PHP%E4%B8%AD%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84%E5%AD%98%E5%9C%A8%EF%BC%9F%EF%BC%88%E4%B8%80%EF%BC%89.php

參考文檔:https://www.php.net/manual/zh/language.namespaces.rationale.phphttps://www.php.net/manual/zh/language.namespaces.definition.php

到此,相信大家對“PHP中命名空間是怎樣的存在”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI