コマンドラインで使用する 2 つの PHP スクリプトがあります。
- standalone.php: ネイティブのgetopt()関数を使用するスタンドアロン スクリプト。
- shell-loop.php: 行を繰り返し読み取り、必要に応じて終了する、シェルのようなインターフェース
スタンドアロン スクリプトは getopt() を使用するため、含める直前にシェル ループ スクリプトで解析する引数リストを変更したいと考えています。$argv と $_SERVER['argv'] (それぞれ argc) を新しい値に設定しようとしましたが、getopt() はこれらの変数を読み取らないようですが、php に渡された引数に直接アクセスすると思います。(私が愚かな間違いを犯していない限り..)
だから私の質問は次のようになります: getopt() で使用される引数リストは、php スクリプト内から簡単に変更できますか? そうでない場合は、好奇心のために、それを行う汚い方法があるかどうかも疑問に思いますか?
shell-loop.php:
do {
echo "> ";
$cmd = trim(fgets(STDIN));
if (in_array($cmd,array('exit','bye')))
{
break;
}
$argv = explode(' ',$cmd);
// .. add some options here
array_unshift($argv,'--option1');
array_unshift($argv,'--option2');
// ...
$argc = count($argv);
$_SERVER['argv'] = $argv;
$_SERVER['argc'] = $argc;
// standalone.php relies on getopt() to get any optional parameters
include __DIR__ . '/standalone.php';
} while(true);
インクルード前の var_dump($GLOBALS) (実引数付き):
array(10) {
["GLOBALS"]=>
*RECURSION*
["argv"]=>
array(5) {
[0]=>
string(6) "bt.php" <- inserted option
[1]=>
string(4) "--nl" <- inserted option
[2]=>
string(1) "-" <- inserted option
[3]=>
string(2) "on"
[4]=>
string(2) "A1"
}
["argc"]=>
&int(5)
.. GET POST etc here ..
["_SERVER"]=>
array(30) {
.. many things here ..
["argv"]=>
array(5) {
[0]=>
string(6) "bt.php" <- inserted option
[1]=>
string(4) "--nl" <- inserted option
[2]=>
string(1) "-" <- inserted option
[3]=>
string(2) "on"
[4]=>
string(2) "A1"
}
["argc"]=>
int(5)
}
}
ここで参照されているサードパーティの getopt クラスは、はい。
時間があるときに php の getopt の実装を調べてみますが、ここで質問に答えてもらうと面白いかもしれないと思いました..
構造的には、このアプローチは私の場合は理にかなっていますが、別の方法で行うこともできます。