(下面使用 函式,來表示需要從別的檔案中引入的東西。當然,也可以是類、常量等)
在乙個檔案中要使用別的檔案,需要使用require_once,import等方式,相當於把其他檔案的內容複製到當前檔案中,就能夠使用別的檔案的類,方法,常量等資料。達到偷懶的目的,也能使得檔案結構更加合理。通過這種方法,我們就能夠把別人的輪子一股腦的匯入到自己的檔案中。
但是一直require進來,會導致各種檔案的函式起衝突,畢竟好的函式名,大同小異。如何解決命名衝突呢?答案就是使用命名空間。
命名空間相當於是將乙個大房子(全域性命名空間),分成乙個個的小房間。如果在我一股腦的將所有檔案require進來後,我想使用哪個函式,就把命名空間加在前面,使用命名空間 + 函式名。這樣就解決了函式名衝突的問題了,只要保證乙個小房間裡不會存在相同的函式名就ok了,**變得更加簡單了。
namespace的主要優勢:又出現乙個問題,因為命名空間是可以巢狀的,隨著專案越來越大,命名空間層次比較深,可能乙個函式要加上很長的命名空間字首,我又懶得寫,怎麼辦?第一,可以更好的管理**
第二,檔案一多,可以避免class,function的重名
第三,**可讀性增強了
解決方法:使用use關鍵字。use其實就是為了讓我們偷懶,少些長長的命名空間到此為止,如果想要使用別人寫好的lib,需要完成兩步操作:use的作用:
簡化命名空間:
<?php
use name1\name2\name3;
echo name3\func(); //因為上面使用了use關鍵字,下面只要寫最後乙個命名空間就ok
別名
<?php
use name1\name2\name3 as goodname;
echo goodname\func(); //取個好名字,便於理解
引入類(只能對類使用)
<?php
use name1\class1;
echo class1::func(); //因為上面使用了use,此處直接就不需要寫命名空間字首了
總結:在**執行時,遇到了不完整的命名空間(編譯器他娘的找不到),他想想人類是會偷懶的,於是就會往上看,看看有沒有使用use,偷懶了。如果在use裡面還找不到,就報錯,實在是找不到了。
將該檔案require進來
指定命名空間來使用函式,防止函式名衝突(可以使用use偷偷懶)
命名空間詳情及使用:
但是人是懶惰的(雖然有了use可以省去長長的命名空間),每次都要使用require檔案,我很煩。於是在一些框架中如(tp)中,就支援根據namespace自動引入該檔案。當你要使用某個函式時,就會按照一定的規則,從命名空間中解析出檔案路徑,在自動的require進來。貼心小棉襖。
這個規則叫做psr-4
的自動載入規範 :部落格
extend下的檔案,會在請求中被被載入。
如果extend中放置的是乙個類,而且是乙個檔案乙個類,類名與檔名相同。
注意點:在tp中命名空間最前面要加上「\」,表示我這個是根命名空間的東西,因為控制器都是在乙個命名空間之下的,類似於使用絕對路徑。
<?php
//檔案為 extend/my/func/func.php
namespace my\func;
class func
}---
//在其他地方直接使用命名空間匯入即可
return \my\func\func.php
因為他自動載入的規則就是:
按照命名空間,去找載入指定檔案如何改造呢?例如我引入的檔案是個方法包檔案,裡面都是各種各樣的方法例如 \my\func\func::demo();,就會去載入extend/my/func/func.php,然後裡面取出裡面的func類出來。
也就是說,類名一定要和檔名一致,且不能使用該資料夾下的其他東西,如其他類就用不到了
在控制器中手動引入檔案。既然框架無法自動載入,我就手動require在index.php入口檔案中,定義常量
define("extend_dir","../extend/");
在想要的地方require
require_once extend_dir."my/func/func.php";
既然已經引入了,那就放心大膽的使用
return \my\func\demo(); //使用其中乙個方法
缺陷:如果使用相對路徑,專案的相對路徑是基於index.php入口檔案的,最好使用絕對路徑
有了上面的基礎,可以知道,如果要使用第三方的類,我們需要手動require檔案+定義命名空間
使用方法:
聚通專案中使用到的:所有的依賴檔案都放到乙個檔案中pay.php,在裡面定義 class pay 在其中編寫方法呼叫sdk中的檔案(雖然說我不能使用除了與檔案同名的類之外的東西,但是類裡面可以呼叫啊),這樣就不存在sdk檔案間的引用路徑問題。最終在**中直接使用 \pay就可以
將所有require路徑改為絕對路徑,並將檔名改為和類名相同。並最終加上命名空間。
require_once(dirname(__file__)."/../weixin/lib/wxpay.api.php");
require_once(dirname(__file__)."/../weixin/example/wxpay.nativepay.php");
require_once(dirname(__file__)."/../weixin/example/wxpay.jsapipay.php");
但是感覺比較官方的做法是,自己建立類,繼承sdk中所需要的類,完成業務。
TP框架中命名空間
3.2版本全面採用命名空間方式定義和載入類庫檔案,有效的解決多個模組之間的衝突問題,並且實現了更加高效的類庫自動載入機制。命名空間的概念必須了解,否則會成為3.2版本開發的重大障礙。如果不清楚什麼是命名空間,可以參考php手冊 php命名空間 由於新版完全採用了命名空間的特性,因此只需要給類庫正確定...
tp框架中的命名空間
首先是我對命名空間的理解,命名空間相當於乙個空間,拿班級做比方,不同的班級就是不同的空間,每個班級都有叫小明的同學,但是不會因為有兩個小明而產生矛盾。這就是命名空間的作用 同乙個請求裡面,相同函式,類名,常亮不能出現多次 function chat echo demo changliang 訪問元素...
TP 空間命名
命名空間 thinkphp5 採用命名空間方式定義和自動載入類庫檔案,有效的解決了多模組和 composer 類庫之間的命名空間衝突問題,並且實現了更加高效的類庫自動載入機制。特別注意的是,如果你需要呼叫php內建的類庫,或者第三方沒有使用命名空間的類庫,在這裡插入 片 特別注意的是,如果你需要呼叫...