命名空間:namespace 有名稱的空間
namespace 需要寫在腳本的頂部,必須是php的第一條指令(除了declare指令)
全局成員: 常量,函數(shù),類(接口),默認聲明在全局空間中的
優(yōu)點:全局調(diào)用
缺點:不能重復(fù)命名
php5.3以后引入C# Java中應(yīng)用成熟的命名空間
use 在命名空間中的作用/導(dǎo)入命名空間
use app\admin\controller as app;
引入別的命名空間到當前空間 為命名空間起別名
引入別的命名空間中的類到當前空間使用, 為別的命名空間中的類起別名
在第二個命名空間中找不到第一個命名空間里面的類,如果我們要進行訪問則要用\斜桿進行指定空間查找,可以理解為路徑查找
在two空間中訪問one空間里的類, 應(yīng)該使用”\”表示root空間(全局空間)
<?php/** * namespace 需要寫在腳本的頂部,必須是php的第一條指令(除了declare指令) * * namespace ns1; * namespace ns1{ * } *///第一個命名空間namespace one{ class index { public function Show() { return "這是one空間中的".__METHOD__."方法"; } }}//第二個命名空間namespace one2{ echo (new \one\index)->Show();}
如果存在同一個類和同一個方法但是命名空間不同,在哪個空間中調(diào)用的語句,優(yōu)先級就是實例這個空間中的方法和類
如果想要訪問別的空間,需要用\找到另外空間的成員
<?php/** * namespace 需要寫在腳本的頂部,必須是php的第一條指令(除了declare指令) * * namespace ns1; * namespace ns1{ * } *///第一個命名空間namespace one{ class index { public function Show() { return "這是one空間中的".__METHOD__."方法"; } } //查看類的完全限定名稱 echo index::class;}//第二個命名空間namespace one2{ class index { public function Show() { return "這是one2空間中的".__METHOD__."方法"; } } /* *如果存在同一個類和同一個方法但是命名空間不同, *在哪個空間中調(diào)用的語句,優(yōu)先級就是實例這個空間中的方法和類 */ echo ( new index)->Show(); echo "<br>"; echo index::class; echo "<hr>"; /* *如果想要訪問別的空間,需要用\找到另外空間的成員 */ echo (new \one\index)->Show(); echo "<br>";}
假如在命名空間中,定義一個類方法,這個類方法和系統(tǒng)函數(shù)重名,那調(diào)用這個函數(shù),會出現(xiàn)什么結(jié)果?
在命名空間中如果有一個函數(shù)和系統(tǒng)函數(shù)重名,我們?nèi)フ{(diào)用這個函數(shù)的話會優(yōu)先調(diào)用自定義函數(shù),而不是系統(tǒng)函數(shù),因為系統(tǒng)函數(shù)是全局函數(shù),要在根空間中查找
在子空間中加入\斜桿來查找根空間中的系統(tǒng)函數(shù),如果子空間未定義這個系統(tǒng)函數(shù),系統(tǒng)會默認調(diào)用根空間中的系統(tǒng)函數(shù)
<?php/** * namespace 需要寫在腳本的頂部,必須是php的第一條指令(除了declare指令) * * namespace ns1; * namespace ns1{ * } */namespace one{class User{ /* *假如在命名空間中,定義一個類方法 *這個類方法和系統(tǒng)函數(shù)重名,那調(diào)用這個函數(shù) *會出現(xiàn)什么結(jié)果? */ //列如定義一個var_dump 和md5 public function var_dump() { return "你調(diào)用的是我".__METHOD__; } public function md5() { return "你調(diào)用的是我".__METHOD__; }} //調(diào)用類中var_dump echo (new User)->var_dump(); echo "<hr>"; //調(diào)用類中md5 echo (new User)->md5(); echo "<hr>"; //調(diào)用根空間函數(shù) echo \md5("222");}
Use在命名空間中的作用
引入別的命名空間到當前空間 為命名空間起別名
引入別的命名空間中的類到當前空間使用, 為別的命名空間中的類起別名
use 導(dǎo)入命名空間
成功導(dǎo)入命名空間以后 就可以不使用類的完全限定名稱調(diào)用類元素
use 為導(dǎo)入的空間取別名
as關(guān)鍵字可以給導(dǎo)入的空間取別名,防止導(dǎo)入的空間名稱一樣
use 也可以導(dǎo)入空間中的類
use也可以直接導(dǎo)入空間中想要的類名稱
<?php/* * use 在命名空間中的作用 * 1. 引入別的命名空間到當前空間 為命名空間起別名 * 2. 引入別的命名空間中的類到當前空間使用, 為別的命名空間中的類起別名 */ //定義一個命名空間 namespace app\admin\index { //輸出一個工作類 class demo4 { public function Show() { return "輸出當前的空間方法:".__METHOD__; } } } //用use 把另外一個命名空間引入到這個命名空間namespace app\admin\connect{ //1. use 導(dǎo)入命名空間 use app\admin\index; // 成功導(dǎo)入命名空間以后 就可以不使用類的完全限定名稱調(diào)用類元素 echo (new index\demo4)->Show(),'<hr>'; //2. use 為導(dǎo)入的空間取別名 use app\admin\index as one ; echo (new one\demo4)->Show(),'<hr>'; //3. use 也可以導(dǎo)入空間中的類 use app\admin\index\demo4 ; echo (new demo4)->Show(),'<hr>';}
<?php/**類的自動加載*spl_autoload_register — 注冊給定的函數(shù)作為 __autoload 的實現(xiàn)*/spl_autoload_register(function($className){ //先檢查當前要加載的類 printf("類名稱:%s<br>",$className); //----------------------------- /* *str_replace — 子字符串替換 *用DIRECTORY_SEPARATOR,自動識別當前系統(tǒng)文件分隔符 *解決在不同環(huán)境中的文件引用不同 */ $file = str_replace('\\',DIRECTORY_SEPARATOR,$className).".php"; echo $file; /* * 判斷此文件是否正常和是否為空,如果正常就返回 * is_file — 判斷給定文件名是否為一個正常的文件 * file_exists — 檢查文件或目錄是否存在 */ if( !(is_file($file) && file_exists($file)) ) throw new \Exception('文件名不合法或者文件不存在'); require $file;});
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號