Auto-load(自動載入) 是在 PHP 5 有物件導向後,一個很貼棒的機制,透過這個讓我們簡化引入的物件指令。這樣說明有些籠統,直接舉個例子來說。
PHP 的 autoload
假設我們建立了好幾種不同車款的物件類別,若是哪天我們要來寫個汽車大展,在以往的寫法可能光是程式一開頭就要先寫上十幾廿行以上的引入指令(include、include_once、require、require_once),才不會在接下來的程式碼建立物件時發生錯誤,但有了 __autoload 函式,我們在一開始時只要這麼寫
1 2 3 |
function __autoload($class){ include $class . '.php'; } |
之後再宣告某個類別時,如
1 |
$popCar = new Car(); |
雖然在先前沒有引入任何跟 Car 類別相關,但因為我們在一開始已經召喚了 __autoload 這個守護靈在身旁,當程式被編譯到這行時,這位守護靈就會主動地為我們做防護性的引入動作啦!其實這個動作,就是現在常聽到的 Lazyload,中文翻譯成 “延遲載入” ,即當我們需要該物件時,系統才會為我們將之引入定義,這樣做可以有效降低系統資源的消耗。
若是要謹慎一點,我們還可以為之加上一層 “AT 力場” 防護之,
1 2 3 4 5 6 7 |
function __autoload($class){ if(file_exists($class . '.php')){ require_once($class . '.php'); } else { throw new Exception("找不到 {$class} 這個物件檔案,無法載入!"); } } |
沒錯,就是再追加判斷該檔案是否存在。
不過,原生的 __autoload 的效能實在是出了名的差勁,所以在 PHP 5.1.2 中,SPL (Standard PHP Library) 加入了一個改良的函式 spl_autoload,但由於各開源資源幾乎都也制定了自己的自動載入方法,而導致過渡混亂。因為在 2009 年中,由一些開發者創立了一個名為 PHP Standards Group 的團隊,開始統一些共同採用的撰寫 PHP 的編碼風格建議標準,該團隊現名為 PHP Framework Interop Group,而 PHP 官方亦在其 RFC(Request For Comments) – SplClassLoader 中採納了這樣建議,而重新制定出 SplClassLoader。
接下來將為大家再兩篇跟 autoload 相關的內容
- PHP-FIG 所制定的建議規範:PSR-0 Autoloading Standard
- Laravel 的 Autoload 機制