[PHP] getoptのshotとlongの混在をまとめるスニペット

2020/01/09

テクノロジー プログラミング

t f B! P L
座っていると寿命が縮まると聞いて、プログラムも立って行うことにした下駄です。 おかげで、仕事をすればするほど、足がパンパンに膨れてしまうんですが、確かに座りっぱなしは皮下脂肪も増大するし、良いこと無いという事だけは理解できました。 最近、ユニットテストというか、プログラムのデバッグコードを書かないと、不具合究明が困難になるだけということに今更ながら気が付き、なんとかテストコードも効率化したいと考えて、コマンド対応のコードを構築しています。 その際に、コマンド対応するための、パラメータを取得する際に、getopt関数を使うと便利なのですが、shortとlongで、別々に登録されてしまうのと、複数重複した際に配列で返ってくるのがどうしても使いづらいので、シンプルな結果になるコードを準備しました。

ソースコード

$shorts = array( "p:", "m:", "c:", "f:", "a:" ); $longs = array( "path:", "mode:", "class:", "function:", "array:" ); $opts = getopt(join("",$shorts) , $longs); // 小文字に合わせる $options = array(); foreach($opts as $key => $value){ // 複数ある場合は戦闘優先 if(gettype($value) === "array"){ $value = $value[0]; } // short if(strlen($key) === 1 && !isset($options[$key])){ $options[$key] = $value; } // long else{ for($i=0; $i<count($longs); $i++){ $long_key = str_replace(":","",$longs[$i]); $short_key = str_replace(":","",$shorts[$i]); if($key === $long_key && !isset($options[$short_key])){ $options[$short_key] = $value; break; } } } } print_r($options); $ php debug.php -p test-path -m test-mode -c test-class -f test-function -a test-array Array ( [p] => test-path [m] => test-mode [c] => test-class [f] => test-function [a] => test-array )

解説

とりあえずの仕様で、パラメータオプションを5種類ほど設けてみましたが、今回やりたかったことは、shortとlongが混在する中で、同じ値を返したかったので、以下のようなコマンドの際に有効になります。 $ php debug.php -p test-path --mode test-mode --class test-class -f test-function -a test-array Array ( [p] => test-path [m] => test-mode [c] => test-class [f] => test-function [a] => test-array ) さらに、重複するパラメータに対しては、先頭有効仕様にしています。 $ php debug.php -m test-1 --mode test-2 Array ( [m] => test-1 ) 受け取りは全てshort-keyを基本にしています。 設定の注意点としては、shortsとlongsの配列の並び順で、対応keyを決めているので、順番を変更する場合は、2種類とも変更するように気をつけましょう。 その後のプログラムで便利に使えることは、よく分かるでしょう。

あとがき

テストコードは、説明書にも成り得るという間隔がわかり、仕事もコーディングも効率化できるため、PHPにとどまらず、javascriptも、CSSも、専用フレームワークに盛り込んで行こうと考えています。 テストコードの書き方などは、通常のプログラムとはまた違った特性もあったり、テストコード専用に技術などもあるので、そのへんは追々紹介していきたいと思います。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ