Подтвердить что ты не робот

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

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

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

Ответ 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';