PHP命名空間規則解析及高階功能

2021-06-20 18:55:58 字數 4630 閱讀 4615

2010-03-09 17:48

[小大]

分享至:

詞庫網**監控

伺服器監控

seo監控

手機遊戲

iphone遊戲

日前發布的php 5.3中,最重要的乙個新特性就是命名空間的加入。本文介紹了php命名空間的一些術語,其解析規則,以及一些高階功能的應用,希望能夠幫助讀者在專案中真正使用命名空間。

在這裡中我們介紹了php命名空間的用途和namespace關鍵字,在這篇文章中我們將介紹一下use命令的使用以及php如何解析命名空間的名字的。

為了便於對比,我定義了兩個幾乎一樣的**塊,只有命名空間的名字不同。

< ?php  

const

;  

functionmyfunction()   

classmyclass   

}  

?>

lib2.php

< ?php  

const

;  

functionmyfunction()   

classmyclass   

}  

?> 

開始之前先要理解幾個php命名空間相關術語。

◆完全限定名稱(fully-qualified name)

完全限定名稱是沒有任何歧義的,開頭的反斜線和檔案路徑的作用有點類似,它表示「根」全域性空間,如果我們在全域性空間中實現了乙個不同的myfunction( ),可以使用\myfunction( )從lib1.php或lib2.php呼叫它。

完全限定名稱對一次性函式呼叫或物件初始化非常有用,但當你產生了大量的呼叫時它們就沒有實用價值了,在下面的討論中我們將會看到,php提供了其它選項以解除我們為命名空間打字的煩惱。

◆限定名稱(qualified name)

至少有乙個命名空間分隔符的識別符號,如lib1\myfunction( )。

◆非限定名稱(unqualified name)

沒有命名空間分隔符的識別符號,如myfunction( )。

在相同的命名空間內工作

仔細思考下面的**:

< ?php  

require_once('lib1.php'

);  

require_once('lib2.php'

);  

header('content-type: text/plain'

);  

echo myconst . "\n"

;  echo myfunction() . "\n"

;  echo myclass::whoami() . "\n"

;  ?>  

執行結果:

命名空間匯入

可以使用use操作符匯入命名空間,如:

< ?php  

use

require_once('lib1.php'

);  

require_once('lib2.php'

);  

header('content-type: text/plain'

);  

echo lib2\myconst . "\n"

;  

echo lib2\myfunction() . "\n"

;  

echo lib2\myclass::whoami() . "\n"

;  

?>  

執行結果:

命名空間別名

命名空間別名可能是最有用的構想了,別名允許我們使用較短的名稱引用很長的命名空間。

< ?php  

usel;  

useobj;  

header('content-type: text/plain'

);  

require_once('lib1.php'

);  

require_once('lib2.php'

);  

echo l\myconst . "\n"

;  

echo l\myfunction() . "\n"

;  

echo l\myclass::whoami() . "\n"

;  

echo obj::whoami() . "\n"

;  

?>  

執行結果:

php命名解析規則

1.在編譯時呼叫完全限定函式、類或常量;

2.非限定名稱和限定名稱根據匯入規則進行翻譯,例如,如果a\b\c匯入為c,呼叫c\d\e( )就會被翻譯成a\b\c\d\e( );

3.在php命名空間內,所有限定名稱尚未根據匯入規則轉換,例如,如果在命名空間a\b中呼叫c\d\e( ),那麼會被翻譯成a\b\c\d\e( );

4.非限定類名稱根據當前的匯入規則進行轉換,使用全名替換匯入的短名稱,例如,如果類c在命名空間a\b中被匯入為x,那麼new x( )就會被翻譯為new a\b\c( );

5.在命名空間中非限定函式呼叫在執行時解析,例如,如果myfunction( )在命名空間a\b中被呼叫,php首先會查詢函式\a\b\myfunction( ),如果沒有找到,然後會在全域性空間中查詢\myfunction( );

6.呼叫非限定或限定類名在執行時被解析,例如,如果我們在命名空間a\b中呼叫new c( ),php將會查詢類a\b\c,如果沒有找到,php會嘗試自動載入a\b\c。

php命名空間高階特性

接下來讓我們看一看php命名空間的一些高階特性。

__namespace__常量

__namespace__是乙個php字串,它總是返回當前命名空間的名稱,在全域性空間中它是乙個空字串。

< ?php  

?>  

這個值在除錯時非常有用,它也可由於動態生成乙個完全限定類名,如:

< ?php  

classmyclass   

}  $c

= __namespace__ . '\\myclass'

;  $m

=new

$c;  

echo$m 

?>  

namespace關鍵字

namespace關鍵字可以用於明確引用乙個當前命名空間或子命名空間中的專案,它等價於類中的self命名空間:

< ?php  

classmyclass   

}  $m

=newnamespace\myclass;  

echo$m 

?>  

自動載入命名空間類

php 5中最省時省力的特性是自動載入,在全域性(非命名空間)php**中,可以寫乙個標準自動載入函式:

< ?php  

$obj

=newmyclass1(); // classes/myclass1.php is auto-loaded

$obj

=newmyclass2(); // classes/myclass2.php is auto-loaded

// autoload function

function__autoload($class_name

)   

?>  

< ?php  

classmyclass   

}  ?>  

在根資料夾下的檔案就使用下面的**了:

< ?php  

usemc;  

$obj

=newmc();  

echo

$obj

->whoami();  

// autoload function

function__autoload($class

)   

?>  

解釋:總結

有關php命名空間的使用就介紹到這裡,希望您能夠對php的命名空間有乙個新的認識,並希望你能在新專案中真正使用命名空間。

PHP命名空間解析規則

名稱中不包含命名空間分隔符的識別符號,例如foo名稱中含有命名空間分隔符的識別符號,例如 foo bar名稱中包含命名空間分隔符,並以命名空間分隔符開始的識別符號,例如 foo bar.namespace foo 也是乙個完全限定名稱。對完全限定名稱的函式,類和常量的呼叫在編譯時解析。例如 new ...

PHP命名空間規則解析及高階功能

日前發布的php 5 3中,最重要的乙個新特性就是命名空間的加入。本文介紹了php命名空間的一些術語,其解析規則,以及一些高階功能的應用,希望能夠幫助讀者在專案中真正使用命名空間。在這裡中我們介紹了php命名空間的用途和namespace關鍵字,在這篇文章中我們將介紹一下use命令的使用以及php如...

PHP命名空間及自動載入

什麼是命名空間呢?命名空間 英語 namespace 表示識別符號 identifier 的可見範圍。乙個識別符號可在多個命名空間中定義,它在不同命名空間中的含義是互不相干的。這樣,在乙個新的命名空間中可定義任何識別符號,它們不會與任何已有的識別符號發生衝突,因為已有的定義都處於其它命名空間中。簡單...