php 命名空間執行個體詳解

來源:互聯網
上載者:User

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

PHP 命名空間可以解決以下兩類問題:

使用者編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字衝突。

為很長的標識符名稱(通常是為了緩解第一類問題而定義的)建立一個別名(或簡短)的名稱,提高原始碼的可讀性。

定義命名空間

預設情況下,所有常量、類和函數名都放在全域空間下,就和PHP支援命名空間之前一樣。

命名空間通過關鍵字namespace 來聲明。如果一個檔案中包含命名空間,它必須在其它所有代碼之前聲明命名空間。

引用命名空間標識符的三種方式

(1)Fully-qualified name

類似於作業系統上的絕對路徑,而且是完整的路徑,所以在理解的時候不會有誤解。

比如在 new \A\B\C ,那麼 C 就被會解析到 A\B 命名空間下的 C 類。

(2)Qualified name

類似於作業系統上的相對路徑,它包含部分名字並被引用到當前的命名空間。

比如 B\C() 在命名空間 A 下調用,則最終引用的命名空間就是 A\B\C()。

(3)Unqualified name

類似於Qualified name,但是沒包括子命名空間。

比如 C() 在命名空間 A\B 下調用,則最終引用的命名空間就是 A\B\C()。

通過一個例子來說明三種引用方式:

namespace \Example;require_once "fnction.php";class ClassA {}function Function() {}//完全限定名稱\Example\Function();\Example\B\Function(); //限定名稱B\Function(); //指向 \Example\B\Function();//非限定名稱$test = new ClassA(); //resolves to \Example\ClassAFunction(); //指向 \Example\Function

注意:

•Inside a namespace,假如在 current scope 沒有發現函數和常量的定義,PHP 不會報錯。而是去全域命名空間中尋找。

•Inside a namespace,假如在 current scope 沒有發現類的定義,則 PHP 會直接報錯,不會去全域域中找對應的類,所以假如你需要引用一個 internal 或使用者自訂的類,必須使用完全限定名稱。

先舉個簡單的例子,首先編寫一段代碼(定義在命名空間下),命名為 function.php :

namespace Foo\Bar\subnamespace;const FOO = 1;function foo() {  return "foo\r\n";}class foo {  static function staticmethod()  {    return METHOD . "\r\n" ;  }  function foofunction()  {    return METHOD . "\r\n" ;  }}

再編寫一段代碼 test.php,也是處於命名空間之下的代碼:

namespace secondsp;include 'function.php';class foo{  function foofunction()  {    return METHOD . "\r\n" ;  }}function is_file($file){  return true ;}//非限定名稱:執行個體化secondsp\foo類對象$obj = new foo; echo $obj->foofunction();//執行個體化Foo\Bar\subnamespace\foo 類對象$obj = new Foo\Bar\subnamespace\foo ;echo $obj->foofunction();//代碼會報錯,在命名空間內部,假如無法找到當前命名空間下的類,則會報錯//$obj = new ArrayObject(array(1)); $obj = new \ArrayObject(array(1)); //在命名空間內部,假如無法找到當前命名空間下的函數或者常量,則會尋找 native functionecho strlen("nihao"); //引用當前命名空間下的函數var_dump(is_file('nihao')); //True//引用全域函數var_dump(\is_file('nihao')); //False

匯入,別名

假如要使用的命名空間層級很長且數量很多,那麼在使用的時候特別麻煩,所以可以使用 use 關鍵字匯入命名空間、類、常量、函數等,然後可以使用它們直接引用完整的名稱。而 alias 關鍵字可以給匯入的類和函數等重新命名。

舉個例子如何使用 use 關鍵字,該代碼處於全域命名空間之下:

include 'function.php';use Foo\Bar\subnamespace\foo ;$obj = new foo;echo $obj->foofunction();use Foo\Bar\subnamespace\foo as aliasfunname;$obj = new aliasfunname;echo $obj->foofunction();use Foo\Bar\subnamespace ; $obj = new subnamespace\foo ;echo $obj->foofunction();use Foo\Bar\subnamespace as aliasname;$obj = new aliasname\foo ;echo $obj->foofunction();//由於調用代碼並不在命名空間內,所以對於全域的類,無需引入使用$obj = new ArrayObject(array(1)); //匯入一個函數use function Foo\Bar\subnamespace\foo  ;echo foo();use function Foo\Bar\subnamespace\foo as func;echo func();use const Foo\Bar\subnamespace\FOO;//echo FOO;

總結:

•和 Python 不一樣,PHP 中的命名空間是語義上的一種概念,和具體代碼的位置、布局沒有關係,換句話說,使用命名空間的代碼需要自己引入庫檔案(所有檔案),至於庫檔案如何組織無所謂;而在 Python 中,假如模組或包中有一個 init.py 檔案,則 Python 解析器會自動引入包或所有模組的檔案。

•PHP 中範圍的概念很弱化,全域域和局部域分的很清楚,比如在函數或類中無法引用全域空間中的變數。而在命名空間則不同,定義命名空間的代碼,假如找不到對應命名空間下的常量和函數,則會使用全域的常量和函數;而假如找不到對應名命名空間下的類(包括自訂類),則代碼直接報錯。

•通過 use 關鍵字使用命名空間的,無須通過完全限定名稱的方式(\ 符號)匯入,因為 PHP 已經假設匯入的是完整命名空間。

•通過 use 關鍵字可以匯入常量、函數、類、介面、其他命名空間。

•命名空間是一種語言特性,為了追求更有效使用,應該有一種使用規範和自動載入機制,這就是 PSR-4 規範。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.