PHP和C之间的可变范围差异:块范围不完全相同?

pow*_*boy 37 php c scope

将输出以下PHP代码3.

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

main();
Run Code Online (Sandbox Code Playgroud)

但是下面的C代码会引发编译错误.

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

    printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)

那么PHP中的变量不是严格的块范围的?在PHP中,内部块中定义的变量可以用在外部块中吗?

Chr*_*ris 54

PHP只有函数作用域 - 控制结构,如if不引入新的作用域.但是,如果您使用未声明的变量,它也不介意.$i将不存在于main()if 之外或if语句失败,但你仍然可以自由地回应它.

如果将PHP的error_reporting设置为包含通知,则尝试使用尚未定义的变量,它将在运行时发出E_NOTICE错误.所以如果你有:

function main() {
 if (rand(0,1) == 0) {
  $i = 3;
 }
 echo $i;
}
Run Code Online (Sandbox Code Playgroud)

代码运行正常,但有些执行会回显'3'(if成功时),有些会引发E_NOTICE并且不回显任何东西,因为$i不会在echo语句的范围内定义.

在函数之外,$i永远不会定义(因为函数具有不同的范围).

欲了解更多信息:http://php.net/manual/en/language.variables.scope.php

  • 很好的解释!但仅仅因为你可以做某事并不意味着你应该做.使用尚未定义的变量是不好的做法. (5认同)