1

我有两个 PHP 脚本供命令行使用:

  1. Standalone.php:使用本机getopt()函数的独立脚本。
  2. shell-loop.php:一个类似于 shell 的接口,它重复读取一行,必要时退出,否则将输入以及在这个“shell”环境中定义的一些添加传递给通过包含调用的独立脚本

由于独立脚本使用 getopt() 我想在包含之前更改它在 shell-loop 脚本中解析的参数列表。我尝试将 $argv 和 $_SERVER['argv'] (分别为 argc )设置为新值,但似乎 getopt() 不会读取这些变量,但是 - 所以我假设 - 它直接访问传递给 php 的参数。(除非我犯了一些愚蠢的错误..)

所以我的问题是:getopt() 使用的参数列表是否可以轻松地从 php 脚本中更改,如何更改?如果没有,出于好奇,我还想知道是否有一种肮脏的方式来做到这一点?

外壳循环.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