1. 程式人生 > >php use 操作符閒話

php use 操作符閒話

use 操作符類似於 C++ 中的 using 語句。

在 PHP 中,use 操作符完成的工作稱之為取別名。具體可以分為:

  1. 為類名稱使用別名
  2. 為介面使用別名
  3. 為名稱空間名稱使用別名
  4. PHP 5.6開始允許匯入函式或常量或者為它們設定別名。

use 的用法並不難掌握,但這裡基於如下例子特別談兩點。

假如在全域性名稱空間有一個名為 Another 的類,請問就下面的程式碼而言,$obj1 和 $obj2 分別是例項化的是哪個類?

<?php
namespace foo;

$obj1 = new Another;
$obj2 = new \Another;
?>

答案是 $

obj1 例項化的是 foo\Another 這個類(如果這個類不存在就會報錯);$obj2 例項化的是全域性名稱空間中的 Another 類。

而我剛開始基於自己 C++ 的基礎,認為 $obj1 例項化是全域性名稱空間中的 Another 類。但事實是 PHP 的名稱空間和 C++還是有區別的。

就上面的例子而言,一點是對類名的解析,一點就是全域性空間。

PHP 的全域性空間使用 \ 來表示,就是說如果我們要使用全域性名稱空間中的一個類,必須像 $obj2 那樣,使用 \ 來限定這個類;因為在 php 中例項化一個類時,如果這個類名不是完全限定的,比如上面的 new Another,PHP會基於當前名稱空間去解析這個類名,所以 $

obj1 才會被解析為 foo\Another 的例項。

最後很有意思的一點是,當我們在一個名稱空間中,呼叫全域性名稱空間中的函式時,如果該名稱空間中沒有同名函式,函式名並不需要使用前導 \ 對函式名進行限定。

<?php
namespace foo;

$r = func()
?>

比如上面的程式碼,PHP 會呼叫全域性名稱空間中的 func 函式,而不是呼叫 foo\func;當然如果 foo 名稱空間中定義了同名函式,這時如果還想呼叫全域性名稱空間中的 func 函式,還是需要使用前導 \ 對函式名進行限定的。