Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Can';t访问函数内部的全局变量_Php_Variables_Scope_Global Variables - Fatal编程技术网

Php Can';t访问函数内部的全局变量

Php Can';t访问函数内部的全局变量,php,variables,scope,global-variables,Php,Variables,Scope,Global Variables,此(我的代码的简化版本)不起作用: <?php $sxml = new SimpleXMLElement('<somexml/>'); function foo(){ $child = $sxml->addChild('child'); } foo(); ?> 您必须将其传递给函数: <?php $sxml = new SimpleXMLElement('<somexml/>');

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

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

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

    foo();
?>

您必须将其传递给函数:

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

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

    foo($sxml);
?>

您需要显式邀请全局变量进入函数范围:

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

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

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

另一种解决方案是在声明变量时使用$GLOBALS

         $my_var   = 'blabla';    // not global
$GLOBALS['my_var'] = 'blabla';    // global  (correct)

虽然上面的答案提供了一个很好的解决方案,但我认为在大多数现代PHP应用程序中,合适的解决方案是创建一个带有静态变量的类,如下所示:

<?php

class xmlHelper {
    private static $sxml;

    public function getXML() {
        return self::$sxml;
    }

    public function setXML($xml) {
        self::$sxml = $xml;
    }
}

xmlHelper::setXML(new SimpleXMLElement('<somexml/>'));

function foo(){
    $child = xmlHelper::getXML()->addChild('child');
}

foo();
addChild('child');
}
foo();
这种方法允许您根据需要从
foo()
中访问
$sxml
,但与
全局
方法相比,它有一些优势

  • 使用此策略,您将始终能够在
    setXML()
    中放置断点,以找出应用程序的哪个部分操纵了此值,而在操纵全局变量时,您不能这样做
  • 您可以避免使用通用变量名
    sxml
    污染全局命名空间

  • 请执行OOP或将其作为参数传递。可重用性是关键。@TheHPDeveloper我理解您的观点,但我刚刚开始使用PHP,这可能不是我将重用的代码。这更像是一个原型,如果出了问题,我可以扔掉它,从头开始。还有一件事。。。如果变量在父函数中会怎样?(问题编辑):(在第二个示例中,您无法从foo()访问$sxml,因为它是在bar()中本地定义的。解决方案可以是:在foo()和bar()之外声明$sxml,并在两个函数中使用global。但正如HPDeveloper所建议的,您应该使用OOP;)
    function foo(){
        global $sxml;
        $child = $sxml->addChild('child');
    }
    
    <?php
        $sxml = new SimpleXMLElement('<somexml/>');
        function foo(){
        global   $sxml;  
        $child = $sxml->addChild('child');
        }
        foo();
    ?>
    
             $my_var   = 'blabla';    // not global
    $GLOBALS['my_var'] = 'blabla';    // global  (correct)
    
    <?php
    
    class xmlHelper {
        private static $sxml;
    
        public function getXML() {
            return self::$sxml;
        }
    
        public function setXML($xml) {
            self::$sxml = $xml;
        }
    }
    
    xmlHelper::setXML(new SimpleXMLElement('<somexml/>'));
    
    function foo(){
        $child = xmlHelper::getXML()->addChild('child');
    }
    
    foo();