#!/usr/bin/php -f
<?php
printf ("%d parámetros\n", $argc);
for ($i = 0; $i < $argc; $i++)
printf ("Parametro %d -> %s\n", $i, $argv[$i]);
if ($argc != 2) {
fprintf (STDERR, "Solo un parámetro por favor\n");
exit (1);
}
printf ("Hola %s\n", $argv[1]);
?>PHP, ofrece un interfaz similar a C y Perl como suele ser habitual, utiliza una variable con el número de parámetros y otra que contiene una matriz con todos los parámetros recibidos desde la línea de comandos.
En PHP, el primer elemento de la matriz es el nombre del script que hemos ejecutado.
En PHP no podemos modificar el nombre de nuestro script que
psmuestra simplemente modificando el valor de$argv[0], sin embargo, podemos utilizarcli_set_process_title()para ello. Sin embargo, esto solo funciona en la versión CLI SAPI (en una página web tampoco tiene tanto sentido) y PHP debe haber sido compilaod con soporte para ello.
PHP dispone de un módulo similar a getopt pero con
algunas limitaciones. La principal es que, aun cuando podemos utilizar
parámetros largos y cortos, la versión PHP de getopt los
trata de forma separada, de forma que tenemos que hacer un poco más de
trabajo. La otra es que getopt no genera errores
automáticamente si, por ejemplo, un determinado flag no incluye su
valor.
A continuación mostramos un sencillo ejemplo que soluciona el primero de los problemas, pero no el segundo que haría el código bastante más largo:
#!/usr/bin/env php
<?php
// Parse options
$options = getopt("hi:o:", ["help", "input:", "output:"]);
$noptions = [
'h' => $options['h'] ?? $options['help'] ?? false,
'i' => $options['i'] ?? $options['input'] ?? "input.txt",
'o' => $options['o'] ?? $options['output'] ?? "output.txt",
];
//var_dump ($noptions);
// Help requested
if (isset($options['h']) || isset($options['help'])) {
$script = basename($argv[0]);
echo <<<USAGE
Usage:
php {$script} [options]
Options:
-h, --help Show this help message
-i, --input <file> Input file (default: input.txt)
-o, --output <file> Output file (default: output.txt)
USAGE;
exit(0);
}
// Input file
$inputFile = $noptions['i'];
$outputFile = $noptions['o'];
// Show result
echo "Input file: {$inputFile}" . PHP_EOL;
echo "Output file: {$outputFile}" . PHP_EOL;
?>Para unificar los argumentos cortos y largo, creamos una nueva tabla
hash en la que, con la ayuda del operador ?? unificamos los
valores en una misma clave.
El operador
??es equivalente al siguiente código:$foo = $bar ?? "valor por defecto"; $foo = isset ($bar) ? $bar : "valor por defecto";Que como podéis ver es bastante más corto.
Procesar todos los posibles errores no es especialmente complicado,
pero si tedioso y requiere bastante código. Razón por la que no
incluimos un ejemplo completo. Por ejemplo, si pasamos el argumento
-o que requiere un parámetro sin parámetro, el valor no se
incluye en el hashtable options, con lo cual debemos buscar
primero si el argumento se pasó en la lista original de argumentos y
luego comparar con el resultado de getopt.
RESUMEN
- PHP recibe los argumentos usando dos variables.
argccontiene el número de argumentos recibidos, yargvla lista de ellos - Los argumentos se reciben como un array de cadenas de caracteres
- PHP ofrece un módulo
getoptpara procesar los argumentos de la línea de comandos más fácilmente.
■
