使用名稱空間:基礎
http://php.net/manual/zh/language.namespaces.basics.php#language.namespaces.basics
(PHP 5 >= 5.3.0, PHP 7)
在討論如何使用名稱空間之前,必須瞭解 PHP 是如何知道要使用哪一個名稱空間中的元素的。可以將 PHP 名稱空間與檔案系統作一個簡單的類比。在檔案系統中訪問一個檔案有三種方式:
- 相對檔名形式如foo.txt。它會被解析為 currentdirectory/foo.txt,其中 currentdirectory 表示當前目錄。因此如果當前目錄是 /home/foo,則該檔名被解析為/home/foo/foo.txt。
- 相對路徑名形式如subdirectory/foo.txt。它會被解析為 currentdirectory/subdirectory/foo.txt。
- 絕對路徑名形式如/main/foo.txt。它會被解析為/main/foo.txt。
PHP 名稱空間中的元素使用同樣的原理。例如,類名可以通過三種方式引用:
- 非限定名稱,或不包含字首的類名稱,例如 $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。
- 完全限定名稱,或包含了全域性字首操作符的名稱,例如, $a = new \currentnamespace\foo(); 或\currentnamespace\foo::staticmethod();。在這種情況下,foo 總是被解析為程式碼中的文字名(literal name)currentnamespace\foo。
下面是一個使用這三種方式的例項:
file1.php
<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo{
static function staticmethod() {}
}
?>
file2.php
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo{
static function staticmethod() {}
}
/* 非限定名稱 */
foo(); // 解析為 Foo\Bar\foo
foo::staticmethod(); // 解析為類 Foo\Bar\foo的靜態方法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
?>
注意訪問任意全域性類、函式或常量,都可以使用完全限定名稱,例如 \strlen() 或 \Exception 或 \INI_ALL。
Example #1 在名稱空間內部訪問全域性類、函式和常量
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // 呼叫全域性函式
strlen$b = \INI_ALL; // 訪問全域性常量 INI_ALL
$c = new \Exception('error'); // 例項化全域性類 Exception
?>
namespace關鍵字和NAMESPACE常量
PHP支援兩種抽象的訪問當前名稱空間內部元素的方法,NAMESPACE 魔術常量和namespace關鍵字。
常量NAMESPACE的值是包含當前名稱空間名稱的字串。在全域性的,不包括在任何名稱空間中的程式碼,它包含一個空的字串。
例子:
<?php
namespace MyProject;
echo '"', __NAMESPACE__, '"'; // 輸出 "MyProject"
?>
關鍵字 namespace 可用來顯式訪問當前名稱空間或子名稱空間中的元素。它等價於類中的 self 操作符。
<?php
namespace MyProject;
use blah\blah as mine; // see "Using namespaces: importing/aliasing"
blah\mine(); // calls function MyProject\blah\mine()
namespace\blah\mine(); // calls function MyProject\blah\mine()
namespace\func(); // calls function MyProject\func()
namespace\sub\func(); // calls function MyProject\sub\func()
namespace\cname::method(); // calls static method "method" of class MyProject\cname
$a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
$b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b
?>
使用名稱空間:別名/匯入
允許通過別名引用或匯入外部的完全限定名稱,是名稱空間的一個重要特徵。這有點類似於在類 unix 檔案系統中可以建立對其它的檔案或目錄的符號連線。
所有支援名稱空間的PHP版本支援三種別名或匯入方式:為類名稱使用別名、為介面使用別名或為名稱空間名稱使用別名。PHP 5.6開始允許匯入函式或常量或者為它們設定別名。
在PHP中,別名是通過操作符 use 來實現的. 下面是一個使用所有可能的五種匯入方式的例子:
<?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
?>
相關文章
- Xamarin基礎名稱空間Microsoft.SqlServer.ServerROSSQLServer
- C++基礎:什麼是名稱空間C++
- 名稱空間
- 使用p名稱空間和c名稱空間的XML快捷方式XML
- JAXB名稱空間及名稱空間字首處理
- python基礎 - python名稱空間與作用域Python
- PHP 名稱空間PHP
- PHP名稱空間PHP
- vuex名稱空間Vue
- jQuery 名稱空間jQuery
- JavaScript 名稱空間JavaScript
- php名稱空間namespace使用筆記PHPnamespace筆記
- C++名稱空間的使用 (轉)C++
- .NET C#基礎(6):名稱空間 - 有名字的作用域C#
- 網路虛擬化基礎一:linux名稱空間NamespacesLinuxnamespace
- python名稱空間Python
- C++名稱空間C++
- 更改模型名稱空間模型
- 全域性名稱空間
- C++ 名稱空間C++
- Python 名稱空間Python
- 11. 名稱空間
- ts---名稱空間
- .NET C#基礎(6):名稱空間 - 組織程式碼的利器C#
- PHP名稱空間(Namespace)的使用詳解PHPnamespace
- PHP 核心特性 - 名稱空間PHP
- Spring名稱空間解析Spring
- ros節點名稱空間ROS
- JavaScript 中的名稱空間JavaScript
- PHP名稱空間概念解析PHP
- JAXB玩轉名稱空間
- Python 的名稱空間Python
- System.Web 名稱空間Web
- Python名稱空間包Python
- Python中名稱空間是什麼?名稱空間生命週期是多久?Python
- 修改oracle使用者名稱,表空間名字,Oracle
- System.Security.Cryptography 名稱空間
- c++系列:匿名名稱空間C++