PHP從手動匯入到自動載入

2021-10-06 14:18:43 字數 2215 閱讀 7842

在php開發過程中,如果希望從外部引入乙個 class,通常會使用 include 和 require 方法,去把定義這個 class 的檔案包含進來。這個在小規模開發的時候,沒什麼大問題。但在大型的開發專案中,使用這種方式會帶來一些隱含的問題:如果乙個 php 檔案需要使用很多其它類,那麼就需要很多的require/include語句,這樣有可能會造成遺漏或者包含進不必要的類檔案。如果大量的檔案都需要使用其它的類,那麼要保證每個檔案都包含正確的類檔案肯定是乙個噩夢, 況且 require_once 的代價很大。

php5為這個問題提供了乙個解決方案,這就是類的自動裝載 (autoload) 機制。autoload 機制可以使得 php 程式有可能在使用類時才自動包含類檔案,而不是一開始就將所有的類檔案 include 進來,這種機制也稱為lazy loading(懶載入)

總結起來,自動載入功能帶來了幾處優點:

通常 php5 在使用乙個類時,如果發現這個類沒有載入,就會自動執行 __autoload() 函式,這個函式是我們在程式中自定義的,在這個函式中我們可以載入需要使用的類。下面是個簡單的示例:

function

__autoload

($classname

)

在我們這個簡單的例子中,我們直接將類名加上副檔名 」.php」 構成了類檔名,然後使用 require_once 將其載入。從這個例子中,我們可以看出 autoload 至少要做三件事情:

根據類名確定類檔名;

確定類檔案所在的磁碟路徑(在我們的例子是最簡單的情況,類與呼叫它們的php程式檔案在同乙個資料夾下);

將類從磁碟檔案中載入到系統中。

第三步最簡單,只需要使用 include/require 即可。要實現第一步,第二步的功能,必須在開發時約定類名與磁碟檔案的對映方法,只有這樣我們才能根據類名找到它對應的磁碟檔案。

當有大量的類檔案要包含的時候,我們只要確定相應的規則,然後在 __autoload() 函式中,將類名與實際的磁碟檔案對應起來,就可以實現 lazy loading 的效果。從這裡我們也可以看出 __autoload() 函式的實現中最重要的是類名與實際的磁碟檔案對映規則的實現。

如果在乙個系統的實現中,如果需要使用很多其它的類庫,這些類庫可能是由不同的開發人員編寫的,其類名與實際的磁碟檔案的對映規則不盡相同。這時如果要實現類庫檔案的自動載入,就必須在 __autoload() 函式中將所有的對映規則全部實現,這樣的話 __autoload() 函式有可能會非常複雜,甚至無法實現。最後可能會導致 __autoload() 函式十分臃腫,這時即便能夠實現,也會給將來的維護和系統效率帶來很大的負面影響。

那麼問題出現在**呢?問題出現在 __autoload() 是全域性函式只能定義一次,不夠靈活,所以所有的類名與檔名對應的邏輯規則都要在乙個函式裡面實現,造成這個函式的臃腫。那麼如何來解決這個問題呢?答案就是使用乙個 __autoload 呼叫堆疊,不同的對映關係寫到不同的 __autoload 函式中去,然後統一註冊統一管理,這個就是 php5 引入的 spl autoload。

spl是 standard php library (標準php庫)的縮寫。它是 php5 引入的乙個擴充套件庫,其主要功能包括 autoload 機制的實現及包括各種 iterator 介面或類。spl autoload 具體有幾個函式:

簡單來說,spl_autoload 就是 spl 自己的定義 __autoload() 函式,功能很簡單,就是去註冊的目錄(由 set_include_path 設定)找與 $classname 同名的 .php/.inc 檔案。當然,你也可以指定特定型別的檔案,方法是註冊副檔名 (spl_autoload_extionsions)。

而 spl_autoload_register() 就是我們上面所說的 autoload 呼叫堆疊,我們可以向這個函式註冊多個我們自己的 __autoload() 函式,當 php 找不到類名時,php 就會呼叫這個堆疊,乙個乙個去呼叫自定義的 __autoload() 函式,實現自動載入功能。如果我們不向這個函式輸入任何引數,那麼就會註冊 spl_autoload() 函式。

php 自動載入的底層就是這些,註冊機制已經非常靈活,但是還缺什麼呢?我們上面說過,自動載入關鍵就是類名和檔案的對映,這種對映關係不同框架有不同方法,非常靈活,但是過於靈活就會顯得雜亂,php 有專門對這種對映關係的規範,那就是 psr 標準中 psr0 與 psr4。

PHP寫的從資料庫匯入到EXCEL

原理 就是原理很分頁原理一樣 選取一定數量的資料然後變成陣列,接著直接寫入檔案。接下來繼續選取後面沒選定資料在變成陣列,接著在寫入檔案!這個解決了記憶體溢位。但是多cpu還是有個考驗!由於本人剛剛學php php培訓 php教程 不久,功力不深厚!只能寫出這樣的東西!原始碼!excel類 php c...

sqoop從mysql匯入到hive常見問題

mysql中的資料,表中列出了資料匯入過程中的 髒 資料 t,n,r,null,下面列出了解決思路 id 2 這裡的des 裡面有1個換行符實際為 1234 567id 3 desc有乙個 t 實際為1234 567 id 4 desc is null 如果直接通過一般的sqoop匯入語句 匯入後的...

將資料從hbase匯入到hive

選定test0721表 hbase main 001 0 list table system.catalog system.function system.log system.mutex system.sequence system.stats test0721 7row s in 0.1500 ...