PHP名稱空間及自動載入淺析

codeceo發表於2015-03-13

名稱空間

什麼是名稱空間呢?

名稱空間(英語:Namespace)表示識別符號(identifier)的可見範圍。一個識別符號可在多個名稱空間中定義,它在不同名稱空間中的含義是互不相干的。這樣,在一個新的名稱空間中可定義任何識別符號,它們不會與任何已有的識別符號發生衝突,因為已有的定義都處於其它名稱空間中。

簡單說來名稱空間是為了解決不同庫在同一個環境下使用時出現的命名衝突。例如我自己有一個函式名叫A,但是系統已經有一個A函式了,那就會出現衝突。

PHP中的名稱空間

PHP從5.3版本開始引入了名稱空間,之後許多現有PHP類庫以及框架都開始支援它。那麼PHP的名稱空間怎麼用呢?

定義名稱空間

下面是一個定義名稱空間的例子

<?php    
//file a.php
namespace A;

const test = 'Atest'; 

function test() { 
    return __FUNCTION__; 
}

class Test{
    public function __construct(){
        return __METHOD__;
    }
}
?>

上面例子中就是一個典型的名稱空間定義方法,只有constfunction,class受名稱空間的約束。

使用名稱空間

使用名稱空間的方式如下:

<?php 
namespace B;
use A;

const test = 'Btest';
function test() { 
    return __FUNCTION__; 
}

class Test{
    public function __construct(){
        return __METHOD__;
    }
}

include "a.php";//必須包含A名稱空間的檔案

// 完全限定
// `\B\test`從絕對位置查詢輸出,如果是全域性函式則`\test`
echo \B\test;   //輸出Btest

// 限定名稱  
// 這裡已經通過`use A`申明瞭在這個檔案可以通過`\A\...`使用A名稱空間的函式
echo A\test;    //輸出Atest

// 非限定名稱
// 非限定名稱的函式`test`會從當前命名控制元件查詢,即B
echo test;      //輸出Btest

// namespace關鍵字代表當前名稱空間
echo namespace/test;
?>

首先要注意的是名稱空間只起申明作用,也就是在使用了名稱空間的時候依然得把這個名稱空間申明的那個檔案包含進來。在使用中可以通過__NAMESPACE__來檢視當前名稱空間。

更多內容可以檢視PHP官方文件

自動載入

每個檔案既要申明命名控制元件又要手動include是非常不智慧的事情,所以在自己的PHP系統或者框架中可以使用自動載入技術,讓系統自己去找

最簡單的方式是利用函式__autoload函式,但是這個函式只能在非命名控制元件下定義,也就是全域性情況下:

function __autoload($class) {
  $dir = './';
  set_include_path(get_include_path().PATH_SEPARATOR.$ids_dir);
  $class = str_replace('\\', '/', $class) . '.php'; 
  require_once($class); }

如果在已經有了名稱空間的類中,可以使用函式spl_autoload_register來註冊一個類中的方法來代替__autoload

相關文章