在PHP中更改本机getopt的已解析参数($ argv)

时间:2013-11-14 01:45:54

标签: php command-line-interface argv getopt

我有两个用于命令行的PHP脚本:

  1. standalone.php:使用原生getopt()函数的独立脚本。
  2. shell-loop.php:一个类似shell的接口,重复读取一行,必要时退出,否则将带有在这个'shell'环境中定义的一些附加内容的输入传递给通过包含调用的独立脚本
  3. 由于独立脚本使用getopt(),我想在包含之前更改它在shell循环脚本中解析的参数列表。我已经尝试将$ argv和$ _SERVER ['argv'](分别是argc)设置为新值,但似乎getopt()不读取这些变量,但是 - 所以我假设 - 它直接访问传递给php的参数。 (除非我犯了一些愚蠢的错误..)

    所以我的问题是:getopt()使用的参数列表是否可以在php脚本中轻易改变,怎么做?如果没有,出于好奇的考虑,我也想知道是否有一种肮脏的方式去做?

    壳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);
    
    在include(带有实际参数)之前的

    和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)
      }
    }
    

    引用here的第三方getopt类可以完成这项工作,是的。

    当我有空的时候,我会查看php的getopt实现,但是认为在这里回答问题可能会很有趣..

    从结构上讲,这种方法在我的案例中是有道理的,但是我可以采用不同的方式。

0 个答案:

没有答案