溫馨提示×

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

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

PHP編程語(yǔ)言的命名空間是什么

發(fā)布時(shí)間:2021-08-30 17:53:37 來(lái)源:億速云 閱讀:146 作者:chen 欄目:安全技術(shù)

這篇文章主要介紹“PHP編程語(yǔ)言的命名空間是什么”,在日常操作中,相信很多人在PHP編程語(yǔ)言的命名空間是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”PHP編程語(yǔ)言的命名空間是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

PHP 命名空間(namespace)是在PHP 5.3中加入的,如果你學(xué)過(guò)C#和Java,那命名空間就不算什么新事物。 不過(guò)在PHP當(dāng)中還是有著相當(dāng)重要的意義。

PHP 命名空間可以解決以下兩類問(wèn)題:

1. 用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突。

2. 為很長(zhǎng)的標(biāo)識(shí)符名稱(通常是為了緩解第一類問(wèn)題而定義的)創(chuàng)建一個(gè)別名(或簡(jiǎn)短)的名稱,提高源代碼的可讀性。

。。。。。。。。。。。。。。。

定義命名空間

默認(rèn)情況下,所有常量、類和函數(shù)名都放在全局空間下,就和PHP支持命名空間之前一樣。

命名空間通過(guò)關(guān)鍵字namespace 來(lái)聲明。如果一個(gè)文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間。語(yǔ)法格式如下;

<?php  

// 定義代碼在 'MyProject' 命名空間中  

namespace MyProject;  

 // ... 代碼 ...  

?>

你也可以在同一個(gè)文件中定義不同的命名空間代碼,如下所示:

<?php

namespace MyProject {

    const CONNECT_OK = 1;

    class Connection { /* ... */ }

    function connect() { /* ... */  }

}

namespace AnotherProject {

    const CONNECT_OK = 1;

    class Connection { /* ... */ }

    function connect() { /* ... */  }

}

?>

將全局的非命名空間中的代碼與命名空間中的代碼組合在一起,只能使用大括號(hào)形式的語(yǔ)法。全局代碼必須用一個(gè)不帶名稱的 namespace 語(yǔ)句加上大括號(hào)括起來(lái),如下所示:

<?php

namespace MyProject {

const CONNECT_OK = 1;

class Connection { /* ... */ }

function connect() { /* ... */  }

}

namespace { // 全局代碼

session_start();

$a = MyProject\connect();

echo MyProject\Connection::start();

}

?>

在聲明命名空間之前唯一合法的代碼是用于定義源文件編碼方式的 declare 語(yǔ)句。所有非 PHP 代碼包括空白符都不能出現(xiàn)在命名空間的聲明之前。

<?php

declare(encoding='UTF-8'); //定義多個(gè)命名空間和不包含在命名空間中的代碼

namespace MyProject {

const CONNECT_OK = 1;

class Connection { /* ... */ }

function connect() { /* ... */  }

}

namespace { // 全局代碼

session_start();

$a = MyProject\connect();

echo MyProject\Connection::start();

}

?>

。。。。。。。。。。。。

子命名空間

與目錄和文件的關(guān)系很像,PHP 命名空間也允許指定層次化的命名空間的名稱。因此,命名空間的名字可以使用分層次的方式定義:

<?php

namespace MyProject\Sub\Level;  //聲明分層次的單個(gè)命名空間

const CONNECT_OK = 1;

class Connection { /* ... */ }

function Connect() { /* ... */  }

?>

上面的例子創(chuàng)建了常量 MyProject\Sub\Level\CONNECT_OK,類 MyProject\Sub\Level\Connection 和函數(shù) MyProject\Sub\Level\Connect。

。。。。。。。。。。。

命名空間使用

PHP 命名空間中的類名可以通過(guò)三種方式引用:

http://www.iis7.com/b/wzjk/

1. 非限定名稱,或不包含前綴的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當(dāng)前命名空間是 currentnamespace,foo 將被解析為 currentnamespace\foo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,則 foo 會(huì)被解析為foo。 警告:如果命名空間中的函數(shù)或常量未定義,則該非限定的函數(shù)名稱或常量名稱會(huì)被解析為全局函數(shù)名稱或常量名稱。

2. 限定名稱,或包含前綴的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果當(dāng)前的命名空間是 currentnamespace,則 foo 會(huì)被解析為 currentnamespace\subnamespace\foo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,foo 會(huì)被解析為subnamespace\foo。

3. 完全限定名稱,或包含了全局前綴操作符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespace\foo。

注意:訪問(wèn)任意全局類、函數(shù)或常量,都可以使用完全限定名稱

。。。。。。。。。。。。

命名空間和動(dòng)態(tài)語(yǔ)言特征

PHP 命名空間的實(shí)現(xiàn)受到其語(yǔ)言自身的動(dòng)態(tài)特征的影響。

必須使用完全限定名稱(包括命名空間前綴的類名稱)。注意因?yàn)樵趧?dòng)態(tài)的類名稱、函數(shù)名稱或常量名稱中,限定名稱和完全限定名稱沒有區(qū)別,因此其前導(dǎo)的反斜杠是不必要的。

。。。。。。。。。。。。

namespace關(guān)鍵字和__NAMESPACE__常量

PHP支持兩種抽象的訪問(wèn)當(dāng)前命名空間內(nèi)部元素的方法,__NAMESPACE__ 魔術(shù)常量和namespace關(guān)鍵字。

常量__NAMESPACE__的值是包含當(dāng)前命名空間名稱的字符串。在全局的,不包括在任何命名空間中的代碼,它包含一個(gè)空的字符串。

__NAMESPACE__ 示例, 在命名空間中的代碼

關(guān)鍵字 namespace 可用來(lái)顯式訪問(wèn)當(dāng)前命名空間或子命名空間中的元素。它等價(jià)于類中的 self 操作符。

namespace操作符,命名空間中的代碼

。。。。。。。。。。。。

使用命名空間:別名/導(dǎo)入

PHP 命名空間支持 有兩種使用別名或?qū)敕绞剑簽轭惷Q使用別名,或?yàn)槊臻g名稱使用別名。

在PHP中,別名是通過(guò)操作符 use 來(lái)實(shí)現(xiàn)的. 

。。。。。。。。。。。

使用命名空間:后備全局函數(shù)/常量

在一個(gè)命名空間中,當(dāng) PHP 遇到一個(gè)非限定的類、函數(shù)或常量名稱時(shí),它使用不同的優(yōu)先策略來(lái)解析該名稱。類名稱總是解析到當(dāng)前命名空間中的名稱。因此在訪問(wèn)系統(tǒng)內(nèi)部或不包含在命名空間中的類名稱時(shí),必須使用完全限定名稱

1、在命名空間中訪問(wèn)全局類對(duì)于函數(shù)和常量來(lái)說(shuō),如果當(dāng)前命名空間中不存在該函數(shù)或常量,PHP 會(huì)退而使用全局空間中的函數(shù)或常量。

2、 命名空間中后備的全局函數(shù)/常量

。。。。。。。。。。。

全局空間

如果沒有定義任何命名空間,所有的類與函數(shù)的定義都是在全局空間,與 PHP 引入命名空間概念前一樣。在名稱前加上前綴 \ 表示該名稱是全局空間中的名稱,即使該名稱位于其它的命名空間中時(shí)也是如此。

。。。。。。。。。。。

命名空間的順序

自從有了命名空間之后,最容易出錯(cuò)的該是使用類的時(shí)候,這個(gè)類的尋找路徑是什么樣的了。

為了引用全局命名空間中的全局類,必須使用完全限定名稱 new \C()。

到此,關(guān)于“PHP編程語(yǔ)言的命名空間是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

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

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

php
AI