[php] PHP 함수에서 전역 변수에 액세스

대부분의 프로그래밍 언어 범위 규칙에 따르면 내부 함수 외부에 정의 된 변수에 액세스 할 수 있지만이 코드가 작동하지 않는 이유는 무엇입니까?

<?php
    $data = 'My data';

    function menugen() {
        echo "[" . $data . "]";
    }

    menugen();
?>

출력은 [].



답변

액세스 할 전역 변수를 선언 해야 하기 때문에 작동하지 않습니다 .

$data = 'My data';

function menugen() {
    global $data; // <-- Add this line

    echo "[" . $data . "]";
}

menugen();

그렇지 않으면 $GLOBALS['data']. 변수 범위를 참조하십시오 .

주제에서 약간 벗어난 경우에도 전역 사용을 전혀 피하고 매개 변수로 전달하는 것을 선호합니다.


답변

다음 중 하나를 수행 할 수 있습니다.

<?php
    $data = 'My data';

    function menugen() {
        global $data;
        echo "[" . $data . "]";
    }

    menugen();

또는

<?php
    $data = 'My data';

    function menugen() {
        echo "[" . $GLOBALS['data'] . "]";
    }

    menugen();

즉, 전역을 과도하게 사용하면 코드가 잘못 될 수 있습니다. 일반적으로 필요한 것을 전달하는 것이 좋습니다. 예를 들어 전역 데이터베이스 개체를 참조하는 대신 데이터베이스에 대한 핸들을 전달하고 이에 따라 작업해야합니다. 이를 종속성 주입 이라고 합니다. 자동화 된 테스트를 구현하면 삶이 훨씬 쉬워집니다.


답변

범위의 문제입니다. 즉, 글로벌 변수는 피해야한다 그래서 :

매개 변수로 전달해야합니다.

$data = 'My data';

function menugen($data)
{
    echo $data;
}

또는 수업에 참여하고 액세스

class MyClass
{
    private $data = "";

    function menugen()
    {
        echo this->data;
    }

}

@MatteoTassinari 답변도 참조하십시오. 전역으로 표시하여 액세스 할 수 있지만 전역 변수는 일반적으로 필요하지 않으므로 코딩을 다시 생각하는 것이 좋습니다.


답변

이를 수행하는 또 다른 방법 :

<?php

$data = 'My data';

$menugen = function() use ($data) {

    echo "[".$data."]";
};

$menugen();

업데이트 2020-01-13 : Peter Mortensen의 요청

PHP 5.3.0부터 클로저를 생성 할 수있는 익명 함수 지원이 있습니다. 클로저는 범위 밖에서 생성 된 변수에 접근 할 수 있습니다.

예제에서 클로저는 절 $data에서 선언 되었기 때문에 액세스 할 수 있습니다 use.


답변

수년 동안 저는 항상이 형식을 사용했습니다.

<?php
    $data = "Hello";

    function sayHello(){
        echo $GLOBALS["data"];
    }

    sayHello();
?>

간단하고 따라하기 쉽습니다. $ GLOBALS는 PHP가 전역 변수를 참조하는 방법입니다. $ _SERVER, $ _POST 등과 같은 것을 사용했다면 알지 못하는 사이 전역 변수를 참조하게됩니다.


답변

함수에 변수를 전달해야합니다.

$data = 'My data';

function menugen($data)
{
    echo $data;
}


답변

<?php

    $data = 'My data';

    $menugen = function() use ($data) {

        echo "[ $data ]";
    };

    $menugen();
?>

또한 단순화 할 수 있습니다.

echo "[" . $data . "]"

…에

echo "[$data]"