PHP变量范围问题

时间:2010-09-10 17:26:54

标签: php include scope

根据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();

我误解了什么吗? 编辑:好的,我是个白痴,各位。我正在使用包装器的包装函数 - 来填充包含路径。这使变量超出范围。谢谢你的帮助。

4 个答案:

答案 0 :(得分:1)

这完全适合我。如果你准确地描述了这个问题,必须在b.inc。的内部发生一些事情。

答案 1 :(得分:0)

在课堂上你需要说你的意思是全球性的。


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

foo::bar();

答案 2 :(得分:0)

<?php
//a.php
class test
{
    public static function run()
    {
        $a = 'Some value';
        include 'b.php'; //echo $a;
    }
}
test::run();
?>

在我的测试中一切正常。

答案 3 :(得分:0)

功能范围与全局范围不同。 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。