Не удается получить доступ к глобальной переменной внутри функции

Это (упрощенная версия моего кода) не работает:

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

Зачем? Я хочу получить доступ к $sxml потому что я хочу регистрировать ошибки на нем, если foo() терпит неудачу. foo() вызывает себя рекурсивно, чтобы создать список каталогов, поэтому я боюсь, что передача всего $sxml на себя (как в foo($sxml) ) может повредить производительность.

Есть ли способ доступа к $sxml внутри $foo без передачи его в качестве аргумента? (PHP 5.2.x +)

EDIT: Что, если код выглядит так?

 <?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(); ?> 

Если переменная не является глобальной, но вместо нее определена во внешней функции, первая опция (проходящая как аргумент) работает одинаково:

 <?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(); ?> 

Вам нужно явно пригласить глобальную переменную в область функций:

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

Используйте глобальное ключевое слово для объявления $ sxml внутри вашей функции.

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

если переменная объявлена ​​внутри модуля, и вы пытаетесь получить ее с global $my_var , вы потерпите неудачу, потому что эта переменная определена в LOCAL SCOPE .

решение заключается в использовании $ GLOBALS, когда вы объявляете эту переменную:

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