无法访问函数内部的全局变量

2022-08-30 09:23:09

这个(我的代码的简化版本)不起作用:

<?php
    $sxml = new SimpleXMLElement('<somexml/>');

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

    foo();
?>

为什么?我想访问,因为我想在失败时记录错误。 以递归方式调用自身以创建目录列表,因此我担心将整体传递给自身(如)可能会损害性能。$sxmlfoo()foo()$sxmlfoo($sxml)

有没有办法在不将其作为参数传递的情况下访问内部?(PHP 5.2.x+)$sxml$foo

编辑:实际上,如果代码看起来像这样呢?

<?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');
}

推荐