php:命名空間

php.net
(PHP 5 >= 5.3.0, PHP 7)
參見php自動加載,會對命名空間有更好的認識php

定義命名空間

雖然任意合法的PHP代碼均可以包含在命名空間中,但只有如下類型的代碼受命名空間的影響,它們是:類(包括抽象類和traits)、接口、函數和常量。
若是一個文件中包含命名空間,它必須在其它全部代碼以前聲明命名空間,除了一個之外:declare關鍵字。全部非 PHP 代碼包括空白符都不能出如今命名空間的聲明以前。html

<html>
<?php
namespace MyProject; // 致命錯誤 - 命名空間必須是程序腳本的第一條語句
?>

同一個命名空間能夠定義在多個文件中,即容許將同一個命名空間的內容分割存放在不一樣的文件中。編程

定義子命名空間

<?php
namespace MyProject\Sub\Level;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
?>

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

注:在實際的編程實踐中,很是不提倡在同一個文件中定義多個命名空間!函數

<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace AnotherProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}
?>

使用命名空間

類名的三種引用方式:spa

  • 非限定名稱(名稱中不包含命名空間分隔符的標識符),或不包含前綴的類名稱。例如 $a=new foo(); 或 foo::staticmethod();。若是當前命名空間是 currentnamespace,foo 將被解析爲 currentnamespace\foo。若是使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,則 foo 會被解析爲foo。* *警告**:若是命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析爲全局函數名稱或常量名稱。
  • 限定名稱(名稱中含有命名空間分隔符的標識符),或包含前綴的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。若是當前的命名空間是 currentnamespace,則 foo 會被解析爲 currentnamespace\subnamespace\foo。若是使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,foo 會被解析爲subnamespace\foo。
  • 徹底限定名稱(名稱中包含命名空間分隔符,並以命名空間分隔符開始的標識符),或包含了全局前綴操做符的名稱。訪問任意全局類、函數或常量,均可以使用徹底限定名稱,例如 \strlen() 或 \Exception 。

tips:.net

$a = '\namespacename\classname';
$obj = new $a; 
$a = 'namespacename\classname';
$obj = new $a;
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // also prints namespacename\funcname

使用相關常量

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

使用命名空間:別名/導入

<?php
namespace foo;
use My\Full\Classname as Another;

// 下面的例子與 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 導入一個全局類
use ArrayObject;

// importing a function (PHP 5.6+)
use function My\Full\functionName;

// aliasing a function (PHP 5.6+)
use function My\Full\functionName as func;

// importing a constant (PHP 5.6+)
use const My\Full\CONSTANT;

$obj = new namespace\Another; // 實例化 foo\Another 對象
$obj = new Another; // 實例化 My\Full\Classname 對象
NSname\subns\func(); // 調用函數 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 實例化 ArrayObject 對象
// 若是不使用 "use \ArrayObject" ,則實例化一個 foo\ArrayObject 對象
func(); // calls function My\Full\functionName
echo CONSTANT; // echoes the value of My\Full\CONSTANT
?>

類名稱老是解析到當前命名空間中的名稱。所以在訪問系統內部或不包含在命名空間中的類名稱時,必須使用徹底限定名稱。htm

相關文章
相關標籤/搜索