天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP 面向?qū)ο蟪绦蛟O(shè)計(jì)(oop)學(xué)習(xí)筆記 (五) - PHP 命名空間

命名空間概述

php中,命名空間用來(lái)解決在編寫(xiě)類(lèi)庫(kù)或應(yīng)用程序時(shí)創(chuàng)建可重用的代碼如類(lèi)或函數(shù)時(shí)碰到的兩類(lèi)問(wèn)題:

用戶(hù)編寫(xiě)的代碼與php內(nèi)部的類(lèi)/函數(shù)/常量或第三方類(lèi)/函數(shù)/常量之間的名字沖突。
為很長(zhǎng)的標(biāo)識(shí)符名稱(chēng)(通常是為了緩解第一類(lèi)問(wèn)題而定義的)創(chuàng)建一個(gè)別名(或簡(jiǎn)短)的名稱(chēng),提高源代碼的可讀性。
php 命名空間提供了一種將相關(guān)的類(lèi)、函數(shù)和常量組合到一起的途徑。下面是一個(gè)說(shuō)明 php 命名空間語(yǔ)法的示例:

定義命名空間

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

復(fù)制代碼 代碼如下:
namespace MyProject;
class MyClass
{
    #code...
}

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

復(fù)制代碼 代碼如下:
namespace MyProject/helper/http;
class MyClass
{
    #code...
}

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

復(fù)制代碼 代碼如下:
namespace MyProject/helper/http;
class MyClass
{
    #code...
}
namespace MyProject/helper/request;
class MyClass
{
    #code...
}

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

復(fù)制代碼 代碼如下:
namespace MyProject/helper/http;
{
    class MyClass
    {
        #code...
    }
}
namespace MyProject/helper/request;
{
    class MyClass
    {
        #code...
    }
}

php 命名空間中的元素使用

在討論如何使用命名空間之前,必須了解 php 是如何知道要使用哪一個(gè)命名空間中的元素的。類(lèi)名可以通過(guò)三種方式引用:

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

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

完全限定名稱(chēng),或包含了全局前綴操作符的名稱(chēng),例如, $a = new /currentnamespace/foo(); 或 /currentnamespace/foo::staticmethod();。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespace/foo。
使用命名空間:別名/導(dǎo)入

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

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

復(fù)制代碼 代碼如下:
namespace foo;
use My/Full/Classname as Another;

// 下面的例子與 use My/Full/NSname as NSname 相同
use My/Full/NSname;

// 導(dǎo)入一個(gè)全局類(lèi)
use /ArrayObject;

名稱(chēng)解析規(guī)則

在說(shuō)明名稱(chēng)解析規(guī)則之前,我們先看一些重要的定義:

非限定名稱(chēng)Unqualified name:名稱(chēng)中不包含命名空間分隔符的標(biāo)識(shí)符,例如 Foo
限定名稱(chēng)Qualified name:名稱(chēng)中含有命名空間分隔符的標(biāo)識(shí)符,例如 Foo/Bar
完全限定名稱(chēng)Fully qualified name:名稱(chēng)中包含命名空間分隔符,并以命名空間分隔符開(kāi)始的標(biāo)識(shí)符,例如 /Foo/Bar。 namespace/Foo 也是一個(gè)完全限定名稱(chēng)。
名稱(chēng)解析遵循下列規(guī)則:

對(duì)完全限定名稱(chēng)的函數(shù),類(lèi)和常量的調(diào)用在編譯時(shí)解析。例如 new /A/B 解析為類(lèi) A/B。
所有的非限定名稱(chēng)和限定名稱(chēng)(非完全限定名稱(chēng))根據(jù)當(dāng)前的導(dǎo)入規(guī)則在編譯時(shí)進(jìn)行轉(zhuǎn)換。例如,如果命名空間 A/B/C 被導(dǎo)入為 C,那么對(duì) C/D/e() 的調(diào)用就會(huì)被轉(zhuǎn)換為 A/B/C/D/e()。
在命名空間內(nèi)部,所有的沒(méi)有根據(jù)導(dǎo)入規(guī)則轉(zhuǎn)換的限定名稱(chēng)均會(huì)在其前面加上當(dāng)前的命名空間名稱(chēng)。例如,在命名空間 A/B 內(nèi)部調(diào)用 C/D/e(),則 C/D/e() 會(huì)被轉(zhuǎn)換為 A/B/C/D/e() 。
非限定類(lèi)名根據(jù)當(dāng)前的導(dǎo)入規(guī)則在編譯時(shí)轉(zhuǎn)換(用全名代替短的導(dǎo)入名稱(chēng))。例如,如果命名空間 A/B/C 導(dǎo)入為C,則 new C() 被轉(zhuǎn)換為 new A/B/C() 。
在命名空間內(nèi)部(例如A/B),對(duì)非限定名稱(chēng)的函數(shù)調(diào)用是在運(yùn)行時(shí)解析的。例如對(duì)函數(shù) foo() 的調(diào)用是這樣解析的:
1) 在當(dāng)前命名空間中查找名為 A/B/foo() 的函數(shù)
2) 嘗試查找并調(diào)用 全局(global) 空間中的函數(shù) foo()。
在命名空間(例如A/B)內(nèi)部對(duì)非限定名稱(chēng)或限定名稱(chēng)類(lèi)(非完全限定名稱(chēng))的調(diào)用是在運(yùn)行時(shí)解析的。下面是調(diào)用 new C() 及 new D/E() 的解析過(guò)程: new C()的解析:
在當(dāng)前命名空間中查找A/B/C類(lèi)。
嘗試自動(dòng)裝載類(lèi)A/B/C。

new D/E()的解析:
在類(lèi)名稱(chēng)前面加上當(dāng)前命名空間名稱(chēng)變成:A/B/D/E,然后查找該類(lèi)。
嘗試自動(dòng)裝載類(lèi) A/B/D/E。

為了引用全局命名空間中的全局類(lèi),必須使用完全限定名稱(chēng) new /C()。

Example 名稱(chēng)解析示例

復(fù)制代碼 代碼如下:
<?php
namespace A;
use B/D, C/E as F;
// 函數(shù)調(diào)用
foo();      // 首先嘗試調(diào)用定義在命名空間"A"中的函數(shù)foo()
            // 再?lài)L試調(diào)用全局函數(shù) "foo"
/foo();     // 調(diào)用全局空間函數(shù) "foo"
my/foo();   // 調(diào)用定義在命名空間"A/my"中函數(shù) "foo"
F();        // 首先嘗試調(diào)用定義在命名空間"A"中的函數(shù) "F"
            // 再?lài)L試調(diào)用全局函數(shù) "F"
// 類(lèi)引用
new B();    // 創(chuàng)建命名空間 "A" 中定義的類(lèi) "B" 的一個(gè)對(duì)象
            // 如果未找到,則嘗試自動(dòng)裝載類(lèi) "A/B"
new D();    // 使用導(dǎo)入規(guī)則,創(chuàng)建命名空間 "B" 中定義的類(lèi) "D" 的一個(gè)對(duì)象
            // 如果未找到,則嘗試自動(dòng)裝載類(lèi) "B/D"
new F();    // 使用導(dǎo)入規(guī)則,創(chuàng)建命名空間 "C" 中定義的類(lèi) "E" 的一個(gè)對(duì)象
            // 如果未找到,則嘗試自動(dòng)裝載類(lèi) "C/E"
new /B();   // 創(chuàng)建定義在全局空間中的類(lèi) "B" 的一個(gè)對(duì)象
            // 如果未發(fā)現(xiàn),則嘗試自動(dòng)裝載類(lèi) "B"
new /D();   // 創(chuàng)建定義在全局空間中的類(lèi) "D" 的一個(gè)對(duì)象
            // 如果未發(fā)現(xiàn),則嘗試自動(dòng)裝載類(lèi) "D"
new /F();   // 創(chuàng)建定義在全局空間中的類(lèi) "F" 的一個(gè)對(duì)象
            // 如果未發(fā)現(xiàn),則嘗試自動(dòng)裝載類(lèi) "F"
// 調(diào)用另一個(gè)命名空間中的靜態(tài)方法或命名空間函數(shù)
B/foo();    // 調(diào)用命名空間 "A/B" 中函數(shù) "foo"
B::foo();   // 調(diào)用命名空間 "A" 中定義的類(lèi) "B" 的 "foo" 方法
            // 如果未找到類(lèi) "A/B" ,則嘗試自動(dòng)裝載類(lèi) "A/B"
D::foo();   // 使用導(dǎo)入規(guī)則,調(diào)用命名空間 "B" 中定義的類(lèi) "D" 的 "foo" 方法
            // 如果類(lèi) "B/D" 未找到,則嘗試自動(dòng)裝載類(lèi) "B/D"
/B/foo();   // 調(diào)用命名空間 "B" 中的函數(shù) "foo"
/B::foo();  // 調(diào)用全局空間中的類(lèi) "B" 的 "foo" 方法
            // 如果類(lèi) "B" 未找到,則嘗試自動(dòng)裝載類(lèi) "B"
// 當(dāng)前命名空間中的靜態(tài)方法或函數(shù)
A/B::foo();   // 調(diào)用命名空間 "A/A" 中定義的類(lèi) "B" 的 "foo" 方法
              // 如果類(lèi) "A/A/B" 未找到,則嘗試自動(dòng)裝載類(lèi) "A/A/B"
/A/B::foo();  // 調(diào)用命名空間 "A/B" 中定義的類(lèi) "B" 的 "foo" 方法
              // 如果類(lèi) "A/B" 未找到,則嘗試自動(dòng)裝載類(lèi) "A/B"
?>

php技術(shù)PHP 面向?qū)ο蟪绦蛟O(shè)計(jì)(oop)學(xué)習(xí)筆記 (五) - PHP 命名空間,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲AV国产福利精品在现观看 | 久久久精品久久久久特色影视 | 晓雪老师我要进你里面好爽 | 伊人久久综合成人亚洲 | 青柠高清在线观看完整版 | 国产成人小视频在线观看 | 259luxu高跟黑色丝袜系列 | 日本高清在线一区二区三区 | 甜性涩爱快播 | 国精产品一区二区三区有限公司 | 99精品电影一区二区免费看 | 久久精品视在线观看85 | 国产精品青青在线麻豆 | 最新无码国产在线视频2020 | 国产午夜精品AV一区二区麻豆 | 日本阿v在线资源无码免费 日本阿v片在线播放免费 | 国精产品砖一区二区三区糖心 | 亚洲免费观看视频 | 国产精品久久人妻无码网站一区无 | 亚洲国产在线视频精品 | 国内精品伊人久久久久 | 中文字幕 亚洲 有码 在线 | 人妻激情综合久久久久蜜桃 | 青青草AV国产精品 | 欧美最猛黑人XXXXWWW | 嫩草影院精品视频在线观看 | 99精品小视频 | 青柠视频在线观看高清HD | 兽皇VIDEO另类HD | 国产精品嫩草影视在线观看 | 欧美亚洲国产免费高清视频 | 成人五级毛片免费播放 | 欧美乱码卡一卡二卡四卡免费 | 午夜伦理yy44008影院 | 成人在线精品视频 | 黑人干日本美女 | 色屁屁影院 | 国产第一页浮力影院 | adc影院欢迎您大驾光临入口 | 久久夜色撩人精品国产 | 欧美特黄99久久毛片免费 |