php中spl_autoload詳解_php技巧

來源:互聯網
上載者:User

SPL有兩個不同的函數 spl_autoload, spl_autoload_call,通過將autoload_func指向這兩個不同的函數地址來實現不同的自動載入機制。

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;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.