spl_autoload()函數的作用以及其和spl_autoload_register()的關係?

來源:互聯網
上載者:User
在學習php的autoload的機制的時候,發現目前都使用了spl_autoload_register()函數來實現自動載入類,但在查閱資料的過程中,發現了spl_autload()這個函數,在php官方手冊中,對該函數的解釋是:

__autoload()函數的預設實現

該函數的例子中看到該函數的作用是類似於include(),只不過是可以傳入第二個參數來設定尾碼名。而且spl_autoload()無法指定path(當然可在調用該函數之前調用set_include_path()來指定)
另外看到有些部落格說到:

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

但在我的自己的測試中,發現只調用spl_autoload(),傳入想要載入的類名,就可以直接載入了,不需要在之前調用spl_autoload_register()。

我的問題是:

  1. PHP手冊中的解釋:__autoload()函數的預設實現 該如何理解?

  2. spl_autoload()和spl_autoload_register()的關係?

  3. spl_autoload()函數存在的意義是?

謝謝!

回複內容:

在學習php的autoload的機制的時候,發現目前都使用了spl_autoload_register()函數來實現自動載入類,但在查閱資料的過程中,發現了spl_autload()這個函數,在php官方手冊中,對該函數的解釋是:

__autoload()函數的預設實現

該函數的例子中看到該函數的作用是類似於include(),只不過是可以傳入第二個參數來設定尾碼名。而且spl_autoload()無法指定path(當然可在調用該函數之前調用set_include_path()來指定)
另外看到有些部落格說到:

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

但在我的自己的測試中,發現只調用spl_autoload(),傳入想要載入的類名,就可以直接載入了,不需要在之前調用spl_autoload_register()。

我的問題是:

  1. PHP手冊中的解釋:__autoload()函數的預設實現 該如何理解?

  2. spl_autoload()和spl_autoload_register()的關係?

  3. spl_autoload()函數存在的意義是?

謝謝!

__autoload 函數是用來處理自動載入的函數,在 PHP 找不到指定類時就會去調用自動載入類,載入所需要的類。
__autoload 只是一個抽象定義,實現(實現就是定義如何載入,載入的規則是什麼,載入的檔案是什麼等等)是交給使用者的,而 spl_autoload 則是 SPL 所定義的 __autoload 一種實現。spl_autoload 函數所實現的載入規則就是去 include paths 中尋找對於的類。spl_autoload 遵循是是 psr-0 的載入規則,而 include paths 就是載入時被查詢的路徑。
其他自己實現的 __autoload 類都可以通過 spl_autoload_register 進行註冊,註冊之後就可以在需要類時自動調用被註冊的方法進行載入了。 spl_autoload 也是 __autoload 的一種實現,按理也是需要註冊的,只不過因為是內部的預設實現,所有已經自動註冊在 PHP 裡了。
spl_autoload 如今來看並沒有太多用處,應該是因為曆史問題殘留在 PHP 中的,目前絕大多數程式都沒有使用 spl_autoload 去做自動載入,因為它的規則已經定死,並不適合衍生一些功能。

插一句,因為 PHP 只有一個自動載入方法,所以 SPL 的 spl_autoload 和 spl_autoload_register 要爭搶這個方法,所以在 SPL 的 C 實現中,用了好多折衷的辦法。在沒有使用 spl_autoload_register 註冊任何自定的自動載入函數時, PHP 的自動載入方法是掛在 spl_autoload 下的,而 spl_autoload_register 註冊了自動載入函數後,PHP 的自動載入方法是掛在 spl_autoload_call 這個方法下的,而 spl_autoload 也會成為一個備選項進入 spl_autoload_register 的自動載入隊列。

  • 相關文章

    聯繫我們

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