[精讚] [會員登入]
12848

[PHP] 命名空間 namespace及 use

PHP >=5.3 開始支援命名空間:namespace

分享此文連結 //n.sfs.tw/10507

分享連結 [PHP] 命名空間 namespace及 use@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2024-04-12 11:12:01 最後編修
2016-12-29 11:39:23 By 張○○
 

自動目錄

過去我們寫PHP,就知道函數名稱或是類別名稱不同重覆,如果有重覆,就不能同時include以免出現 PHP Fatal error:  Cannot redeclare class xxxx in ....的錯誤。當程式規模還不大時,一切都是可以控制的,但是一旦規模長大時(共同開發或是引用他人函式庫),無可避免的同名的問題就會層出不窮,還好到了php5.3版以後,支援了命名空間,新增了usenamespace兩個操作子,有寫過其他語言的朋友也許會覺得很熟悉吧。

namespace 運算元

為避免函數或類別重覆,就可以指定命名空間namespace。

use 運算元

  use 運算元其實是建立命名空間的別名,有三種用法,假設我的命名空間是:
  法一: use Solar\Earth as Earth;  //建立Solar\Earth的別名叫Earth
  法二: use Solar\Earth;   // 同上,但沒用 as,php自動會把最後一個 "\"後的字元當成是別名
  法三: use yourClass; 使用全域類別,請參看狀況一修正3

請注意

-- use 和namespace這兩個操作子都必需是全域的,寫在文件的最上方,換句話說,不能寫在函式、方法或類別中。否則會出現這樣的錯誤:

Namespace declaration statement has to be the very first statement in the script in ....

-- use 可以用多個並用(聯集),畢竟他只是宣告別名,但是namespace就不能多個,如果不小心宣告多個,會以最後一個為準。

下面的範例中,同樣的函式名 showme分別在同樣的類別名稱中,利用不同的namespace來叫用:

// 檔案use.class_1.php
namespace Solar\Earth;
class Dynamics{
  function showme(){
    return __METHOD__;
  }
}
     
// 檔案 use.class_2.php
namespace Solar\Moon;
class Dynamics{
  function showme(){
    return __METHOD__;
  }
} 

狀況:

include "use.class_1.php";
include "use.class_2.php";
$obj = new Dynamics();
print $obj->showme();

出現錯誤 PHP Fatal error:  Class 'Dynamics' not found in .... 因為同時include兩個有指定「命名空間的類別」卻沒有在new的時候指定他們。校正:

[修正1] new 的時候明確指名用哪一個命名空間

include "use.class_1.php";
include "use.class_2.php";
$obj = new Solar\Earch\Dynamics();
print $obj->showme();    // Solar\Earth\Dynamics::showme

[修正2] 使用namespace運算子

namespace Solar\Earth;

include "use.class_1.php";
include "use.class_2.php";

$obj = new Dynamics();
print $obj->showme();

[修正3] 使用use運算子

use Solar\Moon;
include "use.class_1.php";
include "use.class_2.php";

$obj = new Moon\Dynamics();
print $obj->showme();


[修正4] 使用全域的函數,如果還有一個全域類別也叫Dynamics,沒命名空間,在這種情況要叫用,就直接

namespace Dynamics;
include "use.class_1.php";
include "use.class_2.php";

$obj = new Dynamics();
print $obj->showme();  //Dynamics\Dynamics::showme

參考資料

[1]  http://php.net/manual/en/language.namespaces.importing.php

[2] How to Use PHP Namespaces, Part 2: Importing, Aliases, and Name Resolution

END

你可能感興趣的文章

[PHP] codeignitor4+ smarty4 這篇整合 php 的framework codeignitor4 + smarty4。

[PHP>7.3] switch中的 Did you mean to use "continue 2"? 除錯 這近更新 PHP到7.3版以後,出現這樣的錯:targeting switch is equivalent to "break". Did you mean to use "continue 2"?解決方法

[phpmyadmin] 設定預設語言(Language) phpmyadmin預設進來是會選擇你瀏覽器預設的語系,改成正體中文

PHP 數字加解密函式 自寫的數字加解密,勉強用

使用strcmp來判斷日期是否介於某日期之間 要比較現在日期是否在兩個日期之間,使用字串比對的方法

PHP程式經驗 #1 -- 靜態的物件比動態物件快 驗證 1. 使用動態物件函式 > 使用靜態物件函式。 2. 使用有宣告的靜態物件函式 > 使用動態無宣告的靜

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

談借錢 人借錢時手心向上頭向下,人還錢時手心向下頭向上

為什麼要重造輪子? 什麼輪子?造什麼輪子?我為什麼要重造輪子?

[JAVA] JWS, JWT, JWE, JOSE是什麼? [JAVA] JWS, JWT, JWE, JOSE是什麼?非常的複雜,儘量來搞清楚..

問問題 問問題其實內涵很深,我悟了很久才懂。 有人問題的目的並不一定是想要得到答案,有時只是純粹想問問題..

[PHP]解決ksort新增的SORT_NATURAL|SORT_FLAG_CASE方法 php>=5.4中ksort函數多了SORT_NATURAL 和 SORT_FLAG_CASE 旗標,對舊版的PHP中要怎麼辦?