【问题标题】:Are variables in iterators in PHP global?PHP中迭代器中的变量是全局变量吗?
【发布时间】:2013-11-12 12:53:41
【问题描述】:

我已经考虑了一段时间。 $s1 设置在 foreach 循环中,可以在循环后访问,同时 $s2 设置在函数 say 中,因为它是局部变量,所以不能访问 after。我的问题是:迭代器中的变量是否考虑全局?

 <?php
    $systems =  array('windows', 'mac', 'linux');

    foreach ($systems as $s) {
        $s1 = $systems[0];
    }

    echo $s1 . '<br />'; // Echo out "windows"

    function say(){
        $s2 = 'skynet';
        echo $s2;
    }

    say(); // Echo out "skynet"

    echo $s2; // Undefined variable

    ?>

【问题讨论】:

  • PHP 只有两种作用域:全局作用域和函数作用域。所以变量要么在函数中,要么是全局的。
  • foreach 不是迭代器,它只是语言的循环语句。由于 PHP 不对变量进行块级作用域,因此在循环中创建的任何变量在循环之后也可以访问。
  • 不,他们不是。您无法从 foreach 循环外部访问 $s 。但是,您可以访问在循环中创建的变量。
  • ^ ummm ... 是的,你可以,在这种情况下,循环后回显$s 将输出“linux”。
  • 这个问题似乎是题外话,因为它与manual 中现成的信息有关。

标签: php variables scope


【解决方案1】:

不,在您的上下文中$s1 不是全局的,它只是与您的打印行处于同一级别。否则,您的 $s2 变量是私有的,并且仅存在于 say() 函数中。

【讨论】:

    【解决方案2】:

    在php中有两种类型的变量:

    • 函数变量
    • 全局变量

    【讨论】:

    • 而在英语中,词有两种:书面词和口头词。
    【解决方案3】:

    当你声明一个迭代器时,比如foreach(),那么代码将在运行时执行。

    当您声明function() 时,代码不会在运行时执行。只有在你调用函数时才会运行。

    这就是为什么定义了$1,但没有定义$2

    函数(或类方法)中的变量总是局部的。

    【讨论】:

    • 所以,做 var $s1 被认为是全局的,因为它是在运行时设置的,如果包含,可以在其他文件中访问。对吗?
    • 是的。 $s1 没有在函数或类方法中定义,因此它不是局部的而是全局的。
    【解决方案4】:

    如果您声明 global $s1;,则 $s1 是全局的。否则,它不是全局的。如果它不是全局的,那么它只能从定义它的同一范围内访问。简单来说,如果你写$x=1,那么你可以从函数内部以外的任何地方获取$x的值,直到你定义它的函数结束。

    你所有的答案都在这里:http://php.net/manual/en/language.variables.scope.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 2019-08-26
      • 2013-09-19
      • 2011-04-06
      • 1970-01-01
      相关资源
      最近更新 更多