您好,登錄后才能下訂單哦!
1.定義命名空間
命名空間只作用于類,函數,常量。(注意只能是const的常量,而不能是define出來的常量,我測試是報錯的。)
通過namespace 聲明。
必須在所有代碼之前聲明。
2.定義子命名空間
可以多用層,這樣可以理出一個層級結構來,比如LIBRARY里有幾個不同類型的庫,有層次才顯得更清晰。(ACTION\INDEX)
3.在同一文件定義多個命名空間
用大括號括起來,但不推薦
如:
<?php
namespace a{func1,class2,const3}
namespace b{xxx}
?>
多個命名空間和執行代碼放在一起需要這么干
<?php
namespace a{func1,class2,const3}
namespace b{xxx}
namespace{
\a\func1();
}
?>
4.使用基礎
注意:命名空間的使用有點類似于HTML里URL的規則
如
<?php
namespace a\a1;
function d(){}
d(); //a\a1\d()
\a\a1\d(); //\a\a1\d();
一個相對路徑,一個絕對路徑。
?>
注意:如果你想在一個命名空間內訪問全局變量或全局方法或全局類,可以加上\
如
<?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
?>
提示:如果要實例化一個字符串形式的類名(包含命名空間),那就最好用單引號將字符串引起來。如 $a = new ‘\namespace\classname’;
5.namespace關鍵字和__NAMESPACE__常量
__NAMESPACE__在全局是一個空字符串
__NAMESPACE__在動態創建變量時非常有用。
比如
<?php
namespace abc;
function get($classname)
{
return new __NAMESPACE__.'\\'.$classname;
}
?>
__NAMESPACE__在類里也可以用這樣動態創建變量什么的,有點類似于self的功能
而namespace 可以當作當前命名空間名稱來動態使用,如:
<?php
namespace A;
const name = 'jason';
echo namespace\name; // print out jason;
?>
如果在全局中使用的話
<?php
$a = new namespace\c; //這里實際上只有c; 而會忽略namespace 因為它是空的。
?>
6.別名和use的使用
<?php
namespace foo;
use My\Full\Classname as Another;
// 下面的例子與 use My\Full\NSname as NSname 相同
use My\Full\NSname;
// 導入一個全局類
use \ArrayObject;
$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 對象
?>
<?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
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 實例化一個 My\Full\Classname 對象
$a = 'Another';
$obj = new $a; // 實際化一個 Another 對象
?>
注意:別名不能用變量來代替,如:
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 實例化一個 My\Full\Classname 對象
$a = 'Another';
$obj = new $a; // 實際化一個 Another 對象
?>
7.全局空間
如果在沒有命名空間的腳本里寫東西,默認就是全局的,如果非要加個特征碼或在命名空間調用全局空間里的類,常量和函數的話,前面加個\即可。
8.使用命名空間時,優先級
<?php
namespace A\B\C;
class Exception extends \Exception {} //完全限定全局類\Exception
?>
注意:在命名空間里,用全局和本身的函數 類和常量時,需要特別小心它是屬于哪里的,是全局的還是該命名空間里的,所以:
在命名空間作用域里,用全局的類 常量和函數時,都最好要加上完全限定名稱的符號\ 如\fopen,\substr 總覺得怪怪的啊。
注意:在一個已有命名空間的腳本里,直接輸寫無命名空間符號的函數或者常量或者類,它的查找順序為:
1、先在本命名空間中找該函數,常量或類
2、找不到的時候再在全局里找。
<?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"
?>
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。