43 votes

Si vous créez une variable dans une instruction if, est-elle disponible en dehors de l'instruction if ?

Si vous avez une déclaration "si" comme celle-ci :

<?php
$a = 1;
$b = 2;
if ($a < $b) {
$c = $a+$b;
}
?>

Serait-il possible d'accéder à la variable $c en dehors de l'instruction if comme ceci :

<?php
$a = 1;
$b = 2;
if ($a < $b) {
$c = $a+$b;
}
echo $c
?>

68voto

rid Points 24625

En PHP, if n'a pas sa propre portée. Donc oui, si vous définissez quelque chose à l'intérieur de l'élément if ou à l'intérieur du bloc, il sera disponible comme si vous l'aviez défini à l'extérieur (en supposant, bien sûr, que le code à l'intérieur du bloc ou de l'instruction if s'exécute).

Pour illustrer :

if (true)  { $a = 5; }    var_dump($a == 5);   // true

La condition est évaluée à true pour que le code à l'intérieur du bloc soit exécuté. La variable $a est défini.

if (false) { $b = 5; }    var_dump(isset($b)); // false

La condition est évaluée à false pour que le code à l'intérieur du bloc ne soit pas exécuté. La variable $b ne sera pas défini.

if ($c = 5) { }           var_dump($c == 5);   // true

Le code à l'intérieur de la condition s'exécute et $c est défini comme suit 5 ( $c = 5 ). Même si l'affectation se fait à l'intérieur de la if la valeur survit à l'extérieur, car if n'a pas de portée. La même chose se produit avec for comme dans, par exemple, for ($i = 0, $i < 5; ++$i) . Le site $i survivra en dehors de la for boucle, car for n'a pas non plus de portée.

if (false && $d = 5) { }  var_dump(isset($d)); // false

false courts-circuits et l'exécution n'arrive pas à $d = 5 donc le $d ne sera pas définie.

Pour en savoir plus sur le champ d'application de PHP, lisez le portée variable page du manuel.

12voto

RétroX Points 616

Le champ d'application de PHP est entièrement basé sur les fonctions. Ce n'est pas la même chose qu'en C ou en Java où les variables sont imbriquées dans un bloc particulier.

Pour la portée de PHP :

// Global variable
$a = 0;

function f()
{
  // Cannot be accessed outside of f()
  if (true)
    $b = 0;

  // However, it can still be accessed anywhere in f()
  $b += 1;
}

Si vous voulez qu'une variable soit globale, il suffit d'utiliser le mot-clé global :

// Global variable
$a = 0;

function f()
{
  // Use $a from global scope
  global $a;

  // Modifies global $a
  $a += 1;
}

function g()
{
  // Use $b from global scope, even though it hasn't been defined yet
  global $b;

  // Can be accessed outside of g()
  $b = 0;

  // Cannot be accessed outside of g(); this $a "shadows" the global version
  // The global $a is still 0
  $a = 1;
}

5voto

user3413723 Points 99

Si le if contenant la variable a été exécutée, alors oui, vous pouvez accéder à la variable en dehors de l'instruction if. Voici pourquoi cela fonctionne de cette façon. Dans de nombreux langages de programmation, vous pouvez "déclarer" une variable avant de l'utiliser, afin que le compilateur sache qu'elle est là. Par exemple, en Java, vous pouvez déclarer une variable 'int', puis l'utiliser comme suit :

int number;
if(true)
    number = 5;

En Java, vous devez déclarer une variable comme ceci avant de l'utiliser dans une instruction if-then. En php, cependant, il n'y a pas vraiment de moyen de le faire. Puisque php est typée dynamiquement, vous ne pouvez pas écrire int $number . En Java, l'ordinateur alloue un bloc de mémoire de 32 bits (la taille d'un int) lorsque la variable est déclarée. En php, je crois, la mémoire n'est pas allouée jusqu'à ce que quelque chose soit effectivement stocké dans la variable. Le meilleur équivalent de la "déclaration" d'une variable php auquel je puisse penser serait simplement d'écrire :

$number;    //This is NOT needed
if(true)
    $number = 5;

Mais quand vous regardez le code, il semble un peu étrange d'écrire juste $number comme ça. Je pense que l'ordinateur trouverait cela tout aussi étrange car, comme je l'ai déjà dit, il s'agit d'un langage à typage dynamique, et il n'a donc pas besoin d'allouer tout un morceau de mémoire pour le nombre. Vous pouvez donc le laisser comme ça :

if(true)
    $number = 5;

4voto

BugFinder Points 7662

Ça dépend.

En PHP, il y a de fortes chances que oui, bien que bien sûr, si a n'est pas < b, alors c n'existera pas quand vous arriverez à la ligne echo c et votre code se plaindra.

Cependant, dans la plupart des langues, cela ne compilerait pas pour cette raison.

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