6.Le langage PHP

6.12.Les paramètres d'entrée d'un script PHP

6.12.2.En ligne de commande

En bref:
<?php
    $options = array('sv', // option
                     'av:', // option avec valeur
                     'vo::'); // option avec valeur optionnelle
    $params = getOpt('sa:o::', $options);
    if (array_key_exists('s', $params)) echo 'option -s activée'."\n";
    if (array_key_exists('a', $params)) {
        if (is_array($params['a'])) {
            echo 'option -a activée avec les valeurs:'."\n-".implode("\n-", $params['a'])."\n";
        } else echo 'option -a activée avec valeur '.$params['a']."\n";
    }
    if (array_key_exists('o', $params)) {
        if (false === $params['o']) 'option -o activée sans valeur'."\n";
        else if (is_array($params['o'])) {
            echo 'option -o activée avec les valeurs:'."\n-".implode("\n-", $params['o'])."\n";
        } else echo 'option -o activée avec valeur '.$params['o']."\n";
    }
    if (array_key_exists('sv', $params)) echo 'option --sv activée'."\n";
    if (array_key_exists('av', $params)) {
        if (is_array($params['av'])) {
            echo 'option --av activée avec les valeurs:'."\n-".implode("\n-", $params['av'])."\n";
        } else  echo 'option --av activée avec valeur '.$params['av']."\n";
    }
    if (array_key_exists('vo', $params)) {
        if (false === $params['vo']) 'option --vo activée sans valeur'."\n";
        else if (is_array($params['vo'])) {
            echo 'option --vo activée avec les valeurs:'."\n-".implode("\n-", $params['vo'])."\n";
        } else echo 'option --vo activée avec valeur '.$params['vo']."\n";
    }
    // Si la commande attend obligatoirement un (dernier) paramètre (en dehors des options)
    echo 'parametre principal = '.$argv[$argc-1]."\n";
?>
$ php monscript.php -s -a vala -o=valv --sv --av=valav --vo=valvo ciblephp in_short.php -s -a paramA -o=paramO --sv --av=paramAv --vo=paramVo cible

6.12.2.1.Introduction

Vous savez déjà, que pour exécuter un script PHP en ligne de commande il suffit de saisir une instruction du type: $ php script.php.
Mais maintenant, vous avez certainement envie de pouvoir passer des paramètres à ce script afin de l'utiliser avec telle ou telle option, sous l'une des formes suivantes:
  • $ php script.php chemin
  • $ php script.php --help
  • $ php script.php -v
  • $ php script.php -p motdepasse
  • $ php script.php -h -p motdepasse --simul chemin
Ce tutoriel, est là pour vous aider dans cette tâche. Dans un premier temps nous verrons comment, via le tableau $argv récupérer l'ensemble des éléments passés après le nom du script (éléments sont séparés par des espaces). Puis nous verrons comment la fonction getOpt() peut nous simplifier la vie dans la récupération des paramètres de type option.
Enfin, nous verrons comment (dans la vraie vie), une combinaison des 2 méthodes est généralement nécessaire.

6.12.2.2.Le tableau $argv

Au sein de votre script PHP, vous pouvez récupérer l'ensemble des paramètres qui ont été saisis dans la variable $argv pré-définie. $argv est un tableau indexé de 0 à "nombre d'arguments". A l'index 0 nous retrouvons le 1er paramètre de la commande php, autant dire le nom du script lui-même et dans les index suivants les paramètres du script.
La variable prédéfinie $argc, quant à elle, contient le nombre d'argument (autrement dit count($argv)).
Ainsi si l'on fait appel au script
<?php
var_dump($argv);
?>
avec la commande $ php monscript.php param1 param2 param3 nous aurons le résultat suivant
array(4) {
  [0]=>
  string(13) "monscript.php"
  [1]=>
  string(6) "param1"
  [2]=>
  string(6) "param2"
  [3]=>
  string(6) "param3"
}
Le tableau $argv permet de récupérer tous les paramètres et de les traiter comme bon nous semble mais cela peut être vite assez fastidieux lorsqu'il s'agit de manipuler des commandes avec des arguments dans un ordre non imposé, optionnels ou pas et suivis ou non de valeurs comme $ php monscript.php -v --max 3. Pour ce genre de manipulation nous aurons intérêt à nous orienter vers la fonction getOpt() objet du chapitre suivant.

6.12.2.3.La fonction getOpt()

6.12.2.3.1.Introduction

La fonction getOpt() peut permettre de traiter les options passées soit sous la forme courte (i.e. avec un seul tiret, ex. -h -v ou -xvf équivalent à -x -v -f) soit sous la forme longue (i.e. avec 2 tirets, ex. --help).
Dans tous les cas, il faudra préciser la liste des options possibles et pour chacune indiquer si elles doivent être accompagnées d'une valeur (ex: -m3, -m=3, --max3, --max=3 ou encore --m 3 ou --max 3 si la valeur n'est pas optionnelle) ou pas, et optionnelle ou pas.

6.12.2.3.2.Les options courtes

La configuration des options courtes se fait via le premier paramètre de la fonction. Il s'agit de passer une chaîne de caractères contenant les différentes options courtes (ex 'xvf' pour les options -x -v et -f). Si l'option doit être obligatoirement accompagnée d'une valeur on fera suivre la lettre du caractère ':'. Si l'option peut être (de façon optionnelle) accompagnée d'une valeur on fera suivre la lettre des caractères '::' (ex avec 'xv:f::' -x ne doit pas être suivi d'une valeur, -v doit être suivi d'une valeur et -f peut être suivi d'une valeur).
Le script suivant lancé par $ php monscript -x -v 3 -f=toto retournera
array(3) {
  ["x"]=>
  bool(false)
  ["v"]=>
  string(1) "3"
  [f]=>
  string(4) "toto"
}
Les valeurs des options avec valeur optionnelle doivent obligatoirement être accolées au nom de l'option ou séparées par un '=' (mais en aucun cas séparées par un espace). $ php monscript -x -v 3 -f toto (présence d'une valeur après un espace après une option à valeur optionnelle) retournera
array(3) {
  ["x"]=>
  bool(false)
  ["v"]=>
  string(1) "3"
  [f]=>
  bool(false)
}

6.12.2.3.3.Les options longues

La configuration des options longues se fait via le second paramètre de la fonction. Il s'agit de passer un tableau (indexé) ayant pour valeurs les noms des différentes options longues (ex 'help' pour l'option --help). Si l'option doit être obligatoirement accompagnée d'une valeur on fera suivre le nom de l'option par le caractère ':'. Si l'option peut être (de façon optionnelle) accompagnée d'une valeur on fera suivre le nom de l'option des caractères '::' (ex avec 'help' --help ne doit pas être suivi d'une valeur, avec 'help:' --help doit être suivi d'une valeur et avec 'help::' --help peut être suivi d'une valeur).
Le script suivant lancé par $ php monscript --sans-valeur --avec-valeur titi --valeur-optionnelle=toto retournera
array(3) {
  ["sans-valeur"]=>
  bool(false)
  ["avec-valeur"]=>
  string(4) "titi"
  ["valeur-optionnelle"]=>
  string(4) "toto"
}
Comme pour les options courtes, les valeurs des options avec valeur optionnelle doivent obligatoirement être accolées au nom de l'option ou séparées par un '=' (mais en aucun cas séparées par un espace).

6.12.2.3.4.Options courtes et longues

Il est bien entendu possible de mixer options courtes et options longues, en appelant la fonction avec les 2 paramètres à la fois.

6.12.2.3.5.Retour de la fonction

La fonction retourne un tableau associatif où les clés sont les noms des options (sans tiret en préfix) effectivement passées en paramètre et les valeurs sont soit la valeur associée, soit false (dans le cas d'une option sans valeur), soit encore un tableau de valeurs dans le cas où les options sont répétées.
Si en paramètre est passé une option sans valeur alors qu'un valeur est attendue, alors la fonction se comporte comme si l'option n'avait pas été précisée.
La présence d'une option non attendue ne lève pas d'erreur, tout comme l'absence d'une option possible (ce qui est la moindre des choses lorsque l'on parle d'option) .
Comme le montre les exemples suivants: $ php monscript -x -f=toto (absence de l'option -v) retournera
array(3) {
  ["x"]=>
  bool(false)
  [f]=>
  string(4) "toto"
}
Et $ php monscript -x -p -v 3 -f=toto (présence de l'option -p non attendue) retournera
array(3) {
  ["x"]=>
  bool(false)
  [v]=>
  string(1) "3"
  [f]=>
  string(4) "toto"
  }

6.12.2.4.$argv et getOpt() ensemble

Puisque la fonction getOpt() ne s'interesse qu'aux options, elle ne permet pas de couvrir tous les besoins. Il y a des cas où vous devrez avoir recours aux 2 façons de procéder (voire être obligé de vous rabattre sur l'option $argv seule).
Prenons le cas de la commande $ php contenudufichier.php -v monfichier, si l'objectif du script est d'afficher le contenu de 'monfichier' et que -v est une option supplémentaire (pour être un peu plus verbeux que la normale) vous devrez à la fois connaître les options passées (via getOpt()) et connaître le dernier argument de la ligne de commande (pour savoir quel fichier traiter).
Pour cela, il faut compléter le retour de getOpt() par la récupération du dernier paramètre de la commande via $argv[$argc-1], comme dans l'exemple suivant:
<?php
$cfg = getOpt('v');
$fichier = $argv[$argc-1];
$modeVerbeux = false;
if (array_key_exists('v', $cfg)) {
	$modeVerbeux = true;
}
if ($modeVerbeux) echo 'Contenu du fichier '.$fichier."\n";
readfile($fichier);
Ici vous pouvez apprendre :
Version imprimable: imprimer