1.定義命名空間
創(chuàng)新互聯(lián)建站專注于皇姑網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供皇姑營銷型網(wǎng)站建設(shè),皇姑網(wǎng)站制作、皇姑網(wǎng)頁設(shè)計、皇姑網(wǎng)站官網(wǎng)定制、微信平臺小程序開發(fā)服務(wù),打造皇姑網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供皇姑網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
命名空間只作用于類,函數(shù),常量。(注意只能是const的常量,而不能是define出來的常量,我測試是報錯的。)
通過namespace 聲明。
必須在所有代碼之前聲明。
2.定義子命名空間
可以多用層,這樣可以理出一個層級結(jié)構(gòu)來,比如LIBRARY里有幾個不同類型的庫,有層次才顯得更清晰。(ACTION\INDEX)
3.在同一文件定義多個命名空間
用大括號括起來,但不推薦
如:
<?php
namespace a{func1,class2,const3}
namespace b{xxx}
?>
多個命名空間和執(zhí)行代碼放在一起需要這么干
<?php
namespace a{func1,class2,const3}
namespace b{xxx}
namespace{
\a\func1();
}
?>
4.使用基礎(chǔ)
注意:命名空間的使用有點類似于HTML里URL的規(guī)則
如
<?php
namespace a\a1;
function d(){}
d(); //a\a1\d()
\a\a1\d(); //\a\a1\d();
一個相對路徑,一個絕對路徑。
?>
注意:如果你想在一個命名空間內(nèi)訪問全局變量或全局方法或全局類,可以加上\
如
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // 調(diào)用全局函數(shù)strlen
$b = \INI_ALL; // 訪問全局常量 INI_ALL
$c = new \Exception('error'); // 實例化全局類 Exception
?>
提示:如果要實例化一個字符串形式的類名(包含命名空間),那就最好用單引號將字符串引起來。如 $a = new ‘\namespace\classname’;
5.namespace關(guān)鍵字和__NAMESPACE__常量
__NAMESPACE__在全局是一個空字符串
__NAMESPACE__在動態(tài)創(chuàng)建變量時非常有用。
比如
<?php
namespace abc;
function get($classname)
{
return new __NAMESPACE__.'\\'.$classname;
}
?>
__NAMESPACE__在類里也可以用這樣動態(tài)創(chuàng)建變量什么的,有點類似于self的功能
而namespace 可以當(dāng)作當(dāng)前命名空間名稱來動態(tài)使用,如:
<?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;
// 導(dǎo)入一個全局類
use \ArrayObject;
$obj = new namespace\Another; // 實例化 foo\Another 對象
$obj = new Another; // 實例化 My\Full\Classname 對象
NSname\subns\func(); // 調(diào)用函數(shù) 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(); // 調(diào)用函數(shù) 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.全局空間
如果在沒有命名空間的腳本里寫東西,默認就是全局的,如果非要加個特征碼或在命名空間調(diào)用全局空間里的類,常量和函數(shù)的話,前面加個\即可。
8.使用命名空間時,優(yōu)先級
<?php
namespace A\B\C;
class Exception extends \Exception {} //完全限定全局類\Exception
?>
注意:在命名空間里,用全局和本身的函數(shù) 類和常量時,需要特別小心它是屬于哪里的,是全局的還是該命名空間里的,所以:
在命名空間作用域里,用全局的類 常量和函數(shù)時,都最好要加上完全限定名稱的符號\ 如\fopen,\substr 總覺得怪怪的啊。
注意:在一個已有命名空間的腳本里,直接輸寫無命名空間符號的函數(shù)或者常量或者類,它的查找順序為:
1、先在本命名空間中找該函數(shù),常量或類
2、找不到的時候再在全局里找。
<?php
namespace A;
use B\D, C\E as F;
// 函數(shù)調(diào)用
foo(); // 首先嘗試調(diào)用定義在命名空間"A"中的函數(shù)foo()
// 再嘗試調(diào)用全局函數(shù) "foo"
\foo(); // 調(diào)用全局空間函數(shù) "foo"
my\foo(); // 調(diào)用定義在命名空間"A\my"中函數(shù) "foo"
F(); // 首先嘗試調(diào)用定義在命名空間"A"中的函數(shù) "F"
// 再嘗試調(diào)用全局函數(shù) "F"
// 類引用
new B(); // 創(chuàng)建命名空間 "A" 中定義的類 "B" 的一個對象
// 如果未找到,則嘗試自動裝載類 "A\B"
new D(); // 使用導(dǎo)入規(guī)則,創(chuàng)建命名空間 "B" 中定義的類 "D" 的一個對象
// 如果未找到,則嘗試自動裝載類 "B\D"
new F(); // 使用導(dǎo)入規(guī)則,創(chuàng)建命名空間 "C" 中定義的類 "E" 的一個對象
// 如果未找到,則嘗試自動裝載類 "C\E"
new \B(); // 創(chuàng)建定義在全局空間中的類 "B" 的一個對象
// 如果未發(fā)現(xiàn),則嘗試自動裝載類 "B"
new \D(); // 創(chuàng)建定義在全局空間中的類 "D" 的一個對象
// 如果未發(fā)現(xiàn),則嘗試自動裝載類 "D"
new \F(); // 創(chuàng)建定義在全局空間中的類 "F" 的一個對象
// 如果未發(fā)現(xiàn),則嘗試自動裝載類 "F"
// 調(diào)用另一個命名空間中的靜態(tài)方法或命名空間函數(shù)
B\foo(); // 調(diào)用命名空間 "A\B" 中函數(shù) "foo"
B::foo(); // 調(diào)用命名空間 "A" 中定義的類 "B" 的 "foo" 方法
// 如果未找到類 "A\B" ,則嘗試自動裝載類 "A\B"
D::foo(); // 使用導(dǎo)入規(guī)則,調(diào)用命名空間 "B" 中定義的類 "D" 的 "foo" 方法
// 如果類 "B\D" 未找到,則嘗試自動裝載類 "B\D"
\B\foo(); // 調(diào)用命名空間 "B" 中的函數(shù) "foo"
\B::foo(); // 調(diào)用全局空間中的類 "B" 的 "foo" 方法
// 如果類 "B" 未找到,則嘗試自動裝載類 "B"
// 當(dāng)前命名空間中的靜態(tài)方法或函數(shù)
A\B::foo(); // 調(diào)用命名空間 "A\A" 中定義的類 "B" 的 "foo" 方法
// 如果類 "A\A\B" 未找到,則嘗試自動裝載類 "A\A\B"
\A\B::foo(); // 調(diào)用命名空間 "A\B" 中定義的類 "B" 的 "foo" 方法
// 如果類 "A\B" 未找到,則嘗試自動裝載類 "A\B"
?>
網(wǎng)頁標(biāo)題:復(fù)習(xí)PHP-語言參考-命名空間
標(biāo)題網(wǎng)址:http://aaarwkj.com/article2/jesgoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、品牌網(wǎng)站制作、微信公眾號、網(wǎng)站策劃、營銷型網(wǎng)站建設(shè)、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)