web-dev-qa-db-fra.com

Utilisation de l'opérateur ternaire sans l'instruction Else PHP

Pouvez-vous utiliser l'opérateur ternaire dans PHP sans l'instruction 'else' de clôture? Je l'ai essayé et ça retourne des erreurs. La recherche Google ne donne rien, alors je pense que la réponse est probablement non. Je voulais juste vérifier ici. Par exemple:

if ( isset($testing) {
  $new_variable = $testing;
}

Définira $ new_variable uniquement si $ testing existe. Maintenant je peux faire 

$new_variable = (isset($testing) ? $testing : "");

mais cela retourne une variable vide pour $ new_variable si $ testing n'est pas défini. Je ne veux pas d'une variable vide si elle n'est pas définie, je veux que la variable $ new_variable ne soit pas créée.

J'ai essayé

$new_variable = (isset($testing) ? $testing);

et il a renvoyé des erreurs. J'ai aussi essayé

$new_variable = (isset($testing) ? $testing : );

et il a également renvoyé des erreurs. Est-il possible d'utiliser l'opérateur ternaire sans la déclaration jointe else ou suis-je coincé pour l'écrire à la longue?

EDIT: Suivant les conseils de Rizier123, j'ai essayé de définir la partie "else" de l'équation sur NULL, mais cela finit toujours par ajouter une clé à un tableau. La valeur n'est pas là, mais la clé est, ce qui gâche mes plans. S'il vous plaît, permettez-moi d'expliquer davantage.

Le code va prendre un tas de variables $ _POST d'un formulaire et les utiliser pour les paramètres d'une classe stdClass, qui est ensuite utilisée pour les appels de méthode API. Certaines variables de formulaire n'existeront pas, car elles seront toutes appliquées à la même variable pour l'appel d'API, mais l'utilisateur ne peut en sélectionner qu'une. Par exemple, vous pouvez peut-être sélectionner 3 éléments, quel que soit l'élément que vous sélectionnez soit passé à la classe stdClass et les 2 autres n'existent pas. 

J'ai essayé ceci:

$yes_this_test = "IDK";
$setforsure = "for sure";
$list = new stdClass;
$list->DefinitelySet = $setforsure;
$list->MaybeSet = (isset($yes_this_test) ? $yes_this_test : NULL);
$list->MaybeSet = (isset($testing) ? $testing : NULL);
print_r($list);

Mais évidemment, MaybeSet est défini sur NULL car (isset ($ testing)) vient après (isset ($ yes_this_test) et renvoie

stdClass Object ( [DefinitelySet] => for sure [MaybeSet] => )

Je ne saurai pas dans quel ordre entreront les variables $ _POST, je ne peux donc pas vraiment le structurer de manière à m'assurer que la liste est traitée dans le bon ordre. 

Maintenant je sais que je peux faire quelque chose comme

if ( isset($yes_this_test ) {
  $list->MaybeSet = $yes_this_test;
}
elseif ( isset($testing) ) {
  $list->MaybeSet = $testing;
}

Mais j'espérais qu'il y avait un raccourci pour ce type de logique, car je devais en écrire des dizaines. Existe-t-il un opérateur similaire à l'opérateur ternaire utilisé pour les déclarations if/elseif?

17
Longblog

Depuis PHP 5.3 vous pouvez le faire:

!isset($testing) ?: $new_variable = $testing;

Comme vous pouvez le constater, la pièce n’est utilisée que si la condition est false , vous devez donc nier l’expression isset.

UPDATE

Depuis PHP 7.0 vous pouvez le faire:

$new_variable = $testing ?? '';

Comme vous pouvez le constater, il retourne son premier opérande s’il existe et n’est pas NULL; sinon, il retourne son deuxième opérande.

19
Daan

Réglez-le simplement sur NULL comme ceci:

$new_variable = (isset($testing) ? $testing : NULL);

La variable you renverrait false avec un contrôle isset().

Vous pouvez en savoir plus sur NULL dans le manuel.

Et une citation de là:

La valeur spéciale NULL représente une variable sans valeur . NULL est la seule valeur possible du type null.

Une variable est considérée comme étant null si:

  • il a été affecté à la constante NULL .
  • il a pas encore été réglé sur .
  • il a été désactivé ().
7
Rizier123

Vous pouvez également le faire (forme abrégée):

isset($testing) ? $new_variable = $testing : NULL;
0
Arnaud Anato