PHP類的自動載入程式碼

來源:互聯網
上載者:User


加入我們現在有兩個PHP檔案,內容如下:

Test1.php

<?phpclass Test1 {    public function func1() {        return 'test1';    }}?>

Test2.php

<?phpclass Test2 {    public function func2() {        return 'test2';    }}?>

然而在需要載入這兩個檔案時,傳統的寫法是這樣的:

<?phprequire ('Test1.php');require ('Test2.php');$TestObj1 = new Test1();$TestObj2 = new Test2();echo $TestObj1->func1().'<br/>';echo $TestObj2->func2();?>

現在我們使用PHP類的自動載入,只需要定義 __autoload() 方法既可將類自動載入,方法如下:

<?php//define autoload functionfunction __autoload($class) {    require __DIR__.'/'.$class.'.php';}$TestObj1 = new Test1();$TestObj2 = new Test2();echo $TestObj1->func1().'<br/>';echo $TestObj2->func2();?>

很方便吧,可是之後__autoload這個函數被廢棄掉了,主要原因是因為,我們一個PHP的項目可能會依賴多個架構,如果我們每一個架構都擁有這個函數,那麼程式就會報一個函數重複定義的致命錯誤。當然不用擔心,在PHP5.3之後呢,官方提供了一個 spl_autoload_register() 函數來取代 __autoload,這個函數的特點是它允許你存在多個相同的載入函數,即使我寫了多個載入,也不會出現任何問題,代碼如下:

<?phpspl_autoload_register(autoload1);spl_autoload_register(autoload2);//define autoload functionfunction autoload1($class) {    require __DIR__.'/'.$class.'.php';}function autoload2($class) {    require __DIR__.'/'.$class.'.php';}$TestObj1 = new Test1();$TestObj2 = new Test2();echo $TestObj1->func1().'<br/>';echo $TestObj2->func2();?>

 

這種方法會更先進一些,也是我們採用的最主要的方法。博主最近開發的項目使用的是ThinkPHP架構,就在架構的核心檔案Think.class.php中找到它的自動載入函數,拷過來給大家看下。

static public function start() {    // 註冊AUTOLOAD方法    spl_autoload_register('Think\Think::autoload');}/** * 類庫自動載入 * @param string $class 對象類名 * @return void */public static function autoload($class) {    // 檢查是否存在映射    if(isset(self::$_map[$class])) {        include self::$_map[$class];    } elseif (false !== strpos($class,'\\')){        $name = strstr($class, '\\', true);        if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){        // Library目錄下面的命名空間自動定位        $path = LIB_PATH;        }else{            // 檢測自訂命名空間 否則就以模組為命名空間            $namespace  =   C('AUTOLOAD_NAMESPACE');            $path = isset($namespace[$name])? dirname($namespace[$name]).'/' : APP_PATH;        }        $filename = $path . str_replace('\\', '/', $class) . EXT;        if(is_file($filename)) {            // Win環境下面嚴格區分大小寫            if (IS_WIN && false === strpos(str_replace('/', '\\', realpath($filename)), $class . EXT)){                return ;            }            include $filename;        }    }elseif (!C('APP_USE_NAMESPACE')) {        // 自動載入的類庫層        foreach(explode(',',C('APP_AUTOLOAD_LAYER')) as $layer){            if(substr($class,-strlen($layer))==$layer){                if(require_cache(MODULE_PATH.$layer.'/'.$class.EXT)) {                    return ;                }            }        }        // 根據自動載入路徑設定進行嘗試搜尋        foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){            if(import($path.'.'.$class))                // 如果載入類成功則返回                return ;        }    }}

 

更多的相關知識大家可以自行去搜尋,或者查看相關手冊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.