Разница в области видимости между PHP и C: область видимости блока не одинакова? - PullRequest
35 голосов
/ 24 мая 2010

Следующий код PHP выведет 3.

function main() {
    if (1) {
        $i = 3;
    }
    echo $i;
}

main();

Но следующий код на C вызовет ошибку компиляции.

void main() {
    if (1) {
        int i = 3;
    }

    printf("%d", i);
}

То есть переменные в PHP не являются строго ограниченными по области? В PHP переменные, определенные во внутреннем блоке, могут использоваться во внешнем блоке?

1 Ответ

51 голосов
/ 24 мая 2010

PHP имеет только область действия функции - структуры управления, такие как if, не вводят новую область действия. Однако, это также не против, если вы используете переменные, которые вы не объявили. $i не будет существовать вне main() или в случае сбоя оператора if, но вы все равно можете свободно его выводить.

Если в PHP установлен error_reporting для включения уведомлений, он выдаст E_NOTICE error во время выполнения , если вы попытаетесь использовать переменную, которая не была определена. Так что, если у вас было:

function main() {
 if (rand(0,1) == 0) {
  $i = 3;
 }
 echo $i;
}

Код будет работать нормально, но некоторые выполнения будут отображать '3' (когда if завершится успешно), а некоторые вызовут E_NOTICE и ничего не отобразят, так как $i не будет определен в области видимости заявления эха.

За пределами функции $i никогда не будет определено (поскольку функция имеет другую область действия).

Для получения дополнительной информации: http://php.net/manual/en/language.variables.scope.php

...