PEAR::Pagerを使うとautoloadが走ってしまう件

最近のよく訓練されたPHPerはフレームワークに組み込みの機能を使ったりするんだろうけど、そういう波に乗れていない僕は未だにPEAR::Pager使ったりします。今日はそんなPEAR::Pagerの小ネタ。

PEAR::Pagerを使う時は、

<?php
$pager = Pager::factory( array( 'mode' => 'Sliding' ) );

みたいにmodeで表示タイプをSlidingかJumpingか指定するわけですが、この表示タイプが独立したクラスとして実装されています。

Pager::factory()では表示タイプのクラスが読み込み済みかをclass_eixstsでチェックしていますが、ここでautoloadが走ります。

なので、アプリ側でautoloadを使って「指定のディレクトリ(path/to/lib/とか)にファイルが無かったらdie」みたいな処理をしていると、Pager::factory()を呼んだら死ぬなんてことになりかねません。

class_existsはPHP5.0.0から第2引数がサポートされて、ここがtrueならautoloadする、falseならしないという仕様になっています。

こいつのデフォルトがtrueなので、PHP4時代のコードを使うと意図しないautoloadが実行されてしまうケースがあります。

個人的にはライブラリ内でclass_existsを使う場合は「class_exists( $classname, false )」とか書くべきだと思うんですが、これをやると逆にPHP4ではWarningが発生するらしいので仕方なし。

まぁ、PEAR::Pager使う時は大人しく

<?php
require 'Pager.php';
require 'Pager/Sliding.php';

とか書いとけってことだ。