web-dev-qa-db-fra.com

Manière correcte de déclarer plusieurs vars dans PHP

Je code des scripts personnels depuis des années dans PHP et je m'habitue à désactiver l'affichage des erreurs. Je suis sur le point de publier certains de ces scripts et j'aimerais le faire comme il convient.

La seule raison pour laquelle je désactive l'affichage des erreurs est d'éviter de tester chaque variable avant de l'utiliser, grâce à isset ().

Voici donc ma question:

Y at-il un meilleur moyen de déclarer plusieurs vars que cela?

<?php
  // at the begining of my main file
  if (!isset($foo))  ($foo = '');
  if (!isset($bar))  ($bar = '');
  if (!isset($ping)) ($ping = '');
  if (!isset($pong)) ($pong = '');
  // etc. for every single var
?>

Quelque chose comme ça par exemple:

<?php
  var $foo, $bar, $ping, $pong;
?>
45
Tom Biakryek
<?php
  $foo = $bar = $ping = $pong = '';
?>

Si c'est votre script et que vous savez quelles variables vous utilisez, pourquoi voulez-vous que les ressources passent à vérifier si la variable a été déclarée avant?

77
DaneSoul

J'ai posté ceci dans un commentaire plus tôt, mais quelqu'un m'a suggéré de le soumettre comme réponse.

Le moyen le plus simple et le plus simple auquel je puisse penser est de faire: 

$foo = $bar = $ping = $pong = '';

Je préfère souvent définir les éléments comme faux, plutôt que comme une chaîne vide, afin que vous puissiez toujours effectuer des contrôles dans le futur avec === faux, mais ce n'est qu'une préférence et dépend de la façon dont vous utilisez ces variables et de quoi.

11
pocketfullofcheese

Votre tentative if() avec isset() est la bonne façon de le faire!

Mais vous pouvez l'écrire un peu plus court/plus lisible en utilisant Opérateur Ternaire :

$foo = isset($foo) ? $foo : '';

Le premier $foo sera défini sur la valeur après le ? lorsque la condition située après le = est vraie, sinon, elle sera définie sur la valeur après le :. La condition (entre = et ?) sera toujours convertie en booléen. 

Depuis PHP 5.3 vous pouvez l'écrire encore plus court:

$foo = isset($foo) ?: '';

Cela définira $foo sur TRUE ou FALSE (en fonction de ce que isset() renvoie), comme indiqué par @Decent Dabbler dans les commentaires. Supprimer isset() le définira sur '', mais émettra également un avis de variable non défini (pas en production cependant).

Depuis PHP 7, vous pouvez utiliser un opérateur null coalesce:

$foo = $foo ?? '';

Cela ne produira aucune erreur, mais il sera évalué comme étant TRUE si $foo existe et est vide, par opposition à l'opérateur ternaire abrégé, qui évaluera comme FALSE si la variable est vide.

8
powtac

Une façon quelque peu arrondie de le faire est de placer le nom de vos variables dans un tableau, puis de les boucler avec un opérateur ternaire, similaire à la réponse de powtac.

$vars = array('foo', 'bar', 'ping', 'pong');
$defaultVar = '';

foreach($vars as $var)
{
    $$var = isset($$var) ? $$var : $defaultVar;
}

Comme mentionné dans d'autres réponses, depuis la version 5.3, PHP vous permet d'écrire le code ci-dessus comme suit:

$vars = array('foo', 'bar', 'ping', 'pong');
$defaultVar = '';

foreach($vars as $var)
{
    $$var = isset($$var) ?: $defaultVar;
}

Notez l'opérateur ternaire modifié.

5
Connor Deckers

Pourquoi ne pas simplement les définir?

<?php
$foo = '';
$bar = '';
//etc
?>

Si vous essayez de préserver leur valeur, alors oui, c'est la bonne manière en général. Notez que vous n'avez pas besoin de la deuxième paire de crochets dans vos déclarations:

if (!isset($foo)) $foo = '';

est assez.

0
jli

Pour résoudre le problème de 

  <?php
  $foo = $bar = $ping = $pong = '';
  ?>

lancement 

Remarque: Variable non définie: ...

  <?php
  @$foo = $bar = $ping = $pong = '';
  ?>

Cela ne résoudra pas le problème mais ne sera pas affiché et le script ne sera pas arrêté lors de l'analyse syntaxique.

0
c0d3x1337