PHP, передать параметры из командной строки в PHP скрипт

Я хочу передать параметры из интерфейса командной строки PHP, а затем читать значения с помощью PHP script, что-то вроде этого:

<?php
  $name1 = $argv[1];    
  echo $name1;
?>

Я передаю переменную из CLI следующим образом:

C:\xampp\php\php.exe name.php Robby

Вышеупомянутые работы, я получаю Robby как результат.

Но я хочу сделать что-то вроде этого:

C:\xampp\php\php.exe name.php -inputFirstName="Robby"

Чтобы пользователь был хорошо информирован о вводе правильных параметров в правильные места. Каков подходящий способ анализа этих параметров?

Ответы

Ответ 1

При вызове PHP script из командной строки вы можете использовать $argc, чтобы узнать, сколько параметров передано, и $argv для доступа к ним. Например, выполните следующие script:

<?php
    var_dump($argc); //number of arguments passed 
    var_dump($argv); //the arguments passed
?>

Вот так: -

PHP скрипт.php arg1 arg2 arg3

Выдает следующий вывод

int(4)
array(4) {
  [0]=>
  string(21) "d:\Scripts\script.php"
  [1]=>
  string(4) "arg1"
  [2]=>
  string(4) "arg2"
  [3]=>
  string(4) "arg3"
}

Подробнее см. $argv и $argc..

Чтобы сделать то, что вы хотите, скажем

PHP скрипт.php arg1=4

Вам нужно будет взорвать аргумент на знаке равенства: -

list($key, $val) = explode('=', $argv[1]);
var_dump(array($key=>$val));

Таким образом, вы можете иметь все, что хотите, перед значком равенства, не анализируя его, просто проверьте правильность пары ключ = > . Однако, это все немного отходов, просто проинструктируйте пользователя о правильном порядке передать аргументы.

Ответ 2

В то время как ответ верный, и вы можете сделать синтаксический анализ вручную, PHP также предлагает функцию getopt(), которая может быть действительно полезной здесь.

Также существуют объектно-ориентированные альтернативы (написанные на PHP, доступные в нескольких библиотеках), которые могут оказаться вам нужными. Googling для "php getopt" даст полезные результаты.

Ответ 3

Я использую этот довольно сжатый метод:

if($argc>1)
  parse_str(implode('&',array_slice($argv, 1)), $_GET);

который обрабатывал бы вызов, например:

PHP скрипт.php item1=4 item2=300

Отправляя его в $_GET, вы автоматически обрабатываете доступ к сети или CLI.

Для комментариев это делает следующее:

  • Если количество аргументов больше одного (поскольку первым элементом является имя script), выполните
  • Возьмите массив аргументов, исключая первый элемент
  • Превратите его в стандартный формат строки запроса с амперсандами.
  • используйте parse_str для извлечения в массив $_GET

Ответ 4

Вы можете анализировать пользовательский ввод в своей программе, ища конкретные строки, такие как -inputFirstName="x" (например, с использованием регулярных выражений), а затем установить правильную переменную в x.

Ответ 5

Функция getopt(), вероятно, является наиболее правильным ответом в случае вопроса. Тем более, что он был создан независимо от платформы PHP 5.3. В частном случае этого вопроса и разбора нескольких параметров одним из способов использования этой функции будет следующее:

$defaultValues = array("inputFirstName" => "");
$givenArguments = getopt("", array("inputFirstName:"));
$options = array_merge($defaultValues, $givenArguments);
$inputFirstName = $options['inputFirstName'];

Вызов для установки $inputFirstName со значением "Robby":

> PHP скрипт.php --inputFirstName="Robby"

Объяснение

Значения по умолчанию для всех ожидаемых параметров устанавливаются в массиве $defaultValues. Ввод, отправленный через аргументы командной строки, собирается функцией PHP getopt и сохраняется $givenArguments. Обратите внимание, что двоеточие (:) в конце строки "inputFirstName:" указывает, что это необязательный аргумент. Без двоеточия здесь будет обнаружено только наличие аргумента, а не фактическое значение (больше информации в Руководстве по PHP). Объединение этих двух массивов вместе в третьей строке приводит к массиву со всеми ожидаемыми параметрами, заданными либо значениями по умолчанию, либо аргументами, предоставленными из командной строки/терминала, если они доступны.