2

我不确定这是否可能,但我需要做一个肮脏的黑客。假设我从 cli 调用 php

php script.php one two

然后在script.php中我正在使用two参数做一些事情,然后我想删除它,所以后来包含的第三方代码认为初始命令是

php script.php one

我试过了unset($argv[2])unset($GLOBALS['argv'][2])但这不起作用。毕竟我想做的事有可能吗?

更新:不起作用=我从第三方代码“太多参数”中得到异常

更新:当然应该是 argv[1],但这只是这个问题的错字,而不是实际问题。请假设我已经写了 argv[1] :)

4

4 回答 4

6

您正在尝试使用 删除第三个元素unset($argv[2])

数组是从零开始的。因此,要删除第二个元素,请使用:

unset($argv[1])

于 2012-12-05T09:58:31.897 回答
2

在 php 脚本中操作 $argc 和 $argv 是不可能的 AFAIK。这是因为这些值不是脚本本身的一部分,而是在调用范围内定义的。

作为替代方案,您可以复制数组,弹出最后一个参数并使用 exec() 或 system() 调用“第三方代码”并移交缩减的副本。

于 2012-09-28T10:40:22.020 回答
1

您可以更改变量的值:

  • $argv
  • $argc
  • $_SERVER['argv']
  • $_SERVER['argc']
  • $GLOBALS['argv']
  • $GLOBALS['argc']

这可能会影响用 PHP 编写的依赖此变量的代码。(这可能已经是你想要的了)。

我发现无法在后台更改 argv 和 argc 以getopt()影响 PHP 内部函数的行为。

于 2012-12-14T01:04:49.163 回答
0

是的,如果您愿意,您可以更改此设置。

我将此代码用于正在运行的 cli 脚本

foreach( $argv as $key => $arg )
  if( $arg == '-s' )
  {
    $s = $argv[ ++$key ];
    unset( $argv[   $key ], $_SERVER[ 'argv' ][ $key ] );
    unset( $argv[ --$key ], $_SERVER[ 'argv' ][ $key ] );
    $argv = array_values( $argv );
    $_SERVER[ 'argc' ]--;
    break;
  }
于 2012-12-13T13:23:48.397 回答