1

コマンドラインで使用する 2 つの PHP スクリプトがあります。

  1. standalone.php: ネイティブのgetopt()関数を使用するスタンドアロン スクリプト。
  2. 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 の実装を調べてみますが、ここで質問に答えてもらうと面白いかもしれないと思いました..

構造的には、このアプローチは私の場合は理にかなっていますが、別の方法で行うこともできます。

4

0 に答える 0