PHPでプログラムを書いているときに、「一つのプログラムで複数の処理を切り替えながら実行したい」、「コマンドラインからの文字列を指定したい」、と思ったことはありませんか?
そんなときには$argvを使いましょう。
今回はPHPの$argvの使い方についてです。
ぜひ、今回の解説を参考にしてみてください。
目次
$argvはコマンドラインから文字列を取得したい時に使う
$argvを利用するときは、以下のようにしてPHPのプログラムを実行します。
1 2 |
// hoge.phpという実行するphpファイルの後ろにfugaという文字列をつける php hoge.php fuga |
このように実行することで「fuga」という文字列をPHPのプログラムの中で利用できるようになります。
ここで$argvのリファレンスを読んでみると、このようにあります。
コマンドラインから実行したときに、 現在のスクリプトに渡されたすべての引数の配列が含まれます。
つまり、例で示したプログラムにおいて「fuga」は$argvという配列の中に格納されるということです。
「$argv」はプログラミング言語における「argument(引数) + v(vector、配列)」に由来しています。
由来も一緒に覚えておくと、書くときに少し助けになりますね。
$argvの具体的な使い方
$argvの具体的な使い方について、解説していきます。
例えば、こんなPHPのプログラムがあったとします。
1 2 3 4 5 6 7 8 |
// $argvを利用しないweather.php $weather = 'sunny'; if($weather === 'sunny'){ echo '晴れです!!'; }else if($weather === 'rainy'){ echo '雨です!!'; } |
このプログラムの仕様をまとめるとこうです。
- 変数、$weatherが「sunny」という文字列であれば、「晴れです!!」を表示する
- 変数、$weatherが「rainy」という文字列であれば、「雨です!!」を表示する
これを踏まえて、$weatherに入る文字列を$argvを利用して、コマンドライン引数として渡すように書き換えるとこのようになります。
1 2 3 4 5 6 7 8 |
// $argvを利用したweather.php $weather = $argv[1]; if($weather === 'sunny'){ echo '晴れです!!'; }else if($weather === 'rainy'){ echo '雨です!!'; } |
そして、コマンドライン引数として「rainy」という文字列を渡して実行したいので、次のようなコマンドでPHPのプログラムを実行。
1 |
php weather.php rainy |
こうすることで「rainy」という文字列は、$argvの配列に格納されます。
このように$argvを利用しない場合は「雨です!!」を出力するために、一度、$weather変数の文字列を「rainy」に書き換えて、実行しなければなりませんでした。
しかし、$argvを利用することで、$weather変数を書き換えずにコマンドラインから条件分岐させることが可能になります。
$argv はPHPで定義済の変数
$argvはPHPでは定義済の変数となっています。なので、コードを書くときは、単に$argvを書けばOKです。
また、PHPの仕様として$_SERVERという定義済の変数の配列の要素にも同じものが格納されるようになっています。
つまり、次の2つの書き方において、取得できるデータは同じということです。
1 2 |
$hoge = $_SERVER['argv'] $hoge = $argv |
コマンドラインを利用するプログラムの紹介
$argv以外にも、コマンドラインを利用したPHPのプログラムがあります。今回は$argcについて簡単に解説します。
コマンドライン引数の数をカウントする$argc
PHPには$argvに似ている$argcというものがあります。
$argcと$argvはどちらもコマンドラインを利用するためのものです。
ここでPHPのリファレンスを見てみると、このようにあります。
コマンドラインから実行したときに、 現在のスクリプトに渡された引数の数が含まれます。
例えば、先程示した例のようなコマンドを実行する場合を考えてみます。
1 2 |
// hoge.phpという実行するphpファイルの後ろにfugaという文字列をつける php hoge.php fuga |
$argcには引数の数が格納されるので、$argcは「1」となります。
$argcはプログラミング言語における、「argument(引数)+c(count)」に由来しています。
この$argcと$argvを組み合わせて利用すると、1つのプログラムで複数の処理をコマンドラインから切り替えながら実行することが可能です。
例えば、文字列を加工するプログラムとしてこんな仕様を考えてみます。
- 「sprit」というコマンドライン引数が指定されたら、次の単語を2等分する
- 「concat」というコマンドライン引数が指定されたら、次の単語を連結する
そうなると、コマンドラインで実行するときこのように実行することになります。
1 2 3 4 5 |
// spritが指定された文字列を分割する php arrange_string.php sprit hogehoge // concatが指定されたら、文字列を結合する php arrange_string.php concat hoge fuge |
このように、$argvと$argcを組み合わせると一つのPHPのプログラムで複数の処理をコマンドラインで使いわけるという使い方が可能です。
$argvはフレームワークでも使われている
$argvは一般的なPHPのフレームワークの中で実際に利用されています。
今回はWEBアプリ開発でもよく使われるフレームワークであるLaravelとSymfonyの2つについて見ていくことにします。
Laravelでの利用例
LaravelではArgInput.phpというクラスで利用されています。
1 2 3 4 5 6 7 8 9 10 11 |
public function __construct(array $argv = null, InputDefinition $definition = null) { $argv = $argv ?? $_SERVER['argv'] ?? []; // strip the application name array_shift($argv); $this->tokens = $argv; parent::__construct($definition); } |
Laravelにおいては、$argvはグローバルな変数となるため一度引数をもらうときにnullで初期化して、$argvの配列を取り直すようにしているようです。
Symfonyでの利用例
次にSymfonyです。SymfonyもArgInput.phpというクラスでLaravelと同じコードが記述してあります。
これはLaravelがSymfonyの機能を取り込んで実装されているためです。
まとめ
いかがでしたか?今回はPHPの$argvを紹介しました。
これでコマンドラインから引数を取得できるようになり、1つのPHPのプログラムで複数のことを処理できるようになりました。
ぜひ参考にしてみてください。