PHP CLI: удалить последний элемент из ARGV

Я не уверен, возможно ли это, но мне нужно сделать грязный взлом. Предположим, я вызываю php из cli

php script.php one two

затем в script.php я что-то делаю с параметром two, а затем я хотел бы удалить его, поэтому сторонний код, который включается позже, подумал, что исходная команда была

php script.php one

Я пробовал unset($argv[2]) и unset($GLOBALS['argv'][2]), но это не работает. Возможно ли то, что я пытаюсь сделать?

ОБНОВЛЕНИЕ: не работает = я получаю исключение из стороннего кода "Слишком много аргументов"

ОБНОВЛЕНИЕ: конечно, это должно быть argv[1], но это опечатка только в этом вопросе, а не в самой проблеме. Предположим, я написал argv[1] :)


person mkk    schedule 28.09.2012    source источник
comment
Что значит «не работает»?   -  person arkascha    schedule 28.09.2012
comment
Кажется, это работает для меня, unset() -ing или array_pop() оба.   -  person complex857    schedule 28.09.2012


Ответы (4)


Управление $argc и $argv из php-скрипта невозможно, насколько мне известно. Это связано с тем, что значения не являются частью самого скрипта, а определяются в вызывающей области.

В качестве альтернативы вы можете скопировать массив, вытолкнуть последний аргумент и вызвать «сторонний код», используя exec() или system() и передав уменьшенную копию.

person arkascha    schedule 28.09.2012

Вы пытаетесь удалить третий элемент с помощью unset($argv[2]).

Массив начинается с нуля. Итак, чтобы удалить второй элемент, используйте:

unset($argv[1])

person Marco Balk    schedule 05.12.2012
comment
хе-хе, верно, я сделал опечатку в вопросе, но не в самой проблеме. Мне нужно передать несколько параметров в реальном коде, и я уверен, что в реальном случае я не допустил ошибку «один за другим» :) использовал дамп var для отладки, чтобы убедиться, что он исчез из массива и т. д. - person mkk; 05.12.2012

Вы можете изменить значения переменных:

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

Это может повлиять на код, написанный на PHP, который использует эти переменные. (И это может быть уже то, что вы хотите).

Я не нашел способа изменить argv и argc под капотом таким образом, чтобы можно было повлиять на поведение внутренних функций PHP, таких как getopt().

person hek2mgl    schedule 14.12.2012

Да, вы можете изменить это, если хотите.

Я использую этот код для скрипта 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;
  }
person superhero    schedule 13.12.2012