Question
Cette question concerne la fonction getopt en php. Je dois passer deux paramètres aux scripts php comme
php script.php -f filename -t filetype
Maintenant, en fonction du type de fichier qui peut être u, c ou s que je dois faire le bon fonctionnement.
J'utilise le cas de commutation pour le même:
Voici le code que je me sers:
// Get filename of input file when executing through command line.
$file = getopt("f:t:");
boîtier de commutateur doit comparer le type de fichier qui je passe à partir de la ligne de commande (u, c ou i) et faire correspondre en conséquence et effectuer l'opération.
switch("I am not sure what should go in there and this is wrong,Please advice")
{
case `Not sure`:
$p->ini();
break;
case `Not sure`:
$p->iniCon();
break;
case `Not sure`:
$p->iniImp();
break;
}
vous prie de nous sur ce !!!
La solution
Si vous venez de mettre quelque chose comme ça dans votre script PHP (appelé, sur ma machine, temp.php
) :
<?php
$file = getopt("f:t:");
var_dump($file);
Et appeler à partir de la ligne de commande, en passant ces deux paramètres:
php temp.php -f filename -t filetype
Vous obtiendrez ce genre de sortie:
array(2) {
["f"]=>
string(8) "filename"
["t"]=>
string(8) "filetype"
}
Ce qui signifie que:
-
$file['f']
contient la valeur passée pour-f
- et
$file['t']
contient la valeur passée pour-t
A partir de là, si vous voulez que votre switch
dépendre de l'option passée en tant que valeur de -t
, vous utiliserez quelque chose comme ceci:
switch ($file['t']) {
case 'u':
// ...
break;
case 'c':
// ...
break;
case 'i':
// ...
break;
}
En gros, vous mettez:
- La variable que vous voulez tester dans le
switch()
- Et les valeurs possibles dans les
case
s
Et, pour plus d'informations, vous pouvez lire, dans le manuel PHP:
Autres conseils
Je mis en place un analyseur getopt pour cela, un soutien à court, noms long option, contrainte de type, impression option .. etc, et cette bibliothèque a été maintenue pendant 6 ans.
Synopsis:
<?php
use GetOptionKit\OptionCollection;
use GetOptionKit\OptionParser;
$options = new OptionCollection;
$spec = $options->add( 'f|foo:' , 'option require value' ); # returns spec object.
$options->add( 'b|bar+' , 'option with multiple value' );
$options->add( 'z|zoo?' , 'option with optional value' );
$options->add( 'f|foo:=i' , 'option require value, with integer type' );
$options->add( 'f|foo:=s' , 'option require value, with string type' );
$options->add( 'v|verbose' , 'verbose flag' );
$options->add( 'd|debug' , 'debug flag' );
$parser = new OptionParser;
$result = $parser->parse( array( 'program' , '-f' , 'foo value' , '-v' , '-d' ) );
$result = $parser->parse( $argv );
$spec = $result->verbose;
$spec = $result->debug;
$spec->value; # get value
GetOptionKit \ OptionPrinter peut imprimer des options pour vous:
* Available options:
-f, --foo option requires a value.
-b, --bar option with multiple value.
-z, --zoo option with optional value.
-v, --verbose verbose message.
-d, --debug debug message.
--long long option name only.
-s short option name only.
Démo
S'il vous plaît vérifier examples/demo.php
.
Exécuter:
% php examples/demo.php -f test -b 123 -b 333
Imprimer:
* Available options:
-f, --foo <value> option requires a value.
-b, --bar <value>+ option with multiple value.
-z, --zoo [<value>] option with optional value.
-v, --verbose verbose message.
-d, --debug debug message.
--long long option name only.
-s short option name only.
Enabled options:
* key:foo spec:-f, --foo <value> desc:option requires a value.
value => test
* key:bar spec:-b, --bar <value>+ desc:option with multiple value.
Array
(
[0] => 123
[1] => 333
)
GetOptionKit est sur GitHub: https://github.com/c9s/GetOptionKit
Il y a un problème dans votre approche. Et si l'utilisateur donne la ligne de commande suivante par erreur. le script ne sera pas en mesure de détecter et d'échouer comme $file['t']
sera un tableau.
php temp.php -f filename -t filetype -f filename2