PHP,一个奇怪的变量范围?
这更多的是一个关于“为什么”和“怎么做”的问题,然而这已经困扰了我好几天了。目前,我正在使用CodeIgniter进行一些工作,并暂时从Ruby返回到PHP,让我对以下范围魔法感到困惑PHP,一个奇怪的变量范围?,php,scope,Php,Scope,这更多的是一个关于“为什么”和“怎么做”的问题,然而这已经困扰了我好几天了。目前,我正在使用CodeIgniter进行一些工作,并暂时从Ruby返回到PHP,让我对以下范围魔法感到困惑 <?php $query = $this->db->get('articles', 2); if ($query->num_rows() > 0) { foreach ($query->result_array() as $
<?php $query = $this->db->get('articles', 2);
if ($query->num_rows() > 0)
{
foreach ($query->result_array() as $row)
{
$data[] = $row; # <-- first appearance here
}
return $data; # <--- :S what?!
}
PHP手册讲述了本地范围界定,但我仍然想知道为什么会发生这种情况,以及是否有我不知道的特殊规则。这让我害怕:)
感谢分享想法,
foreach
不会在PHP中创建任何变量作用域,因此如果变量在foreach之外可用,这是很自然的
对于第二个问题,$a
不等于1
,因此,$b
未初始化,当您访问外部时会引发通知。如果您将值1
分配给$a
并对其进行测试,您会怀疑通知是否会消失
这里没有什么作用域。
< P> Shyam,你使用的是脚本语言,而不是C++。对于像PHP或JavaScript这样的脚本语言来说,每个代码块的作用域不不同是很典型的。相反,整个功能只有一个范围。如果你考虑你的第一个例子,这是相当方便的,但是你显然需要小心,就像你在第二个例子中看到的一样。如果不是,将永远不会对$b=2进行评估 见: 在php中,大括号不一定为变量定义新的作用域。(你的第一个例子)在第二个示例中,$b仅在特定条件下设置。因此,如果不满足此条件,则可能是“未定义的”。只有函数才能创建新的局部作用域。卷曲的大括号本身不起作用。大括号只是其他语言结构的辅助结构(
if
、while
或foreach
)
在局部范围内,无论何时访问任何变量都无关紧要。局部作用域是幕后的隐式词典(请参阅)。通过访问以前未定义的变量,您可能会收到调试通知,但仅此而已
在您的特定示例中,您甚至只是在全局范围内操作。实际上,您的第一个方法也应该给您一个错误 您使用的变量尚未声明为数组。我不明白你为什么没有得到一个错误
PHP没有块作用域,所以它是否在IF或FOREACH中无关紧要。如果它在方法中可用,则可以在方法中使用它 仅当$a为1时,才在第二个示例中创建变量。由于$a不存在(PHP实际上在这里引发了一个错误),所以不会创建$b。在第一个示例中,所有条件都已满足,因此创建了$data并将其用作返回值。第二个示例更为明确/过于简化,即可以访问大括号外的$b-正如其他答案所述,大括号不定义变量的范围。我不知道:)我认为这已经过时了,或者是一个严格的问题。你的第二个例子对我很有用,打印了2。我正在使用5.4.16和严格的off@Dennis,它不起作用。你认为它是有效的,因为Shyam已经纠正了所有其他人都在谈论的代码。我已经做了一个回滚,这样每个人都在同一页上。还要看到第一句话使理解变得非常清楚!谢谢酷。还有一个正式的语言语义学术语,但我不记得了/@mario,对于“大括号只是其他语言结构的辅助构造”…第二个示例不是问题,更像是我预期的行为(我对PHP语言缺乏经验)的一个透视图。正如其他答案所指出的,大括号并没有定义变量的作用域。尽管如此,谢谢你的回答:)谢谢你的链接和回答!PL包含作用域机制(除了丑陋的
call\u user\u func(function(){})
)是一个很好的设计。为什么“对于脚本语言来说,每个代码块没有不同的作用域是很典型的”?
<?php
if($a==1)
{
$b = 2;
}
echo $b;
?>
Message: Undefined variable: b