Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP,一个奇怪的变量范围?_Php_Scope - Fatal编程技术网

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 $

这更多的是一个关于“为什么”和“怎么做”的问题,然而这已经困扰了我好几天了。目前,我正在使用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中创建任何变量作用域,因此如果变量在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