Si estás escribiendo una aplicación de consola en PHP, la mejor forma de leer los parámetros que recibes, es usando la función getopt
.
Cómo trabajar con opciones
Veamos un ejemplo sencillo, imagina que tu aplicación puede recibir 2 opciones: a
y b
. Deseas que tu programa pueda ser invocado de cualquiera de estas formas: cmd.php -ab
cmd.php -a -b
cmd -a
Entonces el código que debes escribir es algo como esto:
<?php
$opc = getopt('ab');
if (isset($opc['a']))
{
//Codigo a ejecutar cuando se envia parametro a
print("Se recibe parametro 'a' \n" );
}
if (isset($opc['b']))
{
//Codigo a ejecutar cuando se envia parametro b
print("Se recibe parametro 'b' \n" );
}
?>
Ahora puedes probar el programa y verás que detecta cuando has enviado las opciones que esperas.

En el código anterior cuando llamamos a la función getopt('ab')
recibimos un arreglo (array) en donde nos incluye las opciones con que se llamó el programa, y le decimos que las opciones válidas son a
y b
Podemos usar la función var_dump
para consultar el resultado de la función y así tener una mejor idea de como trabaja.
Cómo trabajar con opciones que incluyen un valor
Ahora veremos otro ejemplo, imagina que estás haciendo un programa para crear un archivo de log, y tienes un parámetro -n
en donde debes recibir el nombre del archivo y además puedes recibir un parámetro -s
el cual indica que si el archivo ya existe, puedes sobreescribirlo. El código seria algo como esto:
<?php
$opc = getopt("sn:");
$sobrescribir = false;
if (isset($opc['s']))
{
$sobrescribir = true;
}
if ( isset($opc['n']) && $opc['n'] != "")
{
print("Se crear el archivo " . $opc['n'] . ' con opcion sobreescribir: ' . ($sobrescribir ? 'Si' : 'No' ) );
}
else {
print("ERROR: Se requiere el nombre del archivo");
}
?>

La diferencia ahora está en que llamamos a la función de esta forma: getopt("sn:")
, esos dos puntos después de la letra n
significa que ese parámetro puede recibir un valor adicional. Para leer el valor que nos envían usamos $opc['n']
Cómo trabajar con argumentos con nombres largos
Cuando trabajamos con programas de consola, existe otro tipo de argumentos con un nombre más largo, por ejemplo cmd.php --add
o cmd.php --nombre="Luis" --sobrescribir
Aquí hay un ejemplo de cómo trabajar con versiones largas:
<?php
$opc = getopt("", array('sobreescribir', 'nombre:'));
//Trasladar nombres largos a cortos...
$sobrescribir = false;
if (isset($opc['sobreescribir']) )
{
$sobrescribir = true;
}
if ( isset($opc['nombre']) && $opc['nombre'] != "")
{
print("Se crear el archivo " . $opc['nombre'] . ' con opcion sobreescribir: ' . ($sobrescribir ? 'Si' : 'No' ) );
}
else {
print("ERROR: Se requiere el nombre del archivo");
}
?>

La diferencia aquí, es que usamos el segundo parámetro de la función getopt
y el enviamos un array con los parámetros que podemos recibir: $opc = getopt("", array('sobreescribir', 'nombre:'));