Не удается получить доступ к глобальной переменной внутри функции
Эта (упрощенная версия моего кода) не работает:
<?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();
?>
Ответы
Ответ 1
Вы должны передать его функции:
<?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();
?>
Ответ 2
Вам нужно явно пригласить глобальную переменную в область функций:
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
Ответ 3
Используйте глобальное ключевое слово для объявления $sxml внутри вашей функции.
<?php
$sxml = new SimpleXMLElement('<somexml/>');
function foo(){
global $sxml;
$child = $sxml->addChild('child');
}
foo();
?>
Ответ 4
если переменная объявлена внутри модуля, и вы пытаетесь ее получить с помощью global $my_var
, вы потерпите неудачу, потому что эта переменная определена в ЛОКАЛЬНОЙ ОБЛАСТИ.
решение заключается в использовании $GLOBALS, когда вы объявляете эту переменную:
$my_var= 'blabla';
$GLOBALS['my_var'] = 'blabla';