命名空間 和 TP框架extend的使用

2022-04-28 07:44:21 字數 3065 閱讀 5093

(下面使用 函式,來表示需要從別的檔案中引入的東西。當然,也可以是類、常量等)

在乙個檔案中要使用別的檔案,需要使用require_once,import等方式,相當於把其他檔案的內容複製到當前檔案中,就能夠使用別的檔案的類,方法,常量等資料。達到偷懶的目的,也能使得檔案結構更加合理。通過這種方法,我們就能夠把別人的輪子一股腦的匯入到自己的檔案中。

但是一直require進來,會導致各種檔案的函式起衝突,畢竟好的函式名,大同小異。如何解決命名衝突呢?答案就是使用命名空間。

命名空間相當於是將乙個大房子(全域性命名空間),分成乙個個的小房間。如果在我一股腦的將所有檔案require進來後,我想使用哪個函式,就把命名空間加在前面,使用命名空間 + 函式名。這樣就解決了函式名衝突的問題了,只要保證乙個小房間裡不會存在相同的函式名就ok了,**變得更加簡單了。

namespace的主要優勢:

第一,可以更好的管理**

第二,檔案一多,可以避免class,function的重名

第三,**可讀性增強了

又出現乙個問題,因為命名空間是可以巢狀的,隨著專案越來越大,命名空間層次比較深,可能乙個函式要加上很長的命名空間字首,我又懶得寫,怎麼辦?

解決方法:使用use關鍵字。use其實就是為了讓我們偷懶,少些長長的命名空間

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裡面還找不到,就報錯,實在是找不到了。

到此為止,如果想要使用別人寫好的lib,需要完成兩步操作:

將該檔案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內建的類庫,或者第三方沒有使用命名空間的類庫,在這裡插入 片 特別注意的是,如果你需要呼叫...