1. 程式人生 > >PHP名稱空間簡介

PHP名稱空間簡介

PHP從5.3起支援名稱空間,PHP中的名稱空間用來解決使用者編寫的程式碼與PHP內部的類/函式/常量或第三方類/函式/常量之間的名字衝突的問題,還可以為為很長的識別符號名稱建立一個別名,提高原始碼的可讀性。 名稱空間可以將相關的類、函式和常量組合到一起。

名稱空間通過namespace關鍵字來宣告。如果一個檔案中包含名稱空間,它必須在除了declare關鍵字以外的其它所有程式碼之前進行宣告。所有非PHP程式碼包括空白符都不能出現在名稱空間的宣告之前。與其他語言不同的是PHP允許在多個檔案中命名相同的名稱空間,也可以在一個檔案中定義多個名稱空間。PHP允許指定層次化的名稱空間名稱(通過反斜槓“\”),與目錄和檔案的關係很像。

定義名稱空間有兩種方式:

一種是直接組合。

<?php
namespace a;

const con = 1;
class A{}
function foo(){}

namespace b;

const con = 1;
class A{}
function foo(){}
?>

另一種是使用大括號。

<?php
namespace a{

const con = 1;
class A{}
function foo(){}
}
namespace b{

const con = 1;
class A{}
function foo(){}
}
?>

不提倡同一個檔案中定義多個名稱空間,並且不建議使用第一種方式定義多個名稱空間。如果需要將全域性的非名稱空間程式碼與名稱空間中的程式碼組合在一起,只能使用第二種方式。全域性程式碼必須用一個不帶名稱的namespace關鍵字用大括號將全域性的程式碼括起來。

<?php
namespace a{

const con = 1;
class A{}
function foo(){}
}
namespace {

const con = 1;
class A{}
function foo(){}
}
?>

 名稱空間中的元素的使用方法:

1.非限定名稱(不包含字首),會解析為在當前名稱空間的中類、函式或常量。但是要注意的是,如果當前名稱空間中未定義呼叫的函式或常量,則會解析為全域性的函式或常量。

2.限定名稱(包含字首),會解析為當前名稱空間下字首指定的子名稱空間中的類、函式或常量。

3.完全限定名稱(包含全域性字首),總是唄解析為程式碼中指定名稱空間中的類、函式或常量。

4.如果在名稱空間內部想要訪問全域性類、函式或常量,可以使用全域性字首。

<?php
namespace {
const test="test";
const con=0;
function test(){
    echo 'test in global'."\n";
}
}

namespace a\b\c{
const con = 2;
class A{
    static function foo(){
        echo 'foo in a\b\c\A'."\n";
    }
}
function foo(){
    echo 'foo in a\b\c\foo'."\n";
}
}

namespace a\b{
const con = 1;
const test="a\b\\test";
class A{
    static function foo(){
        echo 'foo in a\b\A'."\n";
    }
}
function foo(){
    echo 'foo in a\b\foo'."\n";
}
//非限定名稱
foo();
A::foo();
echo con."\n";
//非限定名稱呼叫時,若當前名稱空間中未定義,則呼叫全域性名稱空間中的函式或常量
echo test."\n";
echo test();

//限定名稱
c\foo();
c\A::foo();
echo c\con."\n";
//完全限定名稱
\a\b\c\foo();
\a\b\c\A::foo();
echo \a\b\c\con."\n";
//全域性的常量con
echo \con."\n";
}
?>