【问题标题】:PHP CLI: remove last element from ARGVPHP CLI:从 ARGV 中删除最后一个元素
【发布时间】:2012-12-14 11:36:30
【问题描述】:

我不确定这是否可能,但我需要做一个肮脏的黑客。 假设我正在从 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] :)

【问题讨论】:

  • “不起作用”是什么意思?
  • 它似乎对我有用,unset() -ing 或 array_pop() 两者。

标签: php argv


【解决方案1】:

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

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

unset($argv[1])

【讨论】:

  • 嘿嘿对了,我在问题中打错了,但在实际问题中没有。我必须在真实代码中传递一些参数,并且我确信在真实案例中我没有犯过一个错误:) 使用 var dump 进行调试,确保它从数组中消失,等等。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以更改变量的值:

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

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

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

    【讨论】:

      【解决方案4】:

      是的,如果你愿意,你可以改变它。

      我将此代码用于我正在运行的 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;
        }
      

      【讨论】:

        猜你喜欢
        • 2020-02-19
        • 2012-01-05
        • 2015-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        相关资源
        最近更新 更多