Php Can';t访问函数内部的全局变量
此(我的代码的简化版本)不起作用:Php Can';t访问函数内部的全局变量,php,variables,scope,global-variables,Php,Variables,Scope,Global Variables,此(我的代码的简化版本)不起作用: <?php $sxml = new SimpleXMLElement('<somexml/>'); function foo(){ $child = $sxml->addChild('child'); } foo(); ?> 您必须将其传递给函数: <?php $sxml = new SimpleXMLElement('<somexml/>');
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
$child = $sxml->addChild('child');
}
foo();
?>
您必须将其传递给函数:
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo($sxml){
$child = $sxml->addChild('child');
}
foo($sxml);
?>
您需要显式邀请全局变量进入函数范围:
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
使用global关键字在函数中声明$sxml
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
foo();
?>
addChild('child');
}
foo();
?>
另一种解决方案是在声明变量时使用$GLOBALS: $my_var = 'blabla'; // not global
$GLOBALS['my_var'] = 'blabla'; // global (correct)
虽然上面的答案提供了一个很好的解决方案,但我认为在大多数现代PHP应用程序中,合适的解决方案是创建一个带有静态变量的类,如下所示:
<?php
class xmlHelper {
private static $sxml;
public function getXML() {
return self::$sxml;
}
public function setXML($xml) {
self::$sxml = $xml;
}
}
xmlHelper::setXML(new SimpleXMLElement('<somexml/>'));
function foo(){
$child = xmlHelper::getXML()->addChild('child');
}
foo();
addChild('child');
}
foo();
这种方法允许您根据需要从foo()
中访问$sxml
,但与全局
方法相比,它有一些优势
setXML()
中放置断点,以找出应用程序的哪个部分操纵了此值,而在操纵全局变量时,您不能这样做sxml
污染全局命名空间请执行OOP或将其作为参数传递。可重用性是关键。@TheHPDeveloper我理解您的观点,但我刚刚开始使用PHP,这可能不是我将重用的代码。这更像是一个原型,如果出了问题,我可以扔掉它,从头开始。还有一件事。。。如果变量在父函数中会怎样?(问题编辑):(在第二个示例中,您无法从foo()访问$sxml,因为它是在bar()中本地定义的。解决方案可以是:在foo()和bar()之外声明$sxml,并在两个函数中使用global。但正如HPDeveloper所建议的,您应该使用OOP;)
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
foo();
?>
$my_var = 'blabla'; // not global
$GLOBALS['my_var'] = 'blabla'; // global (correct)
<?php
class xmlHelper {
private static $sxml;
public function getXML() {
return self::$sxml;
}
public function setXML($xml) {
self::$sxml = $xml;
}
}
xmlHelper::setXML(new SimpleXMLElement('<somexml/>'));
function foo(){
$child = xmlHelper::getXML()->addChild('child');
}
foo();