1. 程式人生 > >命名空間

命名空間

創建 content ubd amp 研究 class 包括 reg href

一些關於命名空間的學習總結:

一、概述

具體舉個例子,文件 foo.txt 可以同時在目錄/home/greg/home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 文件。另外,在目錄 /home/greg 外訪問 foo.txt 文件時,我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個原理應用到程序設計領域就是命名空間的概念。

為解決

  1. 用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。
  2. 為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高源代碼的可讀性。

二、定義命名空間

雖然任意合法的PHP代碼都可以包含在命名空間中,但只有以下類型的代碼受命名空間的影響,它們是:類(包括抽象類和traits)、接口、函數和常量。命名空間通過關鍵字namespace 來聲明。

1.如果一個文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間,除了一個以外:declare關鍵字。

2.另外,與PHP其它的語言特征不同,同一個命名空間可以定義在多個文件中,即允許將同一個命名空間的內容分割存放在不同的文件中。

技術分享

三、同一個文件中定義多個命名空間

1.

技術分享

2.

技術分享

3.

技術分享

四:使用命名空間:基礎

類比文件系統的訪問:

  1. 相對文件名形式如foo.txt。它會被解析為 currentdirectory/foo.txt
    ,其中 currentdirectory 表示當前目錄。因此如果當前目錄是 /home/foo,則該文件名被解析為/home/foo/foo.txt
  2. 相對路徑名形式如subdirectory/foo.txt。它會被解析為 currentdirectory/subdirectory/foo.txt
  3. 絕對路徑名形式如/main/foo.txt。它會被解析為/main/foo.txt

使用示例:

技術分享

<?php
namespace Foo\Bar;
include ‘file1.php‘;

const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}

/* 非限定名稱 */
foo(); // 解析為 Foo\Bar\foo resolves to function Foo\Bar\foo
foo::staticmethod(); // 解析為類 Foo\Bar\foo的靜態方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO

/* 限定名稱 */
subnamespace\foo(); // 解析為函數 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析為類 Foo\Bar\subnamespace\foo,
// 以及類的方法 staticmethod
echo subnamespace\FOO; // 解析為常量 Foo\Bar\subnamespace\FOO

/* 完全限定名稱 */
\Foo\Bar\foo(); // 解析為函數 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析為類 Foo\Bar\foo, 以及類的方法 staticmethod
echo \Foo\Bar\FOO; // 解析為常量 Foo\Bar\FOO
?>

2、

註意訪問任意全局類、函數或常量,都可以使用完全限定名稱,例如 \strlen()\Exception\INI_ALL

五:命名空間和動態語言特性

略...用到再研究...

六:__namespace__關鍵字

常量__NAMESPACE__的值是包含當前命名空間名稱的字符串。在全局的,不包括在任何命名空間中的代碼,它包含一個空的字符串。

命名空間