PHP 함수에서 전역 변수에 액세스


83

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

<?php
    $data = 'My data';

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

    menugen();
?>

출력은 [].


3
글로벌로 취급 인수로 함수에 전달하지 않습니다
마크 베이커

2
매뉴얼에서 그러한 내용은 어디에 있습니까?
deceze


이 페이지에서 두 번째 예제를 확인 : php.net/manual/en/language.variables.scope.php
아민 Gholibeigian

$ GLOBALS [ 'varname']을 사용하여 액세스 할 수 있습니다. 여기서 인덱스 "varname"은 함수 외부에서 $ varname입니다. 실제로 print_r ($ GLOBALS)를 사용하여 모든 전역 변수를 볼 수 있습니다.
Ahmad

답변:


163

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

$data = 'My data';

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

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

menugen();

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

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


덕분에, 당신은 잘하지만 그들은 수동의 두 번째 예에서이 줄을 사용하지 않았다 php.net/manual/en/language.variables.scope.php
아민 Gholibeigian

6
사실 두 번째 예는 어떤 독자를 보여주고 있다는 것을 하지 할 :This script will not produce any output because the echo statement refers to a local version of the $a variable, and it has not been assigned a value within this scope.
마테오 Tassinari

2
댕! 나는 오싹하게 php 변수 범위 지정을 잊어 버렸기 때문에이 답변을 찬성하기 위해 로그인해야했습니다.
Milche Patern 2015

19

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

<?php
    $data = 'My data';

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

    menugen();

또는

<?php
    $data = 'My data';

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

    menugen();

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


12

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

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

$data = 'My data';

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

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

class MyClass
{
    private $data = "";

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

}

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


또 다른 방법은 global 키워드를 사용하는 것입니다 (허용됨, 이것이 최선의 방법이 아님).
조슬린

1
"Should"는 질문에 대한 답이 아니며 이것이 모든 경우에 최선의 접근 방식이 아닐 수도 있습니다. 간단한 스크립트의 경우 매개 변수를 변경하고 클래스를 추가하는 것은 어색합니다. JavaScript와 마찬가지로 PHP에서는 모든 것이 객체 지향적 일 필요가없고 wazoo에서 네임 스페이스가 지정 될 필요는 없습니다.
Beejor

@Beejor OP에라는 함수가 있다는 점을 감안할 때 menugen()단순히 메뉴를 생성하는 것보다 더 많은 것이 진행될 것임을 의미합니다. 예를 들어, 다른 소스에서 더 많은 항목을 추가하기 위해 해당 메뉴를 확장하는 것은 어떻습니까? 메뉴에있는 현재 선택된 페이지를 선택하는 것은 어떻습니까? 무작위 전역 변수와 논리가 OOP 디자인에 비명을 지르는 곳입니다. PHP / JS가 구조화 될 필요가 없다는 사실은 복잡한 코드를 많이 찾는 가장 큰 이유 중 하나입니다. 그것은 매우 잘 할 수 있지만 사람들이 앞으로의 유지 관리 가능성에 대해 생각하지 못하게합니다.
webnoob

추신 반대 투표도 약간 떨어져 있습니다. 대답은 OP의 문제에 대한 해결책을 제공합니다. 당신이 그것을 좋아하지 않는다고해서 그것이 잘못되지는 않습니다.
webnoob

1
@Beejor-그 주장의 문제는 사람들이 더 잘 알지 못하고 말하지 않으면 더 잘 알지 못하기 때문에 전역 변수가 필요 하다고 생각할 수 있다는 입니다.
webnoob

10

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

<?php

$data = 'My data';

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

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

$menugen();

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

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

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


이것은 내 경우에 다른 함수 내에서 변수로 정의 된 함수가있는 유일한 작업 솔루션이었습니다. Global은 거기에서 작동하지 않았습니다.
Kar.ma

설명이 필요합니다. 예,이 "사용"물건은 무엇을합니까? 이 "사용"대상은 어떤 PHP 버전에서 지원됩니까? (제발로 응답 답변을 편집 ) 적절한 (코멘트하지 여기에, 감사합니다 사전에..)
피터 모텐슨

승인 된 ans가 Wordpress 관리자 플러그인 페이지에 출력을 표시하지 않는 이유를 모르지만이 ans는 잘 작동합니다.
Naimur Hasan

3

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

<?php
    $data = "Hello";

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

    sayHello();
?>

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


어느 것? $GLOBAL(텍스트) 또는 $GLOBALS(샘플 코드)? (가 응답하시기 바랍니다 답변을 편집 ) 적절한 (코멘트하지 여기에.)
피터 모텐슨에게

$ GLOBAL이 아닌 $ GLOBALS입니다. "S"가 있어야합니다. 그런 다음 연관 배열에 대한 키와 같은 변수 이름을 참조하십시오.
시편 Kalu

제발 그것을 편집하여 답변을 업데이트 시작 ( 편집을 클릭, " 편집 " 사이에 "공유""플래그" 그 세 가지가 왼쪽에 있습니다 -.의 왼쪽에 "편집""대답" 대답 한 후, 그 자체,이 주석 위에, 그리고 여기에 세 가지 주석 모두). 댓글의 정보는 언제든지 사라질 수 있습니다. 이것은 포럼 이 아닙니다 . 여기에서 정보 를 업데이트 할 수 있으며 업데이트해야합니다 . 정말로 미리 감사드립니다.
Peter Mortensen

0

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

$data = 'My data';

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

0
<?php

    $data = 'My data';

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

        echo "[ $data ]";
    };

    $menugen();
?>

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

echo "[" . $data . "]"

...에

echo "[$data]"

echo "[" . $data . "]"echo "[ $data ]"같은 (후자의 출력에서 두 개의 여분의 공간)이 아니다.
Peter Mortensen

-1

원하는 경우 "define"함수를 사용할 수 있지만이 함수는 정의 된 후에는 변경할 수없는 상수를 생성합니다.

<?php
    define("GREETING", "Welcome to W3Schools.com!");

    function myTest() {
        echo GREETING;
    }

    myTest();
?>

PHP 상수


이것은 변수가 아닌 전역 상수를 정의합니다.
Beejor

3
상수는 정의 된 후에는 변경할 수 없습니다.
Beejor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.