Home » Php » If you create a variable inside a if statement is it available outside the if statement?

If you create a variable inside a if statement is it available outside the if statement?

Posted by: admin November 30, 2017 Leave a comment

Questions:

If you have an if statement like this:

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

Would you be able to access the $c variable outside of the if statement like so:

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

In PHP, if doesn’t have its own scope. So yes, if you define something inside the if statement or inside the block, then it will be available just as if you defined it outside (assuming, of course, the code inside the block or inside the if statement gets to run).

To illustrate:

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

The condition evaluates to true, so the code inside the block gets run. The variable $a gets defined.

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

The condition evaluates to false, so the code inside the block doesn’t get to run. The variable $b will not be defined.

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

The code inside the condition gets to run and $c gets defined as 5 ($c = 5). Even though the assignment happens inside the if statement, the value does survive outside, because if has no scope. Same thing happens with for, just like in, for example, for ($i = 0, $i < 5; ++$i). The $i will survive outside the for loop, because for has no scope either.

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

false short circuits and the execution does not arrive at $d = 5, so the $d variable will not be defined.

For more about the PHP scope, read the variable scope manual page.

Questions:
Answers:

PHP’s scope is completely function-based. It’s not the same as C or Java where it’s local to what block that variables are nested in.

For PHP’s scope:

// 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;
}

If you want a variable to be global, simply use the global keyword:

// 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;
}

Questions:
Answers:

If the if statement containing the variable was executed, then yes, you can access the variable outside of the if statement. Here’s a thought on why it works that way. In many programming languages you can “declare” a variable before you use it, just to let the compiler know that it’s there. For example in Java you can declare an ‘int’, then use it like so:

int number;
if(true)
    number = 5;

In Java, you have to declare a variable like this before using it in an if-then statement. In php, however, there isn’t really a way to do that. Since php is dynamically typed, you can’t write int $number. In Java, the computer allocates a 32 bit block of memory (the size of an int) when the variable is declared. In php, I believe, the memory is not allocated until something is actually stored in the variable. The best equivalent to ‘declaring’ a php variable I could think of would just be to write:

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

But when you look at the code, it seems kind of strange to just write $number like that. I think the computer would think it was equally strange because as I said before, it is a dynamically typed language, and so it doesn’t need to allocate a whole chunk of memory for the number. So you can just leave it like this:

if(true)
    $number = 5; 

Questions:
Answers:

Depends.

In PHP chances are yes it would, although of course, if a isnt < b, then c wont exist when you get to the echo c line and your code will complain.

However, in most languages this wouldnt compile for that reason