Can't access global variable inside function
You have to pass it to the function:
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo($sxml){
$child = $sxml->addChild('child');
}
foo($sxml);
?>
or declare it global:
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
foo();
?>
If the variable isn't global but is instead defined in an outer function, the first option (passing as an argument) works just the same:
<?php
function bar() {
$sxml = new SimpleXMLElement('<somexml/>');
function foo($sxml) {
$child = $sxml->addChild('child');
}
foo($sxml);
}
bar();
?>
Alternatively, create a closure by declaring the variable in a use
clause.
<?php
function bar() {
$sxml = new SimpleXMLElement('<somexml/>');
function foo() use(&$xml) {
$child = $sxml->addChild('child');
}
foo();
}
bar();
?>
You need to explicitly invite the global variable into the functions scope:
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
Use the global keyword to declare $sxml inside your function.
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
foo();
?>
another solution is to use $GLOBALS while you declare that variable:
$my_var = 'blabla'; // not global
$GLOBALS['my_var'] = 'blabla'; // global (correct)
While the top answer provides a nice solution, I'd like to argue that the appropriate solution in most modern PHP applications is to create a class with a static variable, like so:
<?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();
This approach allows you to access $sxml
from within foo()
just like you wanted, but it has a few advantages over the global
approach.
- With this strategy, you will always be able to put a breakpoint inside
setXML()
to find out what part of your application has manipulated this value, which you cannot do when manipulating globals. - You avoid polluting the global namespace with a generic variable name
sxml
.