development

함수 내부의 전역 변수에 액세스 할 수 없습니다.

big-blog 2020. 12. 28. 22:24
반응형

함수 내부의 전역 변수에 액세스 할 수 없습니다.


이것은 (내 코드의 단순화 된 버전) 작동하지 않습니다.

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

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

    foo();
?>

왜? 실패하면 $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();
?>

함수에 전달해야합니다.

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

전역 변수를 함수 범위에 명시 적으로 초대해야합니다.

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

전역 키워드를 사용하여 함수 내에서 $ sxml을 선언합니다.

<?php
    $sxml = new SimpleXMLElement('<somexml/>');
    function foo(){
    global   $sxml;  
    $child = $sxml->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();

이 접근 방식을 사용하면 원하는대로 $sxml내부 에서 액세스 할 수 foo()있지만 global접근 방식에 비해 몇 가지 장점이 있습니다.

  1. With this strategy, you will always be able to put a breakpoint inside setXML() to find out what part of your application has manipulated this value, which you cannot do when manipulating globals.
  2. You avoid polluting the global namespace with a generic variable name sxml.

ReferenceURL : https://stackoverflow.com/questions/5449526/cant-access-global-variable-inside-function

반응형