Если вы создаете переменную внутри оператора if, доступна ли она вне оператора if? - PullRequest
40 голосов
/ 05 июня 2011

Если у вас есть выражение if, подобное этому:

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

Можете ли вы получить доступ к переменной $ c вне оператора if, например:

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

Ответы [ 4 ]

57 голосов
/ 05 июня 2011

В PHP if не имеет собственной области видимости. Так что да, если вы определите что-то внутри оператора if или внутри блока, то оно будет доступно так же, как если бы вы определили это снаружи (при условии, конечно, что код внутри блока или внутри оператора if получает работать).

Для иллюстрации:

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

Условие оценивается как true, поэтому код внутри блока запускается. Переменная $a будет определена.

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

Условие оценивается как false, поэтому код внутри блока не запускается. Переменная $b не будет определена.

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

Код внутри условия запускается и $c определяется как 5 ($c = 5). Даже если присваивание происходит внутри оператора if, значение остается в силе снаружи, поскольку if не имеет области видимости. То же самое происходит с for, как, например, с for ($i = 0, $i < 5; ++$i). $i будет существовать вне цикла for, поскольку for также не имеет области действия.

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

false короткое замыкание и выполнение не достигает $d = 5, поэтому переменная $d не будет определена.

Подробнее о области видимости PHP читайте в справочной странице variable scope .

12 голосов
/ 05 июня 2011

Область применения PHP полностью основана на функциях.Это не то же самое, что C или Java, где локально для того, в какой блок вложены переменные.

Для области действия 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;
}

Если вы хотите, чтобы переменная была глобальной, просто используйтеглобальное ключевое слово:

// 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;
}
5 голосов
/ 13 июля 2014

Если оператор if, содержащий переменную, был выполнен, то да, вы можете получить доступ к переменной вне оператора if. Вот мысль о том, почему это работает таким образом. Во многих языках программирования вы можете «объявить» переменную перед ее использованием, просто чтобы компилятор знал, что она есть. Например, в Java вы можете объявить int, а затем использовать его так:

int number;
if(true)
    number = 5;

В Java вы должны объявить переменную, подобную этой, прежде чем использовать ее в операторе if-then. В php, однако, не существует способа сделать это. Поскольку php динамически набирается, вы не можете написать int $number. В Java компьютер выделяет 32-битный блок памяти (размер типа int) при объявлении переменной. Я полагаю, что в php память не выделяется до тех пор, пока что-то не будет сохранено в переменной. Лучший эквивалент «объявления» переменной php, о которой я мог подумать, это просто написать:

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

Но когда вы смотрите на код, кажется странным просто писать $number вот так. Я думаю, что компьютер подумал бы, что это было одинаково странно, потому что, как я уже говорил, это динамически типизированный язык, и поэтому ему не нужно выделять целую часть памяти для числа. Так что вы можете просто оставить это так:

if(true)
    $number = 5; 
4 голосов
/ 05 июня 2011

Зависит.

В PHP, скорее всего, да, хотя, конечно, если a isnt Однако в большинстве языков это не скомпилируется по этой причине

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...