2017-01-11 50 views
-1

好吧,我已经简单化的代码颇有几分...... 我不能确定,如果我试图完成是可以或不可以。使用include函数时,如何访问在include之前声明的变量?

我有一个称为实施例类与具有1个参数

Class Example{ 
    public function Template($root){ 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

我的产品阵列的函数调用模板,我实例化的类和运行模板函数

$products = array("garbage"); 
$test = new Example; 
$test->Template("product"); 

这里是/templates/product.php的示例副本

print 'Test'; 
print_r($products); 

我回来了显示“Test”的页面,但无法访问在Template函数之前定义的$products数组。

如果我去直接include ROOT."/templates/product.php";路线,一切正常。

难道我不能在函数中使用包括从?

+0

这是not.It是一个数组(或应被假定为) 固定 – FuckYou

+0

不是问题,你们不明白的问题,因为如果我说,我能够得到的结果通过直接包括,显然这个数组是一个数组,并且只是作为一个持有者被放置在这里,就好像它已经被定义一样。总之,谢谢。我已经更新了这个 – FuckYou

+1

“正确”的答案,将是通过构造函数传递数组到类......但全球$产品;在你使用$产品将在哪里工作文件的顶部....然而,这是非常非常令人难以接受 - 我恨自己这表明它! – Brian

回答

3

好吧,如果你要为globals则似乎对方的回答总是使用$products。这是一个动态的方式,所以你可以通过'user'$users(增加了一个“S”)将可等..

Class Example{ 
    public function Template($root){ 
     ${$root.'s'} = $GLOBALS["{$root}s"]; 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

但是,你会过得更好传递变量和使用中的标准名称的功能,在这种情况下$data和所有的模板将使用$data

Class Example{ 
    public function Template($root, $data){ 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

$products = array("garbage"); 
$test = new Example; 
$test->Template("product", $products); 

如果你真的需要像$products特定名称是什么原因,然后再考虑将它作为一个关联数组:

Class Example{ 
    public function Template($root, $data){ 
     extract($data); 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

$products = array("garbage"); 
$test = new Example; 
$test->Template("product", compact("products"); 
+0

是的,正如我在评论中所述在其他答案 –

1

你的问题是你的变量$ product是在全局范围内定义的,并且你在一个函数中包含了一个文件,所以这个文件将引用这个函数的本地范围中的$ product变量。

试试这个:

Class Example{ 
     public function Template($root){ 
      global $products; 
      include ROOT."/templates/{$root}.php"; 
     } 
    } 
+0

谢谢你的回答!上述 布赖恩表示,这是基于,皱起了眉头任何人都可以在阐述为什么? – FuckYou

+0

http://stackoverflow.com/questions/8715897/why-is-it-considered-bad-practice-to-use-global-reference-inside-functions – Brian

+1

那是因为变量的范围。每个变量都在某个范围的局部范围内。在全球范围内定义的是全局变量。但是,在内部函数中,全局范围由局部范围改变,并且在声明您想要使用全局范围的某个变量之前,全局变量将不可访问。 –