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

Shy*_*yam 5 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?!
        } 
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我不是一个PHP大师,但本地范围的想法让我觉得在foreach循环之外变量是"可用的".所以我在一个视图中尝试了这个:

<?php

    if($a==1)
    {
    $b = 2;
    }
    echo $b;
?>
Run Code Online (Sandbox Code Playgroud)

哪个导致错误消息:

Message: Undefined variable: b
Run Code Online (Sandbox Code Playgroud)

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

感谢分享想法,

mar*_*rio 11

只有函数创建一个新的本地范围.卷曲括号本身不会.大括号只是一个auxillary结构对其他语言的结构(if,whileforeach).

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

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


Sha*_*ngh 7

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

对于第二个问题,$a不等于1因此$b未初始化并在您访问外部时发出通知.如果指定值1$a测试它,你会不知道该通知将消失.

这里没有范围.