天天看點

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";
}
?>