PHP,一个奇怪的变量范围?

时间:2011-04-21 11:11:16

标签: php scope

这更像是一个关于为什么然后'怎么做'的问题,但现在已经困扰了我好几天了。目前我正在使用CodeIgniter进行一些工作并暂时从Ruby返回PHP,这让我想到了以下的范围魔术。

<?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

    if($a==1)
    {
    $b = 2;
    }
    echo $b;
?>

导致错误消息:

Message: Undefined variable: b

PHP手册讲述了本地范围,但我仍然想知道为什么会发生这种情况,如果有特殊规则我不知道。它吓到我了:))

感谢分享想法,

6 个答案:

答案 0 :(得分:11)

仅函数创建新的本地范围。卷曲括号本身不会。对于其他语言结构(ifwhileforeach),大括号只是辅助构造

无论您何时访问本地范围内的任何变量都无关紧要。本地范围是幕后的隐式字典(参见get_defined_vars)。您可以通过访问以前未定义的变量来获得调试通知,但这就是它。

在您的具体示例中,您甚至只是在全球范围内运营。

答案 1 :(得分:7)

foreach不会在PHP中创建任何变量范围,因此如果变量在foreach之外可用则很自然

对于第二个问题,$a不等于1,因此$b未初始化,并在您访问外部时发出通知。如果您将值1分配给$a并对其进行测试,您会怀疑通知会消失。

这不像范围。

答案 2 :(得分:3)

请参阅:http://php.net/manual/en/language.variables.scope.php

在php花括号中,不一定要为变量定义新的范围。 (你的第一个例子)

在您的第二个示例中,$ b仅在特定条件下设置。因此,如果不满足此条件,则可能会“未定义”。

答案 3 :(得分:1)

Shyam,您使用的是脚本语言,而不是C ++。像PHP或JavaScript这样的脚本语言通常不会为每个代码块设置不同的范围。相反,整个功能有一个范围。如果你考虑你的第一个例子,这实际上非常方便,但你显然需要小心,因为你可以在第二个例子中看到。

答案 4 :(得分:1)

是$ a等于1?如果不是$ b = 2永远不会被评估!

答案 5 :(得分:1)

实际上你的第一种方法也应该给你一个错误。

您正在使用尚未声明为数组的变量。我无法理解为什么你没有得到错误。

PHP没有块范围,因此无论是在IF还是FOREACH中都无关紧要。如果它在方法中可用,则可以在方法中使用它。