SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

S2Container.PHP5を用いたDIベースの開発

S2Containerの自動バインディング機能の利用


  • このエントリーをはてなブックマークに追加

S2Container.PHP5は元々Javaで開発されていたS2ContainerをPHP5に移植したもので、DIとAOPをサポートする軽量コンテナです。本稿では、PHP5環境で動作するS2Container.PHP5について紹介します。サンプルとしてコマンドラインから使用するログインサービスを作成しながら、その使い方について説明していきます。

  • このエントリーをはてなブックマークに追加

はじめに

 皆さんは、Seasarファウンデーションをご存知でしょうか。2005年12月にNPO(非営利団体)として運営が開始されたオープンソースソフトウェア開発コミュニティです。

 S2Container.PHP5は、Seasarファウンデーションの1プロジェクトとして開発が進められています。S2Containerとは、DI(Dependency Injection)とAOP(Aspect Oriented Programming)をサポートする軽量コンテナで、Javaで開発されました。S2Container.PHP5はS2ContainerをPHP5に移植したものです。2005年の5月にSeasarファウンデーションで開発がスタートし、2006年4月29日にS2Container.PHP5-1.1.0が正式にリリースされています。

 本稿では、PHP5環境で動作するS2Container.PHP5について紹介します。

対象読者

 PHP-5.1以降を用いて開発する方を対象とします。

必要な環境

 筆者の環境は次のとおりです。

  • OS: WindowsXP
  • PHP: PHP-5.1.4-Win32

 付属サンプルについては、Debian GNU/Linux、PHP-5.1.4 でも動作確認しています。筆者は未確認ですが、その他のUNIX/Linux環境でも問題なく動作すると思います。

コンテナとコンポーネント

 まずはじめに、「S2Container」の「コンテナ」とはなんでしょうか。コンテナと聞くと、筆者は船舶や貨車に積む大きな鉄の箱をイメージします。S2Containerも「なにかを入れる箱」という意味では元の意味と通ずるところがあります。S2Containerにはコンポーネントを入れます。また、コンテナの中にコンテナを入れることもできます。S2Containerはコンテナやコンポーネントを管理します。

 では、「コンポーネント」とはなんでしょうか。コンポーネントは、ある1つの機能を持ちます。1つの機能は、1つのクラスで実装される場合もあれば、複数のクラスから構成されている場合もあります。ある機能を使いたい場合、その機能を持つコンポーネントをS2Containerから取り出して使用することになります。この時、その機能が複数のクラスから構成されている場合は、S2Containerは必要なクラスを持つコンポーネントを組み合わせた形で返してくれます。これが、S2ContainerにおけるDI(Dependency Injection)になります。

DIの種類

 S2Containerが提供するDIの種類は次の3つです。

  • コンストラクタ・インジェクション
  • コンポーネントの構成に必要な値をコンストラクタで設定します。
  • セッター・インジェクション
  • コンポーネントの構成に必要な値をセッター・メソッドで設定します。セッターメソッドとは、setXxxという命名規則に従ったメソッドです。Xxxにはプロパティ名を用います。
  • メソッド・インジェクション
  • コンポーネントの構成に必要な値を初期化メソッドで設定します。

 3種類のDIを組み合わせて使うこともできます。筆者は主にセッター・インジェクションを使用し、特殊な初期化が必要な場合にメソッド・インジェクションを使っています。

diconファイルについて

 S2Containerのイメージはコンテナ(箱)であり、最初はからっぽです。そのため、S2Containerを使用する前にコンポーネントを入れておく必要があります。どのようなコンポーネントを入れておくのか、それらのコンポーネントの情報、および他のコンポーネントとの関係(Dependency)などを設定するのがdiconファイルになります。

 diconファイルは「ダイコンファイル」と呼びます。diconファイルはXMLで記述します。XMLのタグは9種類あり、各タグの属性で細かい設定ができます。よく使用するのは9つ中、4つほどです。本稿でも説明に出てくるタグは次の3つです。

  • componentsタグ
  • diconファイルのルートタグになります。
  • componentタグ
  • 1つのコンポーネントを定義するタグです。
  • propertyタグ
  • componentタグの子タグです。propertyタグで設定された値がセッター・インジェクションされます。

インターフェイスを用いることの利点

 PHP5からインターフェイス(interface)を定義できるようになりました。インターフェイスと実装を分離することにより、クラス同士の依存関係を軽減できます。このため仕様変更への柔軟な対応が可能になるなど、インターフェイスを定義することが推奨されます。S2Containerを使用する場合は、コンポーネントごとにインターフェイスを定義するとさらに利点が得られます。

 S2Containerには自動バインディングという機能があり、コンポーネントの依存関係を自動的に解決します。この際、自動解決を行うための情報源としてインターフェイス定義を使用します。S2Containerは、クラスのコンストラクタやセッターメソッドの引数が、インターフェイスによってType Hintingされているかどうかを調べます。Type Hintingされている場合は、そのクラスはそのインターフェイスを実装しているクラスが必要なのだと判断し、DIを実施します。自動バインディング機能を用いるとdiconファイルに依存関係情報を記述する必要がなくなるため、diconファイルの設定量を減少できます。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
ログインサービス

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

klove(klove)

Seasarファウンデーション Seasar.PHPプロジェクトにて、コミッタ活動しています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/495 2007/04/13 12:53

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング