1. 程式人生 > >PHP名稱空間(namespace)

PHP名稱空間(namespace)

名稱空間概述

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

在PHP中,名稱空間用來解決在編寫類庫或應用程式時建立可重用的程式碼如類或函式時碰到的兩類問題:

使用者編寫的程式碼與PHP內部的類/函式/常量或第三方類/函式/常量之間的名字衝突。
為很長的識別符號名稱(通常是為了緩解第一類問題而定義的)建立一個別名(或簡短)的名稱,提高原始碼的可讀性。

名空間提供了一種將相關的類、函式和常量組合到一起的途徑。下面是一個說明 PHP 名稱空間語法的示例:

我的專案目錄結構如下:
這裡寫圖片描述

index.php需要同時使用test1\Test.phptest2\Test.php,如果不用名稱空間,由於兩個類都同名,則會報錯。

vendor\test1\Test.php

<?php
namespace vendor\test1;

class Test{
    public function path(){
        echo __DIR__."<br>";
    }
}

vendor\test2\Test.php

<?php
namespace vendor\test2;

class Test{
    public function path(){
        echo __DIR__."<br>";
    }
}

index.php

<?php
    spl_autoload_register(function($class){
        if($class){
            $file = str_replace('\\','/',$class);
            $file .= '.php';
            if(file_exists($file)){
                     include($file);
                    }
                }
        });
    $test = new \vendor\test1\Test();
    $test->path();
    $test2 = new \vendor\test2\Test();
    $test2->path();

輸出如下:

D:\www\learning\vendor\test1
D:\www\learning\vendor\test2

全域性名稱空間

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