php的命名空間(namespace)是php5.3之後才有的。這個概念在c#中已經很早就有了,php中的namespace其實和c#的概念是一樣的。
假設如果不使用namespace,那麼每個類在乙個專案中的名字就必須是固定的。因為php在new的時候不管是呼叫autoload還是呼叫已載入過的類,都存在乙個類名對應的檔案。所以在沒有namespace的時候,我們會想各種命名規則來區分不同的類,比如project1_school1_class1_student或者project2_school_class_student。
引入namespace之後就可以將這個有效規避了,乙個namespace就相當於對應乙個檔案路徑,查詢這個類的時候,就會去對應的檔案路徑查詢類定義檔案了。
定義:<?php
namespace
myproject;
或者
<?php
namespace
myproject
使用:<?php
use
myproject/school;
<?php
use
myproject/school
as
school1;
// 別名
命名空間是執行時解析的。use就相當於一種宣告,並不解析和載入。比如下面這個例子:
test.php
<?php
use
my\name;
require_once
(
"/home/yejianfeng/handcode/test/namespace1.php"
);
$a
=
new
my\name\a();
$a
->print1();
namespace1.php
<?php
namespace
my\name;
class
a
}
雖然require_once在use下面,也是可以正常執行的,因為程式只有在new my\name\a()的時候才去載入命名空間my\name
如果要new乙個全域性類使用 new \a()
如果要new乙個命名空間類,使用new my\namespace\a()
自從有了命名空間之後,最容易出錯的該是使用類的時候,這個類的尋找路徑是什麼樣的了。
如果能弄清楚manual中的這個例子就能全部弄清楚尋找順序了。
<?php
namespace
a;
use
b\d, c\e
as
f;
// 函式呼叫
foo();
// 首先嘗試呼叫定義在命名空間"a"中的函式foo()
// 再嘗試呼叫全域性函式 "foo"
\foo();
// 呼叫全域性空間函式 "foo"
my\foo();
// 呼叫定義在命名空間"a\my"中函式 "foo"
f();
// 首先嘗試呼叫定義在命名空間"a"中的函式 "f"
// 再嘗試呼叫全域性函式 "f"
// 類引用
new
b();
// 建立命名空間 "a" 中定義的類 "b" 的乙個物件
// 如果未找到,則嘗試自動裝載類 "a\b"
new
d();
// 使用匯入規則,建立命名空間 "b" 中定義的類 "d" 的乙個物件
// 如果未找到,則嘗試自動裝載類 "b\d"
new
f();
// 使用匯入規則,建立命名空間 "c" 中定義的類 "e" 的乙個物件
// 如果未找到,則嘗試自動裝載類 "c\e"
new
\b();
// 建立定義在全域性空間中的類 "b" 的乙個物件
// 如果未發現,則嘗試自動裝載類 "b"
new
\d();
// 建立定義在全域性空間中的類 "d" 的乙個物件
// 如果未發現,則嘗試自動裝載類 "d"
new
\f();
// 建立定義在全域性空間中的類 "f" 的乙個物件
// 如果未發現,則嘗試自動裝載類 "f"
// 呼叫另乙個命名空間中的靜態方法或命名空間函式
b\foo();
// 呼叫命名空間 "a\b" 中函式 "foo"
b::foo();
// 呼叫命名空間 "a" 中定義的類 "b" 的 "foo" 方法
// 如果未找到類 "a\b" ,則嘗試自動裝載類 "a\b"
d::foo();
// 使用匯入規則,呼叫命名空間 "b" 中定義的類 "d" 的 "foo" 方法
// 如果類 "b\d" 未找到,則嘗試自動裝載類 "b\d"
\b\foo();
// 呼叫命名空間 "b" 中的函式 "foo"
\b::foo();
// 呼叫全域性空間中的類 "b" 的 "foo" 方法
// 如果類 "b" 未找到,則嘗試自動裝載類 "b"
// 當前命名空間中的靜態方法或函式
a\b::foo();
// 呼叫命名空間 "a\a" 中定義的類 "b" 的 "foo" 方法
// 如果類 "a\a\b" 未找到,則嘗試自動裝載類 "a\a\b"
\a\b::foo();
// 呼叫命名空間 "a\b" 中定義的類 "b" 的 "foo" 方法
// 如果類 "a\b" 未找到,則嘗試自動裝載類 "a\b"
?>
專注web開發50年。**群:
看完就懂 C 的命名空間
命名空間是用來組織和重用 的編譯單元。namespace 名字空間 是為了解決命名衝突的問題而引入的概念。通過使用 namespace 就是 使用的範圍 你所使用的庫函式或變數就是在該名字空間中定義的,這樣一來就不會引起不必要的衝突了。c 標準程式庫中的所有識別符號都被定義於乙個名為std stan...
詳細解讀php的命名空間(一)
php的命名空間功能已經出來很久了,但是一直以來沒怎麼深究過,這次趕著有時間所以特意翻著手冊做乙個整理和總結幫助自己完善完善,原本準備一篇寫完,但發現內容其實還是蠻多的,放一起太長看著累,所以分兩篇部落格要好些。一 命名空間概念 命名空間是一種封裝事物的方法,類似於目錄和檔案。命名空間解決的問題 手...
php 命名空間,PHP使用命名空間
介紹 命名空間中的類,函式或常量可以通過以下方式使用 在當前命名空間中使用類 指定相對於當前命名空間的命名空間 提供命名空間的全限定名稱 從當前命名空間 在此示例中,從test1.php載入了命名空間。沒有命名空間引用的函式或類名稱將訪問當前命名空間中的功能或類名稱 示例 test1.php nam...