PHP 命名空間原理與用法詳解

2022-09-26 19:57:17 字數 3057 閱讀 2243

命名空間適用於 (php 5 >= 5.3.0, php 7)

php 命名空間類似於檔案系統,

雖然任意合法的php**都可以包含在命名空間中,但只有以下型別的**受命名空間的影響,

它們是:

命名空間通過關鍵字 namespace 來宣告。如果乙個檔案中包含命名空間,它必須在其它所有**之前宣告命名空間,除了乙個以外:declare關鍵字。

<?php namespace myproject; //&nb致命錯誤 - 命名空間必須是程式指令碼的第一條語句

?>

example 宣告單個命名空間

<?php namespace myproject;

const connect_ok = 1;

class connection

function connect()

?>

定義多個命名空間,推薦用大括號語法

<?php namespace myproject

function connect()

}namespace anotherproject

function connect()

}?>

在實際的程式設計實踐中,非常不提倡在同乙個檔案中定義多個命名空間。這種方式的主要用於將多個 php 指令碼合併在同乙個檔案中。

將全域性的非命名空間中的**與命名空間中的**組合在一起,只能使用大括號形式的語法。全域性**必須用乙個不帶名稱的 namespace 語句加上大括號括起來,例如:

<?php declare(encoding='utf-8');

namespace myproject

function connect()

}namespace

?>

常量__namespace__的值是包含當前命名空間名稱的字串。

如果不包括在任何命名空間中的**,則為乙個空的字串。

<?php namespace myproject;

echo '"', __namespace__, '"'; // 輸出 "myproject"

?>

<?php echo '"', __namespace__, '"'; // 輸出 ""

?>

關鍵字 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中,別名是通過操作符 use 來實現的.

<?php use my\full\classname as another, my\full\nsname;

$obj = new another; // 例項化 my\full\classname 物件

nsname\subns\func(); // 呼叫函式 my\full\nsname\subns\func

?>

如果沒有定義任何命名空間,所有的類與函式的定義都是在全域性空間,與 php 引入命名空間概念前一樣。在名稱前加上字首 \ 表示該名稱是全域性空間中的名稱,即使該名稱位於其它的命名空間中時也是如此。

<?php namespace a\b\c;

/* 這個函式是 a\b\c\fopen */

function fopen()

?>

在乙個命名空間中,當 php 遇到乙個非限定的類、函式或常量名稱時,它使用不同的優先策略來解析該名稱。

類名稱總是解析到當前命名空間中的名稱。因此在訪問系統內部或不包含在命名空間中的類名稱時,必須使用完全限定名稱,

<?php namespace a\b\c;

class exception extends \exception {}

$a = new exception('hi'); // $a 是類 a\b\c\exception 的乙個物件

$b = new \exception('hi'); // $b 是類 exception 的乙個物件

$c = new arrayobject; // 致命錯誤, 找不到 a\b\c\arrayobject 類

?>

對於函式和常量來說,如果當前命名空間中不存在該函式或常量,php 會退而使用全域性空間中的函式或常量。

<?php namespace a\b\c;

const e_error = 45;

function strlen($str)

echo e_error, "\n"; // 輸出 "45"

echo ini_all, "\n"; // 輸出 "7" - 使用全域性常量 ini_all

echo strlen('hi'), "\n"; // 輸出 "1"

if (is_array('hi')) el程式設計客棧se

?>

php 官方文件:

php 命名空間詳解

test1.php 的內容如下 class test test2.php 的內容如下 class test index.php 的內容如下 php提示我們不能宣告 test2.php 的 test類 這是為什麼呢 其實是因為 test2.php 中的 test類 和 test1.php 中的類重名了...

php中命名空間詳解

一 定義命名空間 命名空間主要針對 類,函式和常量,因為他們的作用域是全域性的,產生命名衝突的可能性很大 1.關鍵字 namespace 作用 1.定義命名空間 2.顯示的訪問當前命名空間,類似於self 2.常量 namespace 當前命名空間字串,全域性為空字元 3.宣告空間前不宜有除了dec...

詳解PHP中的命名空間

命名空間其實早在php5.3就已經出現了。不過大部分同kierr學可能在各種框架的使用中才會接觸到命名空間的內容,當然,現代化的開發也都離不開這些能夠快速產出的框架。這次我們不從框架的角度,僅從簡單的 角度來解析一下命名空間的概念和使用。首先,我們要定義命名空間是個什麼東西。其實就像作業系統的目錄一...