无法访问函数内部的全局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_var
variablesglobal $my_var
来获取它,你将会失败,因为这个variables是在LOCAL SCOPE中定义的。
解决scheme是在声明该variables时使用$ GLOBALS :
$my_var= 'blabla'; $GLOBALS['my_var'] = 'blabla';