PHP可变范围问题

时间:2011-07-04 16:14:14

标签: php scope

在我的代码中,当我需要包含HTML或PHP代码段时,我使用类的公共load_snippet函数。 (我这样做而不是直接include_once,因为目录结构因某些变量而异。)

我在变量范围方面遇到了一些问题,所以我把问题缩小到了这个问题:假设我在页面中定义了一个变量:

$variable = 'Hello World!";

然后,我需要加载一个片段:

$APP->load_snippet("slider");

该代码段完美呈现,但如果我尝试在滑块代码中引用$variable,则PHP会给出未定义的变量错误。如果我直接include php文件,它按预期工作,所以我不明白为什么我遇到这个问题,因为这是load_snippet函数:

public function load_snippet($snippet){  
if(file_exists("app/".$this->APP_TYPE."/snippets/".$snippet.".php")){  
        include "app/".$this->APP_TYPE."/snippets/".$snippet.".php";  
    }  
    else{  
        include 'common/txt/404.txt';  
    }  
}

非常感谢您给予我的任何帮助。

6 个答案:

答案 0 :(得分:1)

我认为包含在函数内部对我没有意义......我认为你应该放入函数

global $variable;

请注意,include会将代码置于函数内(include会被代码替换),因为我知道..

答案 1 :(得分:1)

该文件包含在load_snippet()函数的上下文中,因此只包含该函数中存在的那些变量。修改此方法的一种方法是使您的函数接受两个变量:文件名和值数组。

public function load_snippet($snippet, $content) {  
    if (is_array($content)) extract($content);
    if (file_exists("app/".$this->APP_TYPE."/snippets/".$snippet.".php")) {  
        include "app/".$this->APP_TYPE."/snippets/".$snippet.".php";  
    } else {  
        include 'common/txt/404.txt';  
    }  
}

然后

$arr = array('variable' => 'Hello world!');
load_snippet('slider', $arr);

答案 2 :(得分:0)

你这样做的方式很难看,但是你可以在剪辑中使用global $variable来引用变量。但是,如果在函数或方法中包含剪切,则必须使该函数/方法中的变量全局化

答案 3 :(得分:0)

如果$variable方法中需要App::load_snippet(),最好将其传入:

public function load_snippet($snippet, $var='Hello world'){
   if(file_exists("app/".$this->APP_TYPE."/snippets/".$snippet.".php")){
           include "app/".$this->APP_TYPE."/snippets/".$snippet.".php";
       }else{
           include 'common/txt/404.txt';
       }
   }
   //do something with $var
}

您可以为尚未设置$variable的时间设置默认值。没有全局变量,没有超出范围变量。

答案 4 :(得分:0)

相反,您可以使用常量,如define('VARIALABLE','value')。您可以在文件中的任何位置使用

答案 5 :(得分:-1)

你在课堂上。这意味着包含的文件具有与包含它的代码行相同的变量范围。要解决这个问题,你需要做的就是把

global $variable;

在include之上。