SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

japan.internet.com翻訳記事

PHP5の新機能「リフレクションAPI」とその使用法

便利なリフレクション機能を試す

ダウンロード サンプルソース (3.6 KB)

例2:リフレクションによるPHPドキュメントの生成

 次は、リフレクションを使用してPHPクラスのドキュメントを生成する例です。この処理には、クラス内部を掘り下げて解析する必要があり、したがってリフレクションAPIのメソッドを多用します。

 まずは、HTMLベースの簡単なコンソールを用意します。ドキュメントの対象となるクラスの名前をクライアントから指定するためのコンソールです。次のような簡単なコードのコンソールで問題ありません。

<html>
<head>
   <b>Provide the class name to be documentated: <br /><br /></b>
</head>
 <body>
   <form method="get" action="generatingDocumentation.php">
     <input type="text" name="class">
     <input type="submit" value="Generate documentation">
     <input type="reset" value="Reset">
   </form>
 </body>
</html>

 ドキュメント生成アプリケーションの中核となるのは、「generatingDocumentation.php」のコードです。長いコードなので、以降では重要な部分だけを抜粋して示します。コード全体については、本稿のダウンロードサンプルに収録されている「generatingDocumentation.php」ファイルを参照してください。まず、ユーザーからコンソールを通じて送信されたクラス名を取得し、ファイルの拡張子を付加して、目的のクラスをインクルードします。その後で、出力ドキュメントの書き込み先となるファイルを開きます。

//get the class name to be documentated    
$className=$_GET['class'];
      
//paste the name class with the extension .inc
$classNameExtension=$_GET['class'].".inc";
$b=$_GET['class'];
      
//include the $classNameExtension class 
include($classNameExtension);
      
//get a ReflectionClass for the $className class
$reflection=new ReflectionClass($className);
      
//prepare the output
$hf=fopen("PTD.html","w");

 次に、クラスの各部分に対して反復処理を行い、必要な情報(クラスがサポートするインターフェイス、親クラス名(ある場合)、定数、プロパティ、メソッドとその全パラメータなど)を取得します。そして、これらの情報すべてを、説明のコメントと共に、ドキュメントファイルに書き込みます。以下、クラスのメソッドとパラメータを取得してドキュメント化する部分のコードの抜粋を示します。

//get information about methods
$methods=$reflection->getMethods();
      
   if($methods != null) 
     {
     fwrite($hf,"\t<tr><td align=\"center\"".
     " colspan=\"0\"><font face=\"arial\"".
     " size=\"2\" color=\"purple\">Methods:".
     "</td><td align=\"center\" colspan=\"0\">".
     "<font face=\"arial\" size=\"2\"".
     " color=\"black\"><b>Name</b></td>".
     "<td align=\"center\" colspan=\"0\">".
     "<font face=\"arial\" size=\"2\"".
     " color=\"black\"><b>Modifiers</b>".
     "</td><td align=\"center\" colspan=\"0\">".
     "<font face=\"arial\" size=\"2\"".
     " color=\"black\"><b>Parameters</b>".
     "</td><td align=\"center\" colspan=\"0\">".
     "<font face=\"arial\" size=\"2\"".
     " color=\"black\"><b>Description</b>".
     "</td></tr>\n");
     foreach($methods as $in)
      {
      fwrite($hf,"\t<tr><td></td><td>");
      fwrite($hf,$in->getName());
      
      if($in->isConstructor())
              { fwrite($hf," [c]"); }
           
      fwrite($hf,"</td><td>");  
      if ($in->isPublic())
              { fwrite($hf,"[public]"); } 
      if ($in->isPrivate())
              { fwrite($hf,"[private]"); }
      if ($in->isProtected())
              { fwrite($hf,"[protected]"); } 
      if ($in->isAbstract())
              { fwrite($hf,"[abstract]"); } 
      if ($in->isFinal())
              { fwrite($hf,"[final]"); } 
      if ($in->isStatic())
              { fwrite($hf,"[static]"); } 
      fwrite($hf,"</td>");      
               
      $parameters=$in->getParameters();
      if($parameters != null)
         {                  
         fwrite($hf,"<td align=\"center\">");
         $nr_parameters=count($parameters);
         foreach($parameters as $out)
          {
          fwrite($hf,"$");
          fwrite($hf,$out->getName());
          if($out->isPassedByReference())
           { fwrite($hf,"  [&]  "); }
             if($out->allowsNull())
           { fwrite($hf,"  [+]  "); }
           }
          fwrite($hf,"</td>");
          }else { fwrite($hf,"<td></td>"); }
      
      fwrite($hf,"<td align=\"center\"><i>");
      fwrite($hf,$in->getDocComment());
      fwrite($hf,"</i>\n\t</td></tr>\n");
      }      
    }

 たとえば、このPHPドキュメントツールでリスト1のテストクラスを指定すると、図3のような情報が出力されます。

図3 PHPドキュメントツールの出力。インターフェイス、スーパークラス、定数、プロパティ、メソッドを示すドキュメントが生成される
図3 PHPドキュメントツールの出力。インターフェイス、スーパークラス、定数、プロパティ、メソッドを示すドキュメントが生成される

 このように、新しいリフレクションAPIはリフレクション機能の便利な実装であり、本稿のPHPドキュメントツールのような比較的複雑なアプリケーションの開発に利用できます。実行すべきクラスやメソッドをデザイン時に判断できない場合には、リフレクションは特に便利です。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

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

Octavia Andreea Anghel(Octavia Andreea Anghel)

経験豊富なPHP開発者。現在は、国内外のソフトウェア開発コンテストに参加するプログラミングチームの主任トレーナーを務める。国レベルの教育プロジェクト開発のコンサルティングも担当している。共著書に『XML technologies?XML in Java』があり、XML部分の執筆を担当。PHPやXML...

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2011 2008/01/16 14:00

イベント

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

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

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

メールバックナンバー