Standing on the Shoulder of Linus

Home / 2011 / 12月 / 13 / PHP5.3 の名前空間入門

PHP5.3 の名前空間入門

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 とコントローラの関係」についてです。

関連

Posted in php | Tagged PHP, エスケープ
← FuelPHP の view に PHPTAL デザインテンプレートを使う Concrete5 の Events →

アーカイブ

人気の投稿とページ

  • キンドル本を印刷する(PDFに変換する)方法
  • 名古屋駅から国際センターまでの道のり(徒歩)
  • AGPL ライセンス(GPLとは似ているが違いもある)
  • 問い合わせフォーム改善: 選択肢により条件分岐し、項目の表示非表示を変更する
  • JP-Secure SiteGuard WP Pluginは不正ログイン防止に役立つか

プロフィール

水野史土:月70万PVホームページ制作会社のレスキューワーク株式会社で、PHPソフトウェアのサポートを行っている。concrete5コミュニティリーダー、Novius OSコアコード貢献者でもある。 詳しくは管理者詳細参照。
大好評WordPress書籍「WordPressユーザーのためのPHP入門 はじめから、ていねいに。」サポートページ

Copyright © 2015 Standing on the Shoulder of Linus.