这可能看起来像一个微不足道的问题,但由于我在使用php大约8个月之后才意识到这一点,我认为这需要一些关注。我习惯于强类型语言,比如java,但我也喜欢弱类型语言(不知何故)。
好的,所以对于这个问题,我在一个函数中定义一个变量,在第三级foreach循环中。像
这样的东西for($x =0; $x <= 20; $x++){
for($x =0; $x <= 5; $x++){
foreach($arr as $var){
$new_arr = $var;
}
if(isset($new_arr)){
//code executes here
}
}
}
在上面的例子中,最后一个if条件确实返回true,即使$ new var没有被声明为全局变量,那么如何在foreach循环之外访问它? 它不应该给出一个未定义的错误吗?
nb.I我已经查看了php doc
答案 0 :(得分:5)
即使$ new var未被声明为全局变量,所以如何 它会在foreach循环之外访问吗?
您假设foreach
为函数,A foreach
不是函数,而是语言构造。
在控制结构中分配了值的变量不会受到范围问题的影响,即使是最里面的控制结构也可以访问它。 !强>
isset
检查变量是否已赋值。因此,当您到达最里面的foreach
时,将分配值,因此当您isset
显然会返回true
时。
答案 1 :(得分:5)
与javascript非常相似,PHP的变量范围限定为函数级别。所以你的变量将在任何foreach,for循环或者循环设置后的isset()中返回true。 PHP没有任何循环范围的概念。
值得一提的是,函数范围比javascript更严格。在不使用use()语句的情况下,使用函数的闭包不能访问调用函数的上下文:
function ScopeOne() {
$myVar = "hello";
$scopeTwo = function () {
return isset($myVar);
};
$doesScopeTwoHaveAccessToScopeOne = $scopeTwo();
if ($doesScopeTwoHaveAccessToScopeOne) {
echo "this won't be true";
} else {
echo "Scope Two can not access variables in scope one";
}
}
ScopeOne();