自動載入主要是省去了一個個類去 include 的繁瑣,在 new 時動態的去檢查並 include 相應的 class 文件。php
先上代碼:緩存
//index.php <?php class ClassAutoloader { public static function loader($className) { $file = $className . ".class.php"; if(is_file($file)) { echo 'Trying to load ', $className, ' via ', __METHOD__, "()\n"; require_once( $file ); } else { echo 'File ', $file, " is not found!\n"; } } public static function register($autoLoader = '') { spl_autoload_register($autoLoader ?: array('ClassAutoloader', 'loader'), true, true); } } ClassAutoloader::register(); $obj = new printit(); $obj->doPrint(); ?>
而後是類文件:框架
//printit.class.php <?php class PRINTIT { function doPrint() { echo "Hello, it's PRINTIT! \n"; } } ?>
實驗結果:ui
$ php index.php Try to load printit via ClassAutoloader::loader() Hello, it's PRINTIT!
上面的代碼中,咱們在另一個文件 printit.class.php 中定義的 printit 類。可是,咱們並無在 index.php 中顯性的 include 這個庫文件。而後,由於咱們有註冊了自動加載方法,因此,咱們在 new 這個類時,咱們的自動加載方法就會按事先定義好的規則去找到類文件,並 include 這個文件。spa
這也是 ThinkPHP5.1 中 Loader 的基本原理。不過,ThinkPHP 框架中,另外還增長了使用 Psr0、Psr4 規則來查找類文件,以及 Composer 的自動加載。code
PS,在官方文檔的評論中,看到這樣的神級代碼:blog
<?php spl_autoload_extensions(".php"); // comma-separated list spl_autoload_register(); ?>
讓 PHP 本身去尋找文件,聽說要比上面指定文件名要快得多。內存
該評論中舉例,1000 classes (10個文件夾,每一個有 10個子文件夾,每一個文件夾有 10 個類)時候,上面指定文件名的方式耗時 50ms,而這兩句代碼只花了 10ms。文檔
不過我猜,第一句讓 PHP 已經作了緩存,因此,這種方式應該是拿內存換了速度。it