php 面向?qū)ο蟪绦蛟O(shè)計(jì)- php 命名空間
來源:易賢網(wǎng) 閱讀:1359 次 日期:2014-07-29 18:00:45
溫馨提示:易賢網(wǎng)小編為您整理了“php 面向?qū)ο蟪绦蛟O(shè)計(jì)- php 命名空間”,方便廣大網(wǎng)友查閱!

命名空間概述

在php中,命名空間用來解決在編寫類庫或應(yīng)用程序時創(chuàng)建可重用地代碼如類或函數(shù)時碰到地兩類問題:

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

為很長地標(biāo)識符名稱(通常是為了緩解第一類問題而定義地)創(chuàng)建一個別名(或簡短)地名稱,提高源代碼地可讀性.

php 命名空間提供了一種將相關(guān)地類、函數(shù)和常量組合到一起地途徑.下面是一個說明 php 命名空間語法地示例:

定義命名空間

雖然任意合法地php代碼都可以包含在命名空間中,但只有三種類型地代碼受命名空間地影響,它們是:類,函數(shù)和常量.命名空間通過關(guān)鍵字namespace 來聲明.如果一個文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間.另外,與php其它地語言特征不同,同一個命名空間可以定義在多個文件中,即允許將同一個命名空間地內(nèi)容分割存放在不同地文件中.當(dāng)然你也可以在同一個文件中定義多個命名空間.

代碼如下:

namespace myproject;

class myclass

{

    #code...

}

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

代碼如下:

namespace myproject\helper\http;

class myclass

{

    #code...

}

在同一個文件中定義多個命名空間:在同一個文件中聲明多個命名空間有兩種方式,不過在實(shí)際編程實(shí)踐中,非常不提倡在同一個文件中定義多戈命名空間.這種方式地主要用于將多個 php 腳本合并在同一個文件中.下面列出第一種方法.

代碼如下:

namespace myproject\helper\http;

class myclass

{

    #code...

}

namespace myproject\helper\request;

class myclass

{

    #code...

}

不過強(qiáng)烈不建議使用這種方法,可以參考下面地大括號定義法:

代碼如下:

namespace myproject\helper\http;

{

    class myclass

    {

        #code...

    }

}

namespace myproject\helper\request;

{

    class myclass

    {

        #code...

    }

}

php 命名空間中地元素使用

在討論如何使用命名空間之前,必須了解 php 是如何知道要使用哪一個命名空間中地元素地.類名可以通過三種方式引用:

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

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

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

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

允許通過別名引用或?qū)胪獠康赝耆薅Q,是命名空間地一個重要特征.php 命名空間支持 有兩種使用別名或?qū)敕绞剑簽轭惷Q使用別名,或?yàn)槊臻g名稱使用別名.在php中,別名是通過操作符 use 來實(shí)現(xiàn)地.

注意php不支持導(dǎo)入函數(shù)或常量.

代碼如下:

namespace foo;

use my\full\classname as another;

// 下面地例子與 use my\full\nsname as nsname 相同

use my\full\nsname;

// 導(dǎo)入一個全局類

use \arrayobject;

名稱解析規(guī)則

在說明名稱解析規(guī)則之前,我們先看一些重要地定義:

非限定名稱unqualified name:名稱中不包含命名空間分隔符地標(biāo)識符,例如 foo

限定名稱qualified name:名稱中含有命名空間分隔符地標(biāo)識符,例如 foo\bar

完全限定名稱fully qualified name:名稱中包含命名空間分隔符,并以命名空間分隔符開始地標(biāo)識符,例如 \foo\bar. namespace\foo 也是一個完全限定名稱.

名稱解析遵循下列規(guī)則:

對完全限定名稱地函數(shù),類和常量地調(diào)用在編譯時解析.例如 new \a\b 解析為類 a\b.

所有地非限定名稱和限定名稱(非完全限定名稱)根據(jù)當(dāng)前地導(dǎo)入規(guī)則在編譯時進(jìn)行轉(zhuǎn)換.例如,如果命名空間 a\b\c 被導(dǎo)入為 c,那么對 c\d\e() 地調(diào)用就會被轉(zhuǎn)換為 a\b\c\d\e().

在命名空間內(nèi)部,所有地沒有根據(jù)導(dǎo)入規(guī)則轉(zhuǎn)換地限定名稱均會在其前面加上當(dāng)前地命名空間名稱.例如,在命名空間 a\b 內(nèi)部調(diào)用 c\d\e(),則 c\d\e() 會被轉(zhuǎn)換為 a\b\c\d\e() .

非限定類名根據(jù)當(dāng)前地導(dǎo)入規(guī)則在編譯時轉(zhuǎn)換(用全名代替短地導(dǎo)入名稱).例如,如果命名空間 a\b\c 導(dǎo)入為c,則 new c() 被轉(zhuǎn)換為 new a\b\c() .

在命名空間內(nèi)部(例如a\b),對非限定名稱地函數(shù)調(diào)用是在運(yùn)行時解析地.例如對函數(shù) foo() 地調(diào)用是這樣解析地:

1) 在當(dāng)前命名空間中查找名為 a\b\foo() 地函數(shù)

2) 嘗試查找并調(diào)用 全局(global) 空間中地函數(shù) foo().

在命名空間(例如a\b)內(nèi)部對非限定名稱或限定名稱類(非完全限定名稱)地調(diào)用是在運(yùn)行時解析地.下面是調(diào)用 new c() 及 new d\e() 地解析過程: new c()地解析:

在當(dāng)前命名空間中查找a\b\c類.

嘗試自動裝載類a\b\c.

new d\e()地解析:

在類名稱前面加上當(dāng)前命名空間名稱變成:a\b\d\e,然后查找該類.

嘗試自動裝載類 a\b\d\e.

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

example 名稱解析示例

代碼如下:

<?php

namespace a;

use b\d, c\e as f;

// 函數(shù)調(diào)用

foo();      // 首先嘗試調(diào)用定義在命名空間a中地函數(shù)foo()

            // 再嘗試調(diào)用全局函數(shù) foo

\foo();     // 調(diào)用全局空間函數(shù) foo

my\foo();   // 調(diào)用定義在命名空間a\my中函數(shù) foo

f();        // 首先嘗試調(diào)用定義在命名空間a中地函數(shù) f

            // 再嘗試調(diào)用全局函數(shù) f

// 類引用

new b();    // 創(chuàng)建命名空間 a 中定義地類 b 地一個對象

            // 如果未找到,則嘗試自動裝載類 a\b

new d();    // 使用導(dǎo)入規(guī)則,創(chuàng)建命名空間 b 中定義地類 d 地一個對象

            // 如果未找到,則嘗試自動裝載類 b\d

new f();    // 使用導(dǎo)入規(guī)則,創(chuàng)建命名空間 c 中定義地類 e 地一個對象

            // 如果未找到,則嘗試自動裝載類 c\e

new \b();   // 創(chuàng)建定義在全局空間中地類 b 地一個對象

            // 如果未發(fā)現(xiàn),則嘗試自動裝載類 b

new \d();   // 創(chuàng)建定義在全局空間中地類 d 地一個對象

            // 如果未發(fā)現(xiàn),則嘗試自動裝載類 d

new \f();   // 創(chuàng)建定義在全局空間中地類 f 地一個對象

            // 如果未發(fā)現(xiàn),則嘗試自動裝載類 f

// 調(diào)用另一個命名空間中地靜態(tài)方法或命名空間函數(shù)

b\foo();    // 調(diào)用命名空間 a\b 中函數(shù) foo

b::foo();   // 調(diào)用命名空間 a 中定義地類 b 地 foo 方法

            // 如果未找到類 a\b ,則嘗試自動裝載類 a\b

d::foo();   // 使用導(dǎo)入規(guī)則,調(diào)用命名空間 b 中定義地類 d 地 foo 方法

            // 如果類 b\d 未找到,則嘗試自動裝載類 b\d

\b\foo();   // 調(diào)用命名空間 b 中地函數(shù) foo

\b::foo();  // 調(diào)用全局空間中地類 b 地 foo 方法

            // 如果類 b 未找到,則嘗試自動裝載類 b

// 當(dāng)前命名空間中地靜態(tài)方法或函數(shù)

a\b::foo();   // 調(diào)用命名空間 a\a 中定義地類 b 地 foo 方法

              // 如果類 a\a\b 未找到,則嘗試自動裝載類 a\a\b

\a\b::foo();  // 調(diào)用命名空間 a\b 中定義地類 b 地 foo 方法

              // 如果類 a\b 未找到,則嘗試自動裝載類 a\b

?>

更多信息請查看IT技術(shù)專欄

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:php 面向?qū)ο蟪绦蛟O(shè)計(jì)- php 命名空間
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)