2011-06-21 114 views
1

我在理解PHP中的包含和函数范围时遇到了一些麻烦,有些Google搜索没有提供成功的结果。但现在的问题是:功能范围在PHP中包括包括在内

这不起作用:

function include_a(){ 
    // Just imagine some complicated code 
    if(isset($_SESSION['language'])){ 
     include 'left_side2.php'; 
    } else { 
     include 'left_side.php'; 
    } 
    // More complicated code to determine which file to include 
} 

function b() { 
    include_a(); 
    print_r($lang); // Will say that $lang is undefined 
} 

所以基本上,存在left_side.phpleft_side2.php称为$lang的数组。我想在b()之内访问它,但上面的代码设置会说$lang未定义。但是,当我复制并粘贴最初的include_a()中的确切代码时,它将正常工作。但正如你所想象的,我不希望将代码复制并粘贴到我需要的每个函数中。

如何缓解这个范围问题,我做错了什么?

回答

2

如果数组$langinclude_a()函数中被定义,那么它仅限于该函数的范围,即使该函数在b()内被调用。要访问b()中的$lang,您需要在全球范围内调用它。

发生这种情况是因为你include 'left_side2.php';里面的include_a()函数。如果在包含内定义了多个变量,并且您希望它们位于全局范围内,那么您需要将它们定义为这样。

left_side.php内部,其定义为:

$GLOBALS['lang'] = whatever...; 

然后在调用它们的功能,试试这个:

function b() { 
    include_a(); 
    print_r($GLOBALS['lang']); // Now $lang should be known. 
} 
+0

啊,谢谢。我不知道$ GLOBALS功能。尽管调用联想的$ GLOBALS有一个古怪的语法(即$ GLOBALS ['lang'] ['EMAIL']),但一切都很好。现在不需要include_a()函数。 再次感谢您。 – id2341677

1

它被认为是“坏习惯”,你不要使用全局变量不必(我不赞同,但普遍接受)。更好的做法是通过在传入变量前添加一个&符号来引用,以便编辑该值。

所以里面left_side或left_side2你会:

b($lang); 

和b是:

function b(&$lang){...} 

如需进一步定义可变范围check this out

+0

那么,编辑这些文件需要进行大修,如果我这样做的话,恐怕这不是那么可行。然而,为了缓解奇怪的'$ GLOBALS ['array'] ['property']'语法问题,我可以在每个函数的顶部定义'global $ lang',然后访问'$ lang'正常情况下(如链接所示,谢谢)。一种方式比另一种更好,还是它们在性能方面都相同? – id2341677

+0

我还没有运行任何测试是肯定的,但我想这种差异是微不足道的,因为它们都调用现有变量的全局引用(而不是实例化新副本)。 – meteorainer