source

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

manysource 2023. 9. 2. 08:36

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

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

<?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을 선언하려면 global 키워드를 사용합니다.

<?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. 이 전략을 사용하면 언제든지 내부에 중단점을 둘 수 있습니다.setXML()글로벌을 조작할 때 수행할 수 없는 이 값을 조작한 응용 프로그램의 부분을 확인합니다.
  2. 일반 변수 이름으로 글로벌 네임스페이스를 오염시키지 않도록 합니다.sxml.

언급URL : https://stackoverflow.com/questions/5449526/cant-access-global-variable-inside-function