FuelPHP Advent Calendar 2011 13 日目です。折り返し地点まで来ました。前日は @mataga さんの「FuelPHP動作実験 – 実験くんソースをModulesに閉じ込めてモジュール分割してみる。」でした。
今日は名前空間についてです。FuelPHP というよりは、PHP5.3 の新機能の説明が中心になります。
PHP 公式マニュアル名前空間の概要では、
広義の「名前空間」とは、項目をカプセル化するもののことです。 これは多くの場面で見られる抽象概念です。 たとえば、たいていの OS はディレクトリでファイルをグループ化します。 この場合、ディレクトリがその中のファイルの名前空間として機能しています。 具体的に言うと、foo.txt というファイルは /home/greg と /home/other の両方に存在することが可能ですが、それらふたつの foo.txt を同じディレクトリに配置することはできません。 さらに、/home/greg ディレクトリの外から foo.txt にアクセスするには、ディレクトリ名をファイル名の前につけて /home/greg/foo.txt としなければなりません。 プログラミングの世界における名前空間も、この延長線上にあります。
とあります。上の例を PHP に置き換えると、こんな感じになります。
namespace homegreg; function foo() {}; namespace homeother; function foo() {};
名前空間は、namespace 名前空間名
で定義します。バックスラッシュで区切ってサブ名前空間を指定できます (環境によっては、バックスラッシュ記号が円マークで表示されるかもしれません)。
関数などを呼び出すときは、homegregfoo();
と homeotherfoo();
になります。同じ名前空間内で定義されているものを呼び出す場合は、名前空間を省略した foo();
で呼び出すことができます。
FuelPHP では、/core/classes/view.php
と、packages/parser/classes/view.php
とで同じクラス名 View が使われていますが、別の名前空間なので衝突が回避されます。
FuelPHP のブログ Classnames, Autoloading & Namespaces に
For example calling the class “View” will fail if you have no such class in your App, but then it looks into the “core_namespaces” in the autoloader and finds a class “FuelCoreView” which is loaded and aliased to “View”.
とあるように、FuelPHP では、現在の名前空間に存在しないクラスを呼び出すと、コア領域(FuelCore
)内を探すようになっています。
名前空間のエイリアス
長い名前空間名には、use
でエイリアスを付けることができます(PHPマニュアルによると関数や定数は use 文でインポートできないらしいです)。
use homegreg
とすれば、homegreg ...
と書くところが、greg ...
と短縮できます。さらに、
use homegreg as g
とすれば、g ...
と短縮できます。
バックスラッシュのエスケープに注意する
文字列内のバックスラッシュは、エスケープ文字の働きをします。先日の FuelPHP の view に PHPTAL デザインテンプレートを使う のときに失敗しました。
static::$_parser->setOutputMode(constant(''.Config::get('parser.View_Phptal.output_mode', 'PHPTAL::XHTML')));
とするところを、単にスラッシュ 1 個にしてしまい、エラーになってしまいました。
シングルクォート内で '
と書いたために、リテラルのシングルクォートと解釈され、構文がおかしい、という警告を受けてしまいました(画像は vim で PHPLint を起動したところ)。
FuelPHP の bootstrap.php
を見ると、きちんとバックスラッシュ 2 個で記述されていました。
Autoloader::add_classes(array( 'FuelCoreAgent' => COREPATH.'classes/agent.php', 'FuelCoreArr' => COREPATH.'classes/arr.php', 'FuelCoreAsset' => COREPATH.'classes/asset.php', (以下省略)
明日は @kenji_s さん「FuelPHP の URL とコントローラの関係」についてです。