PHP autoload

以往在要使用某個 class 的時候, 都會用 require, require_once 或 include 來讀 class 的檔案, 然後在 new 物件出來。 而 PHP 5 的 autoload 可以簡化這個部份, 使用 autoload 之後就不需要先用 require 來讀取 php, 就可以直接用 new 來建立物件, 而 require 的部份則就交給 autoload 來處理, 稱之為 lazy loading。

最基本的方式就是用 *autoload 函式來處理。 *

function autoload($class) {  
    $class = str_replace('_', '/', $class);
    require $class . '.php';
}

而看了幾個為了 PHP 5 寫的 framework 或 package 都採用 splautoloadregister 來作 autoload 的處理。

像是 Zend Framework 所提供的 ZendLoader 就有提供一個叫做 autoload 的 static method。 所以要用 Zend Framework 提供的元件, 其實可以直接用下列方式, 也就是用 splautoload_register 來註冊 autoload:

require 'library/Zend/Loader.php';
spl_autoload_register(array('Zend_Loader', 'autoload'));

也就是說 Zend_Loader 提供了對於 Zend Framework 的 autoload 方法, 對於 Zend Framework 要怎麼做 autoload 的方式, 已經都寫在裡面, 你只需要註冊這個 Zend Framework 所提供的 autoload 函示即可。

另外, 我也看了 Kohana 對於 autoload 的處理, 也是跟 Zend Framework 一樣, 是使用 splautoloadregister 註冊 Kohana 本身提供的 autoload 函示, 有興趣的人可以看看 /system/core/Kohana.php, 也就是 Kohana::auto_load 這個函式。

Doctrine 也一樣, 利用 splautoloadregister 來註冊 Doctrine::autoload, 所以說, 如果以後有要開發 package 的話, 其實就照這個 pattern 來做就好了。 就是在核心程式中提供一個叫做 autoload 的 static method, 來讓使用的人做 splautoloadregister 即可。

先前其實對於 autoload 的觀念不太清楚, 在今天看了 Zend 跟 Kohana 的 autoload 之後, 才知道原來 PHP 就只是提供一個 autoload 的函式給你用, 當你要初始的 class 不存在的時候, 他會去執行這個 autoload 函式。 但是要怎麼載入需要的 class, 還是要自己寫。

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!