php コンソールから実行したときの引数の取得

コマンドラインで実行したときのオプションを引数として受け取りたい

作成日:2021-02-08, 更新日:2021-02-08

引数の数を取得

・「$argc」を使う
・ファイル名もカウントされるので最低でも「1」(・・・phpコマンドの引数の一つ目がファイル名ってコトかな?)

サンプル

var_dump($argc);

▼結果

> php 〇〇〇.php
int(1)

> php 〇〇〇.php a1 b2 c3
int(4)

引数の値を取得

・「$argv」を使う

サンプル

var_dump($argv);

▼結果

> php 〇〇〇.php
array(1) {
  [0]=>
  string(xx) ".\〇〇〇.php"
}

> php 〇〇〇.php -a1 -b2 -c3
array(4) {
  [0]=>
  string(xx) ".\〇〇〇.php"
  [1]=>
  string(3) "-a1"
  [2]=>
  string(3) "-b2"
  [3]=>
  string(3) "-c3"
}

引数をキー・バリュー形式で取得

・「getopt()」を使う(※getopt( string $short_options, array $long_options=[], int &$rest_index=null ))
・オプションが「-」と「--」で微妙に異なる
・キーとバリューは空白不要

※詳細:PHP: getopt - Manual

「-」付きのオプションと値をキー・バリューで取得

・キー名は1文字の英数のみ
・「getopt()」の引数の一つ目を使う
・指定したオプションのみ引数として取得可能
・引数の値は「必須、任意、不許可」と設定可能

「:(コロン)」の数

「:(コロン)」の数 内容 例)「-a」と「-b」を取得
2 値は任意
getopt('a::b::')
1 値は必須
getopt('a:b:')
0 値は拒否
getopt('ab')

サンプル

コマンド 値は任意

var_dump(getopt('a::1::'));
値は必須

var_dump(getopt('a:1:'));
値は拒否

var_dump(getopt('a1'));
> php 〇〇〇.php -a9 -1b
array(2) {
  ["a"]=>
  string(1) "9"
  [1]=>
  string(1) "b"
}
array(2) {
  ["a"]=>
  string(1) "9"
  [1]=>
  string(1) "b"
}
array(2) {
  ["a"]=>
  bool(false)
  [1]=>
  bool(false)
}
> php 〇〇〇.php -a9 -1
array(2) {
  ["a"]=>
  string(1) "9"
  [1]=>
  bool(false)
}
array(2) {
  ["a"]=>
  string(1) "9"
}
array(2) {
  ["a"]=>
  bool(false)
  [1]=>
  bool(false)
}
> php 〇〇〇.php -a9
array(1) {
  ["a"]=>
  string(1) "9"
}
array(1) {
  ["a"]=>
  string(1) "9"
}
array(1) {
  ["a"]=>
  bool(false)
}

ダメな例

オプション名を2文字以上にしたいときのダメな例

var_dump(getopt('year::'));

▼結果

> php 〇〇〇.php -year2021
array(3) {
  ["y"]=>
  bool(false)
  ["e"]=>
  bool(false)
  ["a"]=>
  string(5) "r2021"
}

「--」付きのオプションと値をキー・バリューで取得

「-」付きのオプションの設定と基本は同じだけど、下記が異なる
・キー名は2文字以上でもOK
・キー名と値はに空白
・「getopt()」の引数の2つ目を使う
・区切り文字の指定が省くと取得できないことがある

$short_rule_argv = '';
$long_rule_argv = array(
  'a::',
  '1::',
  'year::',
);
var_dump(getopt($short_rule_argv, $long_rule_argv));

※「:(コロン)」の数の指定は上記と同じ

区切り文字「=」を使う

> php 〇〇〇.php --a=9 --1=b --year=2021
array(3) {
  ["a"]=>
  string(1) "9"
  [1]=>
  string(1) "b"
  ["year"]=>
  string(4) "2021"
}

区切り文字を半角空白にした場合

> php 〇〇〇.php --a 9 --1 b --year 2021
array(1) {
  ["a"]=>
  bool(false)
}

空白入りの値を渡したい

> php 〇〇〇.php --a="9 8" --1="b c" --year="202 1"
array(3) {
  ["a"]=>
  string(3) "9 8"
  [1]=>
  string(3) "b c"
  ["year"]=>
  string(5) "202 1"
}

メモ

▼「a"b」みたいに「"」も値に含めて渡したいけど出来なかった
・「php 〇〇〇.php a"b」
・「php 〇〇〇.php "a""b"」
・「php 〇〇〇.php "a\"b"」
・「php 〇〇〇.php "a""b"」
※「$argv」のほうも確認したけど出来なかった
※「a"b」じゃなく「a'b」だと渡すことはできた(※「"」で囲む必要はあるっぽい:「php 〇〇〇.php "a'b"」)

どうしても「"」を渡したければ・・・方法はあるだろうけど、「"」を渡す予定がないので・・・未調査。