今回はPHPのプログラムではそこまで使用頻度が多くは無いのですが、コマンドラインからPHPプログラムを実行する時に 指定された 引数 を取得する方法について説明したいと思います。
プログラムの引数を取得するにはPHPが設定した $argv という配列変数を参照します。
$argv と対になる変数として $argc がありますが、これは $argv の配列の個数が入っています。
(C言語を使ったことがれば、すぐに分かると思いますが、機能的にはほぼ同じものと考えられます。 $argc は $argv の count() を取れば分かるのですが…)
■$argv の使用例
プログラムの中では $argv 変数を直接参照すればよく、以下のソースは var_dump により内容を表示させています。 取敢えず $argc 変数も表示しています。
<?php // $argvの内容表示 var_dump($argv); // $argcの内容表示 var_dump($argc); ?>
私の環境ではWindowsの xampp でPHPを導入し、DOSのコマンドプロンプトからの実行を行っています。 実行結果は以下の様に表示されます。
$argv の先頭のデータ([0]番目)は実行したプログラムのファイル名がフルパスで入っていて、 [1]番目のデータに最初の引数の文字列が、[2]番目のデータに2番目の引数の文字列が入っています。
C:\>C:\xampp\php\php.exe C:\xampp\htdocs\_test\argv1.php aaaaaa bbbbbb array(3) { [0]=> string(31) "C:\xampp\htdocs\_test\argv1.php" [1]=> string(6) "aaaaaa" [2]=> string(6) "bbbbbb" } int(3)
■$argv の使用例その2
それでは $argv の内容をプログラム的に使用してみます。
以下の例は $argv の内容をそのまま表示する反復処理です。
<?php // $argvの引数部分の内容表示 for ($i = 1; $i <= ($argc - 1); $i++) { echo "{$i}番目のコマンドライン引数:".$argv[$i]."\n"; } ?>
これを実行すると以下の様に表示されます。見事に文字化けしています。
それもそのはずで、プログラムソースは UTF-8 で保存されていますが、WindowsのDOSプロンプトで実行しているためです。 Windowsでは Shift-JIS コードで出力しないと正常に表示されません。
C:\>C:\xampp\php\php.exe C:\xampp\htdocs\_test\argv2.php aaaaaa bbbbbb 1逡ェ逶ョ縺ョ繧ウ繝槭Φ繝峨Λ繧、繝ウ蠑墓焚・啾aaaaa 2逡ェ逶ョ縺ョ繧ウ繝槭Φ繝峨Λ繧、繝ウ蠑墓焚・喘bbbbb
これを解消するには、表示文字列を Shift-JIS に変換する必要があります。そこで、以下の様になります。
<?php // $argvの引数部分の内容表示 for ($i = 1; $i <= ($argc - 1); $i++) { // UTF-8 での文字列 $str = "{$i}番目のコマンドライン引数:".$argv[$i]."\n"; // Shift-JIS に変換して表示 echo mb_convert_encoding($str, "SJIS", "UTF-8"); } ?>
これを実行すると以下の様に表示され文字化けは解消されています。
プログラムがコマンドラインからのみの実行ならばこれでもいいのですが、もしブラウザからの実行と、コマンドラインからの実行の 両方に対応するには、すこし細工が必要になってきます。
ブラウザは UTF-8 のソースを実行する為に、
C:\>C:\xampp\php\php.exe C:\xampp\htdocs\_test\argv3.php aaaaaa bbbbbb 1番目のコマンドライン引数:aaaaaa 2番目のコマンドライン引数:bbbbbb
尚、この $argv ですがコマンドラインから実行した時のみ存在する変数で、ブラウザからの実行ではエラーになります。
http://localhost/_test/argv1.php
上のアドレスをブラウザから指定すると、以下のエラーが表示されます。
Notice: Undefined variable: argv in C:\xampp\htdocs\_test\argv1.php on line 3 NULL Notice: Undefined variable: argc in C:\xampp\htdocs\_test\argv1.php on line 5 NULL
コメント