3 回答
![?](http://img1.sycdn.imooc.com/5333a207000118af02200220-100-100.jpg)
TA贡献2021条经验 获得超8个赞
您必须将其传递给函数:
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo($sxml){
$child = $sxml->addChild('child');
}
foo($sxml);
?>
或将其声明为global:
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
foo();
?>
如果变量不是全局变量,而是在外部函数中定义的,则第一个选项(作为参数传递)的作用相同:
<?php
function bar() {
$sxml = new SimpleXMLElement('<somexml/>');
function foo($sxml) {
$child = $sxml->addChild('child');
}
foo($sxml);
}
bar();
?>
或者,通过在子句中声明变量来创建闭包use。
<?php
function bar() {
$sxml = new SimpleXMLElement('<somexml/>');
function foo() use(&$xml) {
$child = $sxml->addChild('child');
}
foo();
}
bar();
?>
![?](http://img1.sycdn.imooc.com/54584d9f0001043b02200220-100-100.jpg)
TA贡献1111条经验 获得超0个赞
虽然最佳答案提供了一个不错的解决方案,但我想指出,大多数现代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();
这种方法使您可以$sxml根据需要从内部进行访问foo(),但是与该global方法相比,它具有一些优势。
使用此策略,您将始终能够在其中放置一个断点,setXML()以找出应用程序的哪个部分操纵了该值,而在操作全局变量时则无法做到这一点。
您避免使用通用变量名污染全局名称空间sxml。
- 3 回答
- 0 关注
- 483 浏览
添加回答
举报