PHP命名空間和別名 匯入(摘要)

2021-07-07 05:54:09 字數 3404 閱讀 9063

支援命名空間,php版本需要》=5.3.0。從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在作業系統中目錄用來將相關檔案分組,對於目錄中的檔案來說,它就扮演了命名空間的角色。具體舉個例子,檔案foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同乙個目錄中不能存在兩個 foo.txt 檔案。另外,在目錄 /home/greg 外訪問 foo.txt 檔案時,我們必須將目錄名以及目錄分隔符放在檔名之前得到/home/greg/foo.txt。這個原理應用到程式設計領域就是命名空間的概念。

在php中,命名空間用來解決編寫類庫或應用程式時建立可重用的**如類或函式時遇到的兩類問題:

1. 使用者編寫的**與php內部的類/函式/常量或第三方類/函式/常量之間的名字衝突。

2. 為很長的識別符號名稱(通常是為了緩解第一類問題而定義的)建立乙個別名(或簡短)的名稱,提高源**的可讀性。

二、定義命名空間

1、雖然任意合法的php**都可以包含在命名空間中,但只有類(包括抽象類和traits)、介面、函式和常量受命名空間的影響。

3、所有非php**包括空白符也不能出現在命名空間的宣告之前,另外,與php其它的語言特徵不同,同乙個命名空間可以定義在多個檔案中,即允許將同乙個命名空間的內容分割存放在不同的檔案中。

a、宣告單個命名空間

<?php

namespace myproject;

const connect_ok = 1;

class connection

function connect()

?>

b、與目錄和檔案的關係很象,php 命名空間也允許指定層次化的命名空間的名稱。因此,命名空間的名字可以使用分層次的方式定義。

<?php

namespace myproject\sub\level;

const connect_ok = 1;

class connection

function connect()

?>

c、也可以在同乙個檔案中定義多個命名空間

<?php

namespace myproject

function connect()

}namespace anotherproject

function connect()

}?>

三、使用命名空間

php命名空間中的元素可以通過三種方式引用

1、非限定名稱,或不包含字首的類名稱,例如 $a=new foo(); 如果當前命名空間是currentnamespace,foo將被解析為 currentnamespace\foo,如果使用 foo 的**是全域性的,不包含在任何命名空間中的**,則 foo 會被解析為foo,取決於當前**所處的命名空間。注意:如果命名空間中的函式或常量未定義,則該非限定的函式名稱或常量名稱會被解析為全域性函式名稱或常量名稱。

2、限定名稱或包含字首的名稱,例如 $a = new subnamespace\foo();如果當前的命名空間是currentnamespace,則foo會被解析為 currentnamespace\subnamespace\foo。如果使用 foo 的**是全域性的,不包含在任何命名空間中的**,foo 會被解析為subnamespace\foo。

3、完全限定名稱或包含了全域性字首操作符的名稱,例如:$a = new \currentnamespace\foo(); 解析結果則不受當前命名空間的影響,直接解析為該完全限定的名稱。

php支援兩種抽象的訪問當前命名空間內部元素的方法,__namespace__ 魔術常量和namespace關鍵字。常量__namespace__的值是包含當前命名空間名稱的字串,在全域性的不包括在任何命名空間中的**,它包含的是乙個空的字串。

四、別名/匯入(注意別名/匯入命名空間的前提是該命名空間所在的檔案已經被require或include)

命名空間的乙個重要特徵是允許通過別名引用或匯入外部的完全限定名稱,這有點類似於在類 unix 檔案系統中可以建立對其它的檔案或目錄的符號連線。所有支援命名空間的php版本支援三種別名或匯入方式:為類名稱使用別名、為介面使用別名或為命名空間名稱使用別名,php 5.6開始允許使用use關鍵字

匯入函式或常量或者為它們設定別名。

注:引用或取別名的命名空間名稱,前導的反斜槓是不必要的也不推薦的,因為匯入的名稱必須是完全限定的,不會根據當前的命名空間作相對解析。(相當於預設在取別名/匯入的名稱前加字首\)

<?php

namespace foo;

use my\full\classname as another;

// 等價於use my\full\nsname as nsname

use my\full\nsname;

// 匯入乙個全域性類

use arrayobject;

// importing a function (php 5.6+)

use function my\full\functionname;

// aliasing a function (php 5.6+)

use function my\full\functionname as func;

// importing a constant (php 5.6+)

use const my\full\constant;

$obj = new namespace\another; // 例項化 foo\another 物件

$obj = new another; // 例項化 my\full\classname 物件

nsname\subns\func(); // 呼叫函式 my\full\nsname\subns\func

$a = new arrayobject(array(1)); // 例項化 arrayobject 物件

// 如果不使用 "use \arrayobject" ,則例項化乙個 foo\arrayobject 物件

func(); // calls function my\full\functionname

echo constant; // echoes the value of my\full\constant

?>

五、全域性空間

如果沒有定義任何命名空間,所有的類與函式的定義都是在全域性空間,與 php引入命名空間概念前一樣。在引用的名稱前加上字首 \ 表示該名稱是全域性空間中的名稱,即使該名稱位於其它的命名空間中時也是如此。

<?php

namespace a\b\c;

/* 這個函式是 a\b\c\fopen */

function fopen()

?>

php使用命名空間 別名 匯入

php 5 5.3.0 允許通過別名引用或匯入外部的完全限定名稱,是命名空間的乙個重要特徵。這有點類似於在類 unix 檔案系統中可以建立對其它的檔案或目錄的符號連線。所有支援命名空間的php版本支援三種別名或匯入方式 為類名稱使用別名 為介面使用別名或為命名空間名稱使用別名。php 5.6開始允許...

使用命名空間 別名 匯入

php 5 5.3.0,php 7 允許通過別名引用或匯入外部的完全限定名稱,是命名空間的乙個重要特徵。這有點類似於在類 unix 檔案系統中可以建立對其它的檔案或目錄的符號連線。所有支援命名空間的php版本支援三種別名或匯入方式 為類名稱使用別名 為介面使用別名或為命名空間名稱使用別名。php 5...

php命名空間中別名的使用

mysql中可以為字段和表名等取別名如 1 select a.username,a.order from orders as a inner join user as b on a.username b.username 為表取別名 2 select count goods id as totalg...