php 自動加載機制

歸納一下php加載文件3種方式:
1、include,include_once,requice,requice_one常規加載
2、__autoload()
3、spl_autoload_register()

  1. 最常規的加載方法,在小項目小代碼裏使用的是 4個常用函數 include, include_once,require, require_once,他們之間的區別是
    ~incluce在用到時加載
    ~require在一開始就加載
    ~_once後綴表示已加載的不加載
    此外,include要包括的文件找不到時會給一個警告,require會報一個嚴重的錯誤,要求較高的可以採用require。
//No.1
require('config.php');
require('login.php');
$a = new config();
  1. 引入__autoload的魔術方法進行加載,引入的原因是單項目較大,文件較多的時候如果採用require一個一個包含的話,耗費時間又使得代碼冗長。使用autoload在new對象時會按照魔術方法中的規則自動加載。
//N0.2
function __autoload($class)
{
    $file = $class . '.php';
    if (is_file($file)) {
        require_once($file);
    }
}
$a = new config();
$b = new login();
  1. 在大型系統的開發中,如果需要使用很多其它的類庫,這些類庫可能是由不同的開發人員編寫的,其類名與實際的磁盤文件的映射規則不盡相同。這時如果要實現類庫文件的自動加載,就必須在__autoload()函數中將所有的映射規則全部實現,這樣的話__autoload()函數有可能 會非常複雜,甚至無法實現。
    spl_autoload_register() 滿足了此類需求。 它實際上創建了 autoload 函數的隊列,按定義時的順序逐個執行。相比之下, __autoload() 只可以定義一次。
//No.3
function loader($class)
{
    $file = $class . '.php';
    if (is_file($file)) {
        require_once($file);
    }
}
spl_autoload_register('loader');
$a = new config();
$b = new login();

//No.4
class Loader{
    public static function loadClass($class) {
        $file = $class . '.php';
        if(is_file($file)) {
            require_once($file);
        }
    }
}
spl_autoload_register(array('Loader', 'loadClass'));
$a = new config();
$b = new login();

此外根據php.net 給出的意見
php5.0 之後開始採用__autoload來自動加載類,但在使用過程中發現__autoload 函數拋出的異常不能被 catch 語句塊捕獲並會導致一個致命錯誤。(5.3.0之前的版本)所以建議採用spl_autoload_register

//N0.2 自動加載在 PHP 5.3.0+ 中的異常處理
/**
 * 在 5.3.0 版之前,__autoload 函數拋出的異常不能被 catch 語句塊捕獲並會導致一個致命錯誤。
 * 從 5.3.0+ 之後,__autoload 函數拋出的異常可以被 catch 語句塊捕獲,但需要遵循一個條件。
 * 如果拋出的是一個自定義異常,那麼必須存在相應的自定義異常類。
 * __autoload 函數可以遞歸的自動加載自定義異常類。
 **/
function __autoload($class)
{
    $file = $class . '.php';
    if (is_file($file)) {
        require_once($file);
    }else{
//        echo "Want to load $class.\n";
//        throw new Exception("Unable to load $class.");
//        / **
//         * 5.3版本不支持自定義異常類,只能這樣處理
          echo "Want to load $class.\n";
 throw new MissingException("Unable to load $class.");
//         */
    }
}
try {
    $obj = new test();
} catch (Exception $e) {
    echo $e->getMessage(), "\n";
}
發佈了54 篇原創文章 · 獲贊 32 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章