天天看點

php類檔案的自動加載機制

<?php
    
    導語:
    在實際項目中,如果一個類在多個腳本中都需要使用的話,可以将這個類的定義代碼,單獨的放到一個檔案内。
    當需要的時候,将檔案加載進來即可。

    目标:
    在加載類檔案的時候,我們希望的情況是,首先,不需要手動加載該類檔案(自動加載)。
    其次,按需加載(需要哪個類檔案就加載哪個類檔案,不需要的時候不加載)


    /·······················································/ 
    如何實作類檔案的自動加載:

    第一步:
    一般的我們會将類檔案的檔案名,命名為:類名.class.php

    第二步:
    我們需要借助__autoload()方法來實作類檔案自動加載。
    在php執行的過程中,如果發現需要使用一個類,并且此時目前腳本并沒有這個類的定義代碼。
    那麼php會自動調用__autoload()函數。并且在調用的同時,給該函數傳遞一個參數。參數就是目前需要的類的類名。
    但是,系統隻負責調用該方法,并不負責定義這個函數,是以需要我們去完善函數體。


    $obj = new A;
    function __autoload($class_name){
        if(is_file("./$class_name.class.php")){
            include_once("./$class_name.class.php");
        }
    }

    /·······················································/ 
    随着項目的擴充,我們可能需要注冊其他自定義的自動加載函數。

    第一步:定義一個可以加載類檔案的普通函數
    例如:
    function my_autoload($class_name){
        if(is_file("./$class_name.class.php")){
            include_once("./$class_name.class.php");
        }
    }

    第二步:将該函數注冊成自動加載函數
    這一步,我們需要借助另外一個系統函數來實作。
    文法格式為:spl_autoload_register('函數名')
    例如:
    spl_autoload_register('my_autoload');

    注冊其他自定義自動加載函數,有幾點需要注意的地方:
    第一:注冊一定要發生在需要某個類之前
    第二:可以注冊多個其他自定義自動加載函數
    第三:一旦注冊其他自定義的自動加載函數之後,系統的自動加載函數__autolaod将失效
    第四:如果還需要__autoload起作用,可以像注冊其他普通函數一樣注冊它


    /·······················································/ 
    在面向對象的程式設計風格中,我們一般會将使用者自定義的自動加載函數封裝到一個類中!

    靜态方法注冊:
    spl_autoload_register(array('類名','方法名'));   
    或者:
    spl_autoload_register('類名::靜态方法名');   

    例如:
    class Common{
        public static function my_autoload($class_name){
            if(is_file("./$class_name.class.php")){
                include_once("./$class_name.class.php");
            }        
        }
    }

    spl_autoload_register(array('Common','my_autoload'));
    或者:
    spl_autoload_register('Common::my_autoload');


    非靜态方法注冊:
    spl_autoload_register(array(對象變量,'方法名'));

    例如:
    class Common{
        public function my_autoload($class_name){
            if(is_file("./$class_name.class.php")){
                include_once("./$class_name.class.php");
            }        
        }
    }

    $obj = new Common;
    spl_autoload_register(array($obj, 'my_autoloads'));