PHP 命名空間(namespace)


PHP 命名空間(namespace)是在PHP 5.3中加入的,若是你學過C#和Java,那命名空間就不算什麼新事物。 不過在PHP當中仍是有着至關重要的意義。
PHP 命名空間能夠解決如下兩類問題:
1. 用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字衝突。
2. 爲很長的標識符名稱(一般是爲了緩解第一類問題而定義的)建立一個別名(或簡短)的名稱,提升源代碼的可讀性。
。。。。。。。。。。。。。。。
定義命名空間  http://www.iis7.com/a/lm/zhanqun/  IIS7站羣大全
默認狀況下,全部常量、類和函數名都放在全局空間下,就和PHP支持命名空間以前同樣。
命名空間經過關鍵字namespace 來聲明。若是一個文件中包含命名空間,它必須在其它全部代碼以前聲明命名空間。語法格式以下;
<?php  
// 定義代碼在 'MyProject' 命名空間中  
namespace MyProject;  
 // ... 代碼 ...  
?>
你也能夠在同一個文件中定義不一樣的命名空間代碼,以下所示:
<?php
namespace MyProject {
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}
namespace AnotherProject {
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}
?>
將全局的非命名空間中的代碼與命名空間中的代碼組合在一塊兒,只能使用大括號形式的語法。全局代碼必須用一個不帶名稱的 namespace 語句加上大括號括起來,以下所示:
<?php
namespace MyProject {php

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}
namespace { // 全局代碼
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
在聲明命名空間以前惟一合法的代碼是用於定義源文件編碼方式的 declare 語句。全部非 PHP 代碼包括空白符都不能出如今命名空間的聲明以前。
<?php
declare(encoding='UTF-8'); //定義多個命名空間和不包含在命名空間中的代碼
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}
namespace { // 全局代碼
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
。。。。。。。。。。。。
子命名空間
與目錄和文件的關係很像,PHP 命名空間也容許指定層次化的命名空間的名稱。所以,命名空間的名字可使用分層次的方式定義:
<?php
namespace MyProject\Sub\Level;  //聲明分層次的單個命名空間
const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */  }
?>
上面的例子建立了常量 MyProject\Sub\Level\CONNECT_OK,類 MyProject\Sub\Level\Connection 和函數 MyProject\Sub\Level\Connect。
。。。。。。。。。。。
命名空間使用
PHP 命名空間中的類名能夠經過三種方式引用:
1. 非限定名稱,或不包含前綴的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。若是當前命名空間是 currentnamespace,foo 將被解析爲 currentnamespace\foo。若是使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,則 foo 會被解析爲foo。 警告:若是命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析爲全局函數名稱或常量名稱。
2. 限定名稱,或包含前綴的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。若是當前的命名空間是 currentnamespace,則 foo 會被解析爲 currentnamespace\subnamespace\foo。若是使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,foo 會被解析爲subnamespace\foo。
3. 徹底限定名稱,或包含了全局前綴操做符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在這種狀況下,foo 老是被解析爲代碼中的文字名(literal name)currentnamespace\foo。
注意:訪問任意全局類、函數或常量,均可以使用徹底限定名稱
。。。。。。。。。。。。
命名空間和動態語言特徵
PHP 命名空間的實現受到其語言自身的動態特徵的影響。
必須使用徹底限定名稱(包括命名空間前綴的類名稱)。注意由於在動態的類名稱、函數名稱或常量名稱中,限定名稱和徹底限定名稱沒有區別,所以其前導的反斜槓是沒必要要的。
。。。。。。。。。。。。
namespace關鍵字和__NAMESPACE__常量
PHP支持兩種抽象的訪問當前命名空間內部元素的方法,__NAMESPACE__ 魔術常量和namespace關鍵字。
常量__NAMESPACE__的值是包含當前命名空間名稱的字符串。在全局的,不包括在任何命名空間中的代碼,它包含一個空的字符串。
__NAMESPACE__ 示例, 在命名空間中的代碼
關鍵字 namespace 可用來顯式訪問當前命名空間或子命名空間中的元素。它等價於類中的 self 操做符。
namespace操做符,命名空間中的代碼
。。。。。。。。。。。。
使用命名空間:別名/導入
PHP 命名空間支持 有兩種使用別名或導入方式:爲類名稱使用別名,或爲命名空間名稱使用別名。
在PHP中,別名是經過操做符 use 來實現的. 
。。。。。。。。。。。
使用命名空間:後備全局函數/常量
在一個命名空間中,當 PHP 遇到一個非限定的類、函數或常量名稱時,它使用不一樣的優先策略來解析該名稱。類名稱老是解析到當前命名空間中的名稱。所以在訪問系統內部或不包含在命名空間中的類名稱時,必須使用徹底限定名稱
一、在命名空間中訪問全局類對於函數和常量來講,若是當前命名空間中不存在該函數或常量,PHP 會退而使用全局空間中的函數或常量。
二、 命名空間中後備的全局函數/常量
。。。。。。。。。。。
全局空間
若是沒有定義任何命名空間,全部的類與函數的定義都是在全局空間,與 PHP 引入命名空間概念前同樣。在名稱前加上前綴 \ 表示該名稱是全局空間中的名稱,即便該名稱位於其它的命名空間中時也是如此。
。。。。。。。。。。。
命名空間的順序
自從有了命名空間以後,最容易出錯的該是使用類的時候,這個類的尋找路徑是什麼樣的了。
爲了引用全局命名空間中的全局類,必須使用徹底限定名稱 new \C()。session

相關文章
相關標籤/搜索