web-dev-qa-db-ja.com

PHP、パラメーターをコマンドラインからPHPスクリプトに渡す

PHP Command Line Interfaceからパラメーターを渡し、次にPHPスクリプト、次のようなものを使用して値を読み取ります。

<?php
  $name1 = $argv[1];    
  echo $name1;
?>

CLIから次のように変数を渡します。

C:\xampp\php\php.exe name.php Robby

上記の方法で、Robbyが出力されます。

しかし、私はこのような何かをしたい:

C:\xampp\php\php.exe name.php -inputFirstName="Robby"

そのため、正しい場所に正しいパラメーターを入力するようユーザーに十分に通知します。これらのパラメーターを解析する適切な方法は何ですか?

26
125369

コマンドラインからPHPスクリプトを呼び出す場合、$ argcを使用して、渡されたパラメーターの数と$ argvを使用してアクセスできます。たとえば、次のスクリプトを実行します。

<?php
    var_dump($argc); //number of arguments passed 
    var_dump($argv); //the arguments passed
?>

このような:-

php script.php arg1 arg2 arg3

次の出力が得られます

int(4)
array(4) {
  [0]=>
  string(21) "d:\Scripts\script.php"
  [1]=>
  string(4) "arg1"
  [2]=>
  string(4) "arg2"
  [3]=>
  string(4) "arg3"
}

詳細については、 $ argv および $ argc を参照してください。

あなたがしたいことをするために、言うことができます

php script.php arg1=4

等号の引数を分解する必要があります:

list($key, $val) = explode('=', $argv[1]);
var_dump(array($key=>$val));

そうすれば、等号を解析することなく、等号の前に必要なものを置くことができ、key => valueのペアが正しいことを確認するだけです。ただし、これは少し無駄です。引数を渡す正しい順序をユーザーに指示するだけです。

35
vascowhite

このかなり簡潔な方法を使用します。

if($argc>1)
  parse_str(implode('&',array_slice($argv, 1)), $_GET);

次のような呼び出しを処理します:

php script.php item1=4 item2=300

$ _GETに送信することにより、WebまたはCLIアクセスを自動的に処理します。

解説のために、これは次のことを行っています。

  • 引数の数が1より大きい場合(最初の項目はスクリプトの名前であるため)、続行します
  • 最初の項目を除く引数配列を取得します
  • アンパサンドを使用して標準のクエリ文字列形式に変換します
  • parse_strを使用して$ _GET配列に抽出します
13
NickM

答えは正解であり、手動で構文解析を行うこともできますが、PHPは、ここで実際に役立つかもしれないgetopt()関数も提供します。

また、必要なものになる可能性のあるオブジェクト指向の代替手段(PHPで作成され、多数のライブラリで利用可能)もあります。 「php getopt」をグーグルで検索すると、役立つ結果が得られます。

13
Konrad Neuwirth

getopt()関数は、おそらく質問の場合の最も正しい答えです。特にPHP 5.3でプラットフォームに依存しないようになったため、この質問の特定のケースで複数のパラメーターを解析する場合、この関数を活用する1つの方法は次のようになります。

$defaultValues = array("inputFirstName" => "");
$givenArguments = getopt("", array("inputFirstName:"));
$options = array_merge($defaultValues, $givenArguments);
$inputFirstName = $options['inputFirstName'];

値「Robby」で$ inputFirstNameを設定する呼び出しは次のようになります。

> php script.php --inputFirstName="Robby"

説明

予想されるすべてのパラメーターのデフォルト値は、$defaultValues配列に設定されます。コマンドライン引数を介して送信される入力は、PHPのgetopt関数によって収集され、$givenArgumentsによって保存されます。 :文字列の末尾のコロン("inputFirstName:")は、これが必須の引数であることを示していることに注意してください。ここにコロンがなければ、引数の存在のみが検出され、実際の値は検出されません( PHP Manual の詳細)。これら2つの配列を一緒にマージします。 3行目では、すべての期待されるパラメーターがデフォルト値またはコマンドライン/ターミナルから提供される引数が設定されている場合、それらのパラメーターが配列になります。

1
bnp887

ライブラリの使用を気にしない場合は、 Symfonyのコンソールコンポーネント をご覧になることをお勧めします。

コマンドラインアプリケーションの作成に使用でき、 引数とオプション の使用をサポートします。

ドキュメントページには、開始するための優れた例がいくつか含まれています。

もちろん、ボンネットの下では、vascowhiteで説明されているのと同じ手法を使用します。

0
Gijs de Jong