程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php中spl_autoload詳解

php中spl_autoload詳解

編輯:關於PHP編程

     spl_autoload 是SPL實現的默認的自動加載函數,它的功能比較簡單。它可以接收兩個參數,第一個參數是$class_name,表示類名,第二個參 數$file_extensions是可選的,表示類文件的擴展名" title="擴展名">擴展名,可以在$file_extensions中指定多個擴展名" title="擴展名">擴展名,護展名之間用分號隔開即 可;如果不指定的話,它將使用默認的擴展名" title="擴展名">擴展名.inc或.php。spl_autoload首先將$class_name變為小寫,然後在所有的 include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions參數的話),如果找 到,就加載該類文件。你可以手動使用spl_autoload(”Person”, “.class.php”)來加載Person類。實際上,它跟require/include差不多,不同的它可以指定多個擴展名" title="擴展名">擴展名。

    怎 樣讓spl_autoload自動起作用呢,也就是將autoload_func指向spl_autoload?答案是使用 spl_autoload_register函數。在PHP腳本中第一次調用spl_autoload_register()時不使用任何參數,就可以將 autoload_func指向spl_autoload。

    通過上面的說明我們知道,spl_autoload的功能比較簡單,而且它是在SPL擴展中實現的,我們無法擴充它的功能。如果想實現自己的更靈活的自動加載機制怎麼辦呢?這時,spl_autoload_call函數閃亮登場了。

    我 們先看一下spl_autoload_call的實現有何奇妙之處。在SPL模塊內部,有一個全局變量autoload_functions,它本質上是 一個HashTable,不過我們可以將其簡單的看作一個鏈表,鏈表中的每一個元素都是一個函數指針,指向一個具有自動加載類功能的函數。 spl_autoload_call本身的實現很簡單,只是簡單的按順序執行這個鏈表中每個函數,在每個函數執行完成後都判斷一次需要的類是否已經加載, 如果加載成功就直接返回,不再繼續執行鏈表中的其它函數。如果這個鏈表中所有的函數都執行完成後類還沒有加載,spl_autoload_call就直接 退出,並不向用戶報告錯誤。因此,使用了autoload機制,並不能保證類就一定能正確的自動加載,關鍵還是要看你的自動加載函數如何實現。

    在php5中的標准庫方法spl_autoload相當於實現自己的__autoload

     

    代碼如下:
    <?php
        function __autoload($classname){
            if(is_file($classname.'.php'){
                include $classname.'.php';
            } elseif(is_file($classname.'.inc'){
                include $classname.'.inc';
            }
        }

     

    它會在注冊目錄下自動尋找與$classname同名的.php/.inc文件。當然,你也可以指定特定類型的文件,方法是注冊擴展名

     

    代碼如下:
    <?php
        spl_autoload_extensions('.php,.inc,.some');

     

    這樣,它也會搜索.some文件。默認,php是不會啟動spl_autoload的,那麼怎樣才能自動讓spl_autoload生效呢呢?方法是

     

    代碼如下:
    <?php
        spl_autoload_register();

     

    spl_autoload_register有一個$callback參數,如果不指定,它就會自動注冊spl_autoload,為了能搜尋更多的自動加載目錄,可以在這些代碼前面設置自動加載目錄

     

    代碼如下:
    <?php
        set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);

     

    這樣,當php找不到指定的類時,就會在set_include_path指定的目錄下尋找。

    這些方法常用在php框架中。比如把上面的介紹串連起來:

     

     代碼如下:
    <?php
    set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);
    spl_autoload_extensions('.php,.inc,.some');
    spl_autoload_register();

     

    當你要加載some/path下面的classA類時,它會在目錄下尋找classa.php或classa.inc或classa.some,這樣你就可以放心地運用new classA或extends classA

     

    代碼如下:
    <?php
        ClassB extends ClassA {
            // code..
        }

     

        $a = new ClassA;
        $b = new ClassB;

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved