| コメント(0) | トラックバック(0)

皆さん、こんにちは。ブログを書くのは本当に久しぶりです。元々そんなに書いていませんでしたが、間を空けると書き方を忘れたかのようにまったく筆が進みません。

さて、ITEMAN Blogの初投稿となる今回は、先日リリースしたPiece Frameworkの新プロダクトStagehand_Autoloadの使い方について書くことにします。Stagehand_AutoloadはPHP 5のオートロードを効果的に使うための機能を提供します。具体的には、あらかじめ登録された名前空間PEAR命名規約に従ってファイルを探し読み込むためのコールバックをオートロード機構に登録します。あとはオートロードが動作する場面で、バックグラウンドでその責任を果たすだけです。

KUBO Atsuhiro

Stagehand_AutoloadStagehand_Commonsプロジェクトのプロダクトです。これまでのPiece Frameworkのプロダクトの多くはフレームワークレベルの大きな粒度のものですが、Stagehand_Commonsは、PEARパッケージのようなライブラリレベルよりさらに小さな粒度のプロダクトをたくさんリリースするために作られたプロジェクトです。例えプロダクトが1ファイルで構成されていてもリリースします。「Piece Frameworkのための再利用可能なクラス」とう要約が示すようにStagehand_Commonsのプロダクトは基本的にPiece Frameworkのプロダクトで再利用するためのクラスを想定していますが、今後リリースされるプロダクトの多くは一般的なアプリケーションでも利用することができると思います。

本題に入ります。Stagehand_Autoloadには2つのファイルがあります。1つはStagehand/Autoload.php, もう1つはStagehand/Autoload/PEAR.phpです。前者はPHP 5.3の名前空間のためのものであり、後者はPEAR命名規約のためのものです。PHP 5.3のstableリリースはまだ先の話なので、今回はPEARクラス命名規約用のファイル、Stagehand/Autoload/PEAR.phpの使い方について述べます。

まず、PEARのクラス命名規約についてみてみましょう。PEARマニュアルより引用します。

クラスには、内容が理解できるような名前を指定するべきです。 略語の使用は可能なかぎり避けます。 クラス名は、常に大文字で始めるべきです。 PEAR クラス階層は、クラス名にも反映され、各階層レベルは、 アンダースコアで区切られます。良いクラス名の例を以下に示します。

良いクラス名を付けることはもちろん重要なことですが、ここではアンダースコア区切りに目を向けてください。例えば、Piece_Unity_Service_FlowAction, Stagehand_TestRunner_Runner_PHPUnit, Piece_ORM_ConfigはいずれもPEARのクラス命名規約に従ったクラス名です。

Stagehand_Autoloadを利用するには、アンダースコア区切りのクラス名に加えて、クラスが定義されるファイルのパスも特定の形式を満たす必要があります。それはクラス名に含まれるアンダースコアをディレクトリセパレータに置きかえ、最後の要素をファイル、それ以外をディレクトリとする形式です。クラス命名規約と合わせると下記のようになります。

クラス ファイルパス
Piece_Unity_Service_FlowAction Piece/Unity/Service/FlowAction.php
Stagehand_TestRunner_Runner_PHPUnit Stagehand/TestRunner/Runner/PHPUnit.php
Piece_ORM_Config Piece/ORM/Config.php

前置きはここまでにしましょう。Stagehand/Autoload/PEAR.phpの使い方は非常に簡単。アプリケーション実行の最も早い段階でStagehand/Autoload/PEAR.phpをロードするだけです。下記は筆者が実際に書いたコードです。

<?php
...
$projectRoot = realpath(dirname(__FILE__) . '/../../../../..');
set_include_path("$projectRoot/src" . PATH_SEPARATOR .
                 "$projectRoot/imports/pear" . PATH_SEPARATOR .
                 "$projectRoot/imports/pear/src" . PATH_SEPARATOR .
                 "$projectRoot/imports/non-pear/spyc-0.2.5"
                 );
unset($projectRoot);

require 'Stagehand/Autoload/PEAR.php';
...

以降、規約に従ったクラスは暗黙的にロードされるため、それらのクラスを使う際はいきなりnew Foo()やFoo::Bar()とすることができます。

最後にいくつか注意点を述べておきます。Piece FrameworkやPEARの多くのクラスは問題なく動作しますが、PEAR.php(PEAR, PEAR_Error)のように1つのファイルに複数のクラスが定義されているものには気を付ける必要があります。例えば、PEAR.phpが一度もロードされていない状況でnew PEAR_Error()を実行するとPEAR/Error.phpが存在しないため致命的なエラーが発生します。また、define()で定義�%

トラックバック(0)
  • このブログ記事のトラックバックURL:
コメント