[php] spl_autoload で autoload 制御

いらねー! という声も聞こえる autoload ですが, spl_autoload を使うともう少し便利になるという事で試しに使ってみました。
spl_autoload_register('function_name'); // array('class_name', 'method_name') も可
で複数登録が可能, spl_autoload_functions() で登録されている関数の一覧が取得でき spl_autoload_unregister('function_name') で削除。spl_autoload が呼ばれた場合, 既存の __autoload が上書きされるので注意してください。
register/unregister する事で autoload 制御に道が付くのでこれで少しは使えるようになるんじゃないかなーと思ってます。まだ autoload 持ちのフレームワーク等と混ぜて使ってないので微妙なんですが。どうだろう…

spl_autoload については世界的に資料不足で PDF 資料 SPL for the masses 以外に見あたりません。ext/spl/examples/autoload.inc のサンプルも __autoload 関数のサンプルです。あとは ext/spl/tests 以下と Doxygen によるマニュアルがあるのみ。
spl_autoload_extensions('php, class.php, inc.php') (クラスからファイル名が推測される際に拡張子を自動付加) のようにどこで機能しているのか今ひとつ分からない関数もあったりと MarcusBorger 自身もあまりやる気がないような… いやいや。

利用例として Services_XML_RSS20 といったクラスを Services/XML/RSS20.php というように分解して include_path から探すローダーと spl_autoloader の記述を公開します。

// set autoloaders if SPL autoload function exists
if (function_exists('spl_autoload')) {

  // register existing autoloader
  function_exists('__autoload') and spl_autoload_register('__autoload');


  /**
   * PEAR style autoloader
   *
   * @param string $classname
   * @return void
   */
  function __autoload_pearstyle($classname) {

    $separator = array("/_/", "/([a-z]+)([A-Z])([^A-Z]+)/");
    $replacement = array("/", "\$1/\$2$3");
    $classpath = preg_replace($separator, $replacement, $classname) .'.php';

    $dirs = split(PATH_SEPARATOR, ini_get('include_path')); // PATH_SEPARATOR defined in PEAR.php
    foreach ($dirs as $dir) {
      $_file = $dir .'/'. $classpath;
      file_exists($_file) and require_once($_file);
    }
  }
  spl_autoload_register('__autoload_pearstyle');
}

include_path を手動分解しなければならない辺り, 本当はもっと軽いやり方があるのではと疑問が湧いて仕方がない (エラー制御子はボツった)。何か見落としているような気がします。