php - namespace篇

以前沒有系統學習過PHP語言,直接上手TP框架了,因此認爲namespaceuseTP框架的一部分,最近學習語言模塊的時候遇到了這個問題,因此彙總了一下。php

PHP中命名空間能夠解決兩類問題:

  • 用戶編寫的代碼與PHP內部的類、函數、常量或第三方類、函數、常量之間的名字衝突。
  • 爲很長的標識符名稱(一般是爲了緩解第一類問題而定義的)建立一個別名,提升代碼的可讀性。

在沒定義命名空間的狀況下,全部的常量、類、函數等都在全局空間下。框架

命名空間

經過關鍵字namespace聲明。能夠在同一個文件中定義不一樣的命名空間代碼,全局的非命名空間代碼與命名空間中的代碼經過大括號的形式能夠組合在一塊兒函數

<?php
# 命名空間TestA
namespace TestA{
    class TestA{}
    function test(){}
}

# 命名空間TestB
namespace TestB{
    class TestB{}
    function test(){}
}

# 全局的非命名空間
namespace{
    class TestC{}
    function test(){}
}

子命名空間
與目錄和文件的關係很像,PHP命名空間也容許指定層次的命名空間的名稱學習

<?php
namespace a\b\Test; 

?>

命名空間的引入

經過關鍵字use引入,經過as定義別名spa

引入命名空間三種狀況:
非限定名稱,或不包含前綴的類名稱。在命名空間爲a下,使用$a = new foo();表明引用的是a\foo。在命名空間爲全局的狀況下,使用該方法則引用的是foo
限定名稱,或包含前綴的名稱。在命名空間爲a下,使用$a = new b\foo();代碼引入的是a\b\foo。在命名爲全局的狀況下,使用該方法引入的是b\foo
徹底限定名稱,或包含了全局前綴操做符的名稱。在命名空間爲a下,$a = new \c\b\foo();這種狀況下,老是引入爲c\b\foor文件code

上述三種方式其實就是文件路徑中絕對路徑和相對路徑。字符串

注意:訪問任意全局類、函數或變量,均可以使用徹底限定名稱,例如\strlen()或者\Exceptionio

<?php
namespace foo;

use \A\B\TestA;    #導入命名空間
use \A\B\TestB as TB;    #導入命名空間,並別名爲TB

?>

namespace__NAMESPACE__魔術常量

namespace用於定義命名空間,__NAMESPACE__是包含當前命名空間的字符串,在全局的狀況下,它是一個空字符串''function

相關文章
相關標籤/搜索