Zend_Console_Getoptを使ってみた

今日はPHPでコマンドラインツールを作る際に便利なライブラリ、Zend_Console_Getoptの使い方とサンプルの紹介です。

Zend Framework って名前だけは皆さんご存知だと思うんですけど、実際に使ったことがある人は意外と少ない気がします。フレームワークって聞くとなんか面倒そうですし、自分はフレームワーク変える気無いしなあ、なんて人も多いですよね。でも、実はライブラリとして他のフレームワークと組み合わせて使うことも可能です。気軽に試してみてはいかがでしょうか。(例えばsymfonyならsfZendFrameworkBridgeを使えば簡単に利用できます)

インストール

まずはZend Frameworkをインストールしてみましょう。といっても、Zend Frameworkドキュメントの「1.2 インストール」に書いてあるままなんですが、私の手順を紹介します。

$ wget http://framework.zend.com/releases/ZendFramework-1.5.3/ZendFramework-1.5.3.tar.gz
$ mkdir ~/src/
$ tar xvzf ZendFramework-1.5.3.tar.gz -C ~/src
$ rm ZendFramework-1.5.3.tar.gz
$ sudo mkdir -p /opt/local/share/zf
$ sudo cp -r ~/src/ZendFramework-1.5.3/library/Zend /opt/local/share/zf/
$ vi /opt/local/etc/php.ini
(include_pathに/opt/local/share/zfを追加)

私はmacportsに合わせた場所に配置しましたが、普通は/usr/local/share/zfあたりが適切かもしれません。また、~/src/ZendFramework-1.5.3/は後で何か調べものをしたくなったときのために取ってありますが、もちろん消しても構いません。

Zend_Console_Getoptの紹介

さて、本題です。Zend_Console_Getoptというのはコマンドラインオプション解析ライブラリです。getopt関数とかPEAR::Console_Getoptと同じ目的のライブラリですけど、これらは機能が足りなすぎるんですよね。私の考えでは、下記の機能は持っていて欲しいです。

  • 短いオプション(-h)と長いオプション(–help)をGNUコマンド風に取り扱える
  • 変なオプションが指定されたらエラーを出してくれる
  • オプションのエイリアスが作れる
  • 「–」以降のコマンドラインオプション解析をしない(ことができる)
  • オプションの指定から自動でヘルプメッセージを作ってくれる

getoptもPEAR::Console_Getoptもそれなりに上の機能を実装しているんですが、オプションのエイリアスを作る機能を提供していないのが痛いですね。どういうことかというと、-iのエイリアスとして–integerが使えるときに、「-i 4 –integer 8」などとごちゃまぜに指定されても、最後に指定された値(この場合8)を簡単に取得する方法が欲しいんです。そんな変な指定をするユーザーの心配なんかしなくてもいいよ、という意見もあるとは思うんですが、他の言語のライブラリや普段使っているコマンドラインツールでは実現できていることですから、これができないのが私はずっと不満でした。

その点、Zend_Console_Getoptは上記のすべてが実現されていて素晴らしいと思います。オプションが指定されなかった場合のデフォルト値が設定できた方が便利だと思うんですが、不満点はそれくらいですね。

サンプルコードを最後に紹介しますが、まずは簡単な使い方を紹介します。オプションの指定ですが、下記のように指定します。short,longのオプションをひとまとめに書けるのがPEAR::Console_Getoptなどと比べて断然読みやすいと思います。

  $optionlist = array(
    "b|bool|boolean"  => "specify boolean parameter",
    "i|int|integer=i" => "specify integer parameter",
    "s|str|string=s"  => "specify string parameter",
    "v|version"       => "Print the version information and exit.",
    "h|help"          => "Print this message and exit.",
    "debug"           => "debug mode",
  );
  try {
    $opts = new Zend_Console_Getopt($optionlist);
    $opts->parse();
  } catch (Zend_Console_Getopt_Exception $e) {
    show_error($e);
  }

さらに、上の指定でオプションの種類を指定しただけではなく、ヘルプメッセージを作ってくれる機能もあります。これはどうでもいい機能のようですが、意外と重要です。自分用スクリプトなどでオプションを無軌道に追加していると、ヘルプメッセージと実際のオプションがズレちゃったりするんですよね。混乱防止のためにも一元管理できるのは重要です。

Usage: zfgetopt-example.php [ options ]
-b|--bool|--boolean          specify boolean parameter
-i|--int|--integer <integer> specify integer parameter
-s|--str|--string <string>   specify string parameter
-v|--version                 Print the version information and exit.
-h|--help                    Print this message and exit.
--debug                      debug mode

オプションが指定されているかどうかは下記のように調べられます。

  $integer = (int)$opts->getOption("integer");

エイリアスのどの名前でも調べられるのは地味に便利です。

サンプルコード

zfgetopt-example.phpというのを書いてみました。コマンドラインから指定されたファイルを読み込んでバイト数を表示します。サンプルなので処理に意味はありません。stat()すりゃいいじゃん、のような意見は全力でスルーします。

また、–integerで指定された数を実際のバイト数に足します。普段はバイト数の後ろに「byte(s)」と表示されますが、–stringで変更することもできます。繰り返しになりますが、処理の意味に関するツッコミは禁止です。

また、ヘルプやエラーメッセージなどは標準エラー出力に表示しています。これは私の趣味です。

私は結構PHPとの付き合いが長いのですが、ようやく他の言語で書いたスクリプトに近い挙動のスクリプトが書けたような気がします。Zend_Console_Getoptは良いですね。私と同様の違和感を感じていた方に特にオススメします。これを雛形にしてコマンドラインツールをバリバリ書いてみて下さい!

コメント / トラックバック 1 件

#1 links for 2008-08-02 [delicious.com] « 個人的な雑記 2008/08/03 07:31

[...] Zend_Console_Getoptを使ってみた (tags: php) [...]

コメントする