无法访问函数内部的全局variables

这(我的代码的简化版本)不起作用:

<?php $sxml = new SimpleXMLElement('<somexml/>'); function foo(){ $child = $sxml->addChild('child'); } foo(); ?> 

为什么? 我想访问$sxml因为我想logging错误,如果foo()失败。 foo()调用自己recursion创build一个目录列表,所以我担心把整个$sxml传递给自己(如在foo($sxml) )可能会损害性能。

有没有办法在$foo里面访问$sxml而不把它作为parameter passing呢? (PHP 5.2.x +)

编辑:如果代码看起来像这样,实际上呢?

 <?php bar(){ $sxml = new SimpleXMLElement('<somexml/>'); function foo(){ $child = $sxml->addChild('child'); } foo(); } bar(); ?> 

你必须把它传递给函数:

 <?php $sxml = new SimpleXMLElement('<somexml/>'); function foo($sxml){ $child = $sxml->addChild('child'); } foo($sxml); ?> 

或者宣布它是全球性的 :

 <?php $sxml = new SimpleXMLElement('<somexml/>'); function foo(){ global $sxml; $child = $sxml->addChild('child'); } foo(); ?> 

如果variables不是全局variables,而是在外部函数中定义,那么第一个选项(作为parameter passing)的作用是一样的:

 <?php function bar() { $sxml = new SimpleXMLElement('<somexml/>'); function foo($sxml) { $child = $sxml->addChild('child'); } foo($sxml); } bar(); ?> 

或者,通过在use子句中声明variables来创build闭包 。

 <?php function bar() { $sxml = new SimpleXMLElement('<somexml/>'); function foo() use(&$xml) { $child = $sxml->addChild('child'); } foo(); } bar(); ?> 

您需要明确邀请全局variables进入函数范围:

 function foo(){ global $sxml; $child = $sxml->addChild('child'); } 

使用global关键字在函数中声明$ sxml。

 <?php $sxml = new SimpleXMLElement('<somexml/>'); function foo(){ global $sxml; $child = $sxml->addChild('child'); } foo(); ?> 

如果variables是在一个模块内部声明的,而你试图用global $my_varvariablesglobal $my_var来获取它,你将会失败,因为这个variables是在LOCAL SCOPE中定义的。

解决scheme是在声明该variables时使用$ GLOBALS

  $my_var= 'blabla'; $GLOBALS['my_var'] = 'blabla';