【问题标题】:PHP variable scope questionPHP变量范围问题
【发布时间】:2011-04-10 20:24:12
【问题描述】:

根据PHP manual $a 应该可以在以下代码段中用于b.inc

<?php
$a = 1;
include 'b.inc';
?>

但是,当我尝试在调用静态方法时执行相同操作时,$a 似乎超出了范围。

class foo {
    public static function bar() {
        $a = 1;
        include('b.inc');               
    }
}

foo::bar();

我是不是误会了什么? 编辑:好的,我是个白痴,大家。我正在使用包含的包装函数——来填充包含路径。这使变量超出范围。感谢您的帮助。

【问题讨论】:

  • b.inc的内容是什么
  • 让我们说“echo $a;”为简单起见。

标签: php include scope


【解决方案1】:

函数作用域不同于全局作用域。 b.inc 将看到 $a,并且在 b.inc 中创建的任何变量都将在 foo::bar() 的范围内(除非它们被定义为全局变量,或者在它们自己的函数范围内)。

您可以使用一些代码对此进行测试:

function foo() {
    $a = 1;
    include '1.php'; // modify and initialize, ie. $a++; $b = 3; 
    include '2.php'; // test the values: $a == 2; $b == 3
}

当我们在其他脚本中引导 WordPress 时偶尔会遇到这个问题:初始化脚本假定它们位于最外层范围内,因此它们将设置变量,如 $wpdb(数据库对象),但该文件实际上会在一些执行require_once() 的函数。解决方案是在进入任何功能范围之前始终在应用程序中引导 WordPress。

【讨论】:

    【解决方案2】:
    <?php
    //a.php
    class test
    {
        public static function run()
        {
            $a = 'Some value';
            include 'b.php'; //echo $a;
        }
    }
    test::run();
    ?>
    

    在我的测试中一切正常。

    【讨论】:

      【解决方案3】:

      它完全适合我。如果您准确地描述了问题,那么 b.inc 中的 $a 一定发生了一些事情。

      【讨论】:

      • 谢谢你——我一定是搞砸了。道歉。
      • 是的。我也将我的包含在一个 foreach 循环中——但我看不出这会有什么不同。当我弄清楚时,我会发布我的错误。
      • 男人!没有冒犯,格雷格,但如果你在循环中包含一个文件,我会严重质疑你的 PHP 熟练程度。
      • 它只是一个 HTML 模板,以避免将一堆标记放入辅助函数中。这有严重的问题吗?
      • 好的——尽管这可能看不到很多迭代,但我想这不仅仅是我的一个小问题。循环现在在模板本身的模板中。
      【解决方案4】:

      在类内你需要说你的意思是全局类。

      
      class foo {
          public static function bar() {
              global $a;
              var_dump($a);
          }
      }
      
      foo::bar();
      

      【讨论】:

      • 你误解了他的问题。他是说当他将它包含在一个静态函数中时,该文件似乎没有看到 $a。
      猜你喜欢
      • 2016-08-30
      • 2011-08-11
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2011-04-13
      • 2011-10-20
      相关资源
      最近更新 更多