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

Cam*_*tin 56 php variables scope global-variables

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

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

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

    foo();
?>
Run Code Online (Sandbox Code Playgroud)

为什么?我想访问,$sxml因为我想在foo()失败时记录错误. foo()递归调用自己来创建一个目录列表,所以我担心将整体传递给$sxml自己(如同foo($sxml))可能会损害性能.

有没有办法进入$sxml内部$foo而不将其作为参数传递?(PHP 5.2.x +)

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

<?php
    bar(){
        $sxml = new SimpleXMLElement('<somexml/>');
        function foo(){
            $child = $sxml->addChild('child');
        }
        foo();
    }
    bar();
?>
Run Code Online (Sandbox Code Playgroud)

Jav*_*i R 111

你必须将它传递给函数:

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

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

    foo($sxml);
?>
Run Code Online (Sandbox Code Playgroud)

或宣布全球:

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

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

    foo();
?>
Run Code Online (Sandbox Code Playgroud)

如果变量不是全局变量而是在外部函数中定义,则第一个选项(作为参数传递)的工作方式相同:

<?php
    function bar() {
        $sxml = new SimpleXMLElement('<somexml/>');
        function foo($sxml) {
            $child = $sxml->addChild('child');
        }
        foo($sxml);
    }
    bar();
?>
Run Code Online (Sandbox Code Playgroud)

或者,通过在子句中声明变量来创建闭包use.

<?php
    function bar() {
        $sxml = new SimpleXMLElement('<somexml/>');
        function foo() use(&$xml) {
            $child = $sxml->addChild('child');
        }
        foo();
    }
    bar();
?>
Run Code Online (Sandbox Code Playgroud)


mar*_*rio 20

您需要将全局变量显式地邀请到函数范围中:

function foo(){
    global $sxml;
    $child = $sxml->addChild('child');
}
Run Code Online (Sandbox Code Playgroud)


Sha*_*fiz 5

使用 global 关键字在函数内声明 $sxml。

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