PHP变量范围问题

PHP变量范围问题,php,scope,Php,Scope,在我的代码中,当需要包含HTML或PHP代码段时,我使用类的公共load_代码段函数。(我这样做而不是直接的include_once,因为目录结构因某些变量而异) 我在变量作用域方面遇到了一些问题,因此我将问题缩小为:假设我在页面中定义了一个变量: $variable='你好,世界!“; 然后,我需要加载一个代码段: $APP->加载片段(“滑块”); 代码段呈现得非常完美,只是如果我尝试在滑块代码中引用$variable,PHP会给出一个未定义的变量错误。如果我直接包含PHP文件,它会按预期工

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

我在变量作用域方面遇到了一些问题,因此我将问题缩小为:假设我在页面中定义了一个变量:

$variable='你好,世界!“;

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

$APP->加载片段(“滑块”);

代码段呈现得非常完美,只是如果我尝试在滑块代码中引用
$variable
,PHP会给出一个未定义的变量错误。如果我直接
包含
PHP文件,它会按预期工作,因此我不明白为什么会出现此问题,因为这是
加载代码段
函数:

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';  
    }  
}

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

我认为函数中包含的内容对我来说毫无意义……我认为您应该将函数

global $variable;

请注意,include将把代码放在函数中(include将被代码替换),我知道..

我认为函数中的include对我来说没有意义…我认为您应该放在函数中

global $variable;

注意,include将把代码放在函数中(include将被代码替换)正如我所知,..

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

你这样做的方式很难看,但是你可以在被截断的变量中使用
global$variable
引用该变量。但是,如果在函数或方法中包含被截断的变量,则必须将该函数/方法中的变量设置为全局变量

文件包含在
load\u 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';  
    }  
}
然后


该文件包含在
load\u 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';  
    }  
}
然后


您将包含在一个类中。这意味着包含的文件与包含它的代码行具有相同的变量范围。要解决此问题,您只需将

global $variable;

在include的上方。

您将包含在一个类中。这意味着包含的文件与包含它的代码行具有相同的变量范围。要解决此问题,只需将

global $variable;

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

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
时的默认值。没有全局变量,也没有范围外变量。

如果您需要
$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
时,您可以设置默认值。没有全局变量,没有范围外变量。

相反,您可以使用define('variable','value')等常量。这些常量将在文件中的任何位置可用。

相反,您可以使用define('variable','value')等常量.php文件中的任何地方都可以使用它

我想我可能知道这个问题,但是你能发布滑动代码以便我可以确定,或者只是引用
$variable
@Tomas的部分代码吗?.php文件中有一些HTML,其中有
。这不仅仅是这个片段,出于某种原因,它会发生我使用
load\u snippet
函数的时候。好吧,这粉碎了我的想法(我的想法是滑块在函数中,函数没有声明$variable是全局变量)…等等,load snippet在类中。因此,在类中包含意味着这就是问题所在。要解决它,只需将
global$variable;
放在包含项上方,我想我可能知道问题所在,但您能否发布滑块代码以便我确定,或者只发布引用
$variable
@Tomas的部分代码?所有这些代码中都有一些HTML一个.php文件,其中包含
。这不仅仅是这个片段,出于某种原因,每当我使用
load\u snippet
函数时,它都会发生。好吧,这粉碎了我的想法(我的想法是滑块在函数中,函数没有声明$variable是全局变量)…等等,load snippet在类中。因此,在类中包含意味着这就是问题所在。要解决此问题,只需将
global$variable;
放在include上方,您可以随时包含(从干净代码的角度来看,这没有意义)我在Joomla模块(Joomla的一些早期版本)中见过这种方法,并且存在范围问题,因为模块使用全局变量,但变量不在全局范围内,而是在函数的范围内(在包含该文件的函数范围内,该文件声明了引用全局$variable的类/方法)我知道,
include
ing在函数内部对我来说似乎也很尴尬……但问题是,必须有更好的DRY&MVC方法来实现这一点,而不是不断地使用
include(“app/game/snippets/snippet.php”)
。在函数中放入
global$variable
,当我有许多不同的变量需要在不同的代码段中引用时,这难道不是多余的吗?你可以创建一个函数,在snippet.php中输出你的东西。并调用该函数,而不是包含..但是它可能需要extr