48 votes

Valeurs par défaut des paramètres de la fonction PHP, comment "passer la valeur par défaut" pour les paramètres "not last" ?

La plupart d'entre nous connaissent la syntaxe suivante :

function funcName($param='value'){
    echo $param;
}
funcName();

Result: "value"

Nous nous demandions comment transmettre des valeurs par défaut pour le paramètre "not last" ? Je sais que cette terminologie est très éloignée, mais un exemple simple serait le suivant :

function funcName($param1='value1',$param2='value2'){
    echo $param1."\n";
    echo $param2."\n";
}

Comment pouvons-nous accomplir ce qui suit :

funcName(---default value of param1---,'non default');

Résultat :

value1
not default

J'espère que cela a un sens, nous voulons fondamentalement assumer les valeurs par défaut pour les paramètres qui ne sont pas les derniers.

Merci.

0 votes

Je ne comprends vraiment pas votre question / problème votre deuxième exemple fonctionne bien

0 votes

Le problème n'est pas que la fonction

1 votes

Je m'excuse de ne pas avoir été clair. Mais franchement, je ne sais pas comment exprimer 'assumer la valeur par défaut pour un paramètre qui n'est PAS le dernier de la liste des paramètres'.

58voto

MrCode Points 34968

PHP ne supporte pas ce que vous essayez de faire. La solution habituelle à ce problème est de passer un tableau d'arguments :

function funcName($params = array())
{
    $defaults = array( // the defaults will be overidden if set in $params
        'value1' => '1',
        'value2' => '2',
    );

    $params = array_merge($defaults, $params);

    echo $params['value1'] . ', ' . $params['value2'];
}

Exemple d'utilisation :

funcName(array('value1' => 'one'));                    // outputs: one, 2
funcName(array('value2' => 'two'));                    // outputs: 1, two
funcName(array('value1' => '1st', 'value2' => '2nd')); // outputs: 1st, 2nd
funcName();                                            // outputs: 1, 2

En utilisant ceci, tous les arguments sont facultatifs. En passant un tableau d'arguments, tout ce qui est dans le tableau va remplacer les valeurs par défaut. Ceci est possible grâce à l'utilisation de array_merge() qui fusionne deux tableaux, en remplaçant le premier tableau par tout élément dupliqué dans le second tableau.

2 votes

Cela semble être la façon la plus propre de faire les choses. Bien que légèrement gonflée (ce n'est pas votre faute... phps, pour ne pas l'avoir disponible)...

1 votes

Les arguments nommés sont disponibles depuis PHP 8.0 : stackoverflow.com/a/64072408/7082164

13voto

Jeroen Points 7500

Malheureusement, ce n'est pas possible. Pour contourner ce problème, je vous suggère d'ajouter la ligne suivante à votre fonction :

$param1 = (is_null ($param1) ? 'value1' : $param1);

Vous pouvez alors l'appeler comme ceci :

funcName (null, 'non default');

Result:

value1
non default

3 votes

Les parenthèses extérieures apportent-elles un avantage ? Il semble que cela fonctionnerait tout aussi bien avec $param1 = is_null ($param1) ? 'value1' : $param1;

0 votes

J'utilise les parenthèses pour plus de clarté pour le codeur. Le débogage est une affaire coûteuse, demandez à vos clients ;)

4voto

Jsowa Points 4130

Mise à jour de PHP 8.0

La solution que vous souhaitez est disponible depuis PHP 8.0 : arguments nommés

function funcName($param1 = 'value1', $param2 = 'value2', $param3 = 'value3') {
    ...
}

Auparavant, vous deviez passer une valeur en tant que $param1 , soit null ou la valeur par défaut, mais maintenant vous pouvez seulement passer un deuxième paramètre.

funcName(param2: 'value');

Et vous n'avez pas besoin de vous soucier de l'ordre des arguments.

funcName(param2: 'value', param3: 'value');

//is the same as

funcName(param3: 'value', param2: 'value');

De plus, il y a des choses fantaisistes que nous pouvons faire avec des arguments nommés, comme passer un tableau comme arguments. C'est utile lorsque nous ne savons pas quelles clés exactes nous stockons dans un tableau et que nous n'avons plus besoin de nous soucier de l'ordre des variables.

$args = [
    'param3' => 'value',
    'param2' => 'value',
];

funcName(...$args);

//works the same as

funcName(param2: 'value', param3: 'value');

Nous n'avons même pas besoin de nommer nos valeurs dans un tableau comme arguments (bien sûr jusqu'à ce que nous fassions correspondre l'ordre des arguments).

$args = [
    'value1',
    'param3' => 'value3',
    'param2' => 'value2',
];

funcName(...$args);

//works the same as

funcName(param1: 'value1', param3: 'value3', param2: 'value2');

//and

funcName('value1', 'value2', 'value3');

1voto

Rohit Pavaskar Points 308

La solution simple de votre problème est, au lieu d'utiliser :

funcName(---default value of param1---,'non default');

Utilisez la syntaxe suivante :

funcName('non default',---default value of param1---);

Exemple :

function setHeight2($maxheight,$minheight = 50) {
    echo "The MAX height is : $maxheight <br>";
    echo "The MIN height is : $minheight <br>";
}

setHeight2(350,250);
setHeight2(350); // will use the default value of 50

0voto

Kane Points 1

Vous pouvez utiliser '_' pour référencer la constante indéfinie et continuer à passer des variables après cela.

Par exemple (en élargissant à partir de votre exemple) :

function funcName($param1='value1',$param2='value2'){
    echo $param1."\n";
    echo $param2."\n";
}

En appelant la fonction comme ceci :

funcName('_','Some Pass value');

Le résultat serait le suivant :

value1
Some Pass value

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X