PHPベストプラクティス >

spl関数の問題

spl_autoload_functions で取得した __autoload スタック登録済インスタンスメソッドを spl_autoload_unregister で解除できない。

バージョン別の結果

  • ○: 問題なし、×: 問題あり
    No.OSPHP結果
    1Linux (Debian lenny)5.2.5×
    2Windows Vista5.2.5×
    3Linux (Ubuntu Gutsy Gibbon)5.2.3×
    4Linux (Debian etch)5.2.0

詳細

  • spl_autoload_functions は、インスタンスメソッドかクラスメソッドかに関係なく、クラス名(string)メソッド名(string)を要素に持つ __autoload 実装関数(メソッド)の配列を返す*1。これを走査して、spl_autoload_unregister を使って登録を解除しようとしても、実装関数がインスタンスメソッドの場合に、解除に失敗する(ただし、上記の表の通り5.2.0では成功する)。クラス(静的)メソッドの場合にはどのバージョンでも問題なく解除できる。

回避方法

  • インスタンスメソッドを登録せず、関数またはクラスメソッドのみを登録する。
  • インスタンスメソッドを登録するならば、解除の使用を前提とする設計にしない。つまり、解除を使わない。

*1 spl_autoload_register では、引数に callback 型を受け容れるにもかかわらず、spl_autoload_functions の返却値が callback 型の配列ではなく、(クラス名とメソッド名と)簡略化されているのは、一貫性を欠いている。問題が発生しても不思議ではない。言語仕様に関数オブジェクトがないので、コールバック関数の識別が曖昧なようだ。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-03-07 (金) 00:49:14 (4092d)