使用名稱空間:基礎

weixin_34007886發表於2016-12-06

http://php.net/manual/zh/language.namespaces.basics.php#language.namespaces.basics

(PHP 5 >= 5.3.0, PHP 7)
在討論如何使用名稱空間之前,必須瞭解 PHP 是如何知道要使用哪一個名稱空間中的元素的。可以將 PHP 名稱空間與檔案系統作一個簡單的類比。在檔案系統中訪問一個檔案有三種方式:

  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 名稱空間中的元素使用同樣的原理。例如,類名可以通過三種方式引用:

  1. 非限定名稱,或不包含字首的類名稱,例如 $a=new foo();foo::staticmethod();。如果當前名稱空間是currentnamespace,foo 將被解析為 currentnamespace\foo。如果使用 foo 的程式碼是全域性的,不包含在任何名稱空間中的程式碼,則 foo 會被解析為foo。 警告:如果名稱空間中的函式或常量未定義,則該非限定的函式名稱或常量名稱會被解析為全域性函式名稱或常量名稱。詳情參見 使用名稱空間:後備全域性函式名稱/常量名稱
  2. 限定名稱,或包含字首的名稱,例如 $a = new subnamespace\foo();subnamespace\foo::staticmethod();。如果當前的名稱空間是 currentnamespace,則 foo 會被解析為 currentnamespace\subnamespace\foo。如果使用 foo 的程式碼是全域性的,不包含在任何名稱空間中的程式碼,foo 會被解析為subnamespace\foo
  3. 完全限定名稱,或包含了全域性字首操作符的名稱,例如, $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
?>

相關文章