PHP에서 전역 변수를 선언하는 방법은 무엇입니까?


168

다음과 같은 코드가 있습니다.

<?
    $a="localhost";
    function body(){
        global $a;
        echo $a;
    }

    function head(){
        global $a;
        echo $a;
    }

    function footer(){
        global $a;
        echo $a;
    }
?>

한 곳에서 전역 변수를 정의하고 $a모든 기능에서 한 번에 변수에 액세스 할 수있는 방법이 있습니까? global $a;더 사용하지 않고 ?


15
없습니다. global키워드 가 마음에 들지 않으면 $GLOBALS['a']모든 범위 에서 슈퍼 글로벌을 사용 하거나 매개 변수를 함수에 전달하는 것을 고려하십시오.
Michael Berkowski

5
중요한 것이면 세션 var도 사용할 수 있습니다.
Nikos Tsirakis

답변:


259

$GLOBALS어레이가 대신 사용될 수있다 :

$GLOBALS['a'] = 'localhost';

function body(){

    echo $GLOBALS['a'];
}

로부터 수동 :

현재 스크립트의 전체 범위에 정의 된 모든 변수에 대한 참조를 포함하는 연관 배열입니다. 변수 이름은 배열의 키입니다.


공통 변수가 필요한 함수 집합이있는 경우 전역 속성 대신 속성이있는 클래스를 선택하는 것이 좋습니다.

class MyTest
{
    protected $a;

    public function __construct($a)
    {
        $this->a = $a;
    }

    public function head()
    {
        echo $this->a;
    }

    public function footer()
    {
        echo $this->a;
    }
}

$a = 'localhost';
$obj = new MyTest($a);

78

변수가 변경되지 않으면 사용할 수 있습니다 define

예:

define('FOOTER_CONTENT', 'Hello I\'m an awesome footer!');

function footer()
{
    echo FOOTER_CONTENT;
}

2
FOOTER_CONTENT수정을 시도 하면 어떻게됩니까 ? 그것은 단지처럼 final자바 또는 constC, C ++ 및 C #에서?
Lion

4
FOOTER_CONTENT를 두 번째로 정의하려고하면 PHP가 이에 대해 알림을 보냅니다.
Dale

페이지가로드 될 때마다 현재 유닉스 시대 시간을 계산 한 다음 그 값을 몇 가지 계산 (함수)으로 사용하십시오. "정의"는 나를 위해 일했다. 처음에는 "echo FOOTER_CONTENT;"를 보지 못했습니다. 앞에 '$'이 없었고 오류가 발생했습니다.
user208145

변수가 변수가 아닌 경우 변수가 변경되지 않습니다. 그렇지 않습니까?!
Sajidur Rahman

29

$ GLOBALS 슈퍼 전역 배열에 변수를 추가하십시오.

$GLOBALS['variable'] = 'localhost'; 

전 세계적으로 사용

또는 스크립트 전체에서 액세스 할 수있는 상수를 사용할 수 있습니다

define('HOSTNAME', 'localhost');  

1
일단 정의 된 'define'을 사용하면 정의를 변경할 수 없습니다!
Reza MA

첫 번째 예에서 '$ variable은 이제 스크립트에서 나중에'localhost '라고합니다.
Zach Smith

이 변수를 사용하려면 $ GLOBALS [ 'variable']과 같이 사용해야합니다.
Pankaj Khairnar

25

변수가 함수 외부에서 선언되면 이미 전역 범위에 있습니다. 따라서 선언 할 필요가 없습니다. 그러나이 변수를 호출 한 위치에서이 변수에 액세스 할 수 있어야합니다. 함수 내부에서 호출하는 경우 global키워드 를 사용해야 합니다.

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

함수 외부에서 글로벌 키워드를 사용하는 것은 오류가 아닙니다. 이 파일을 함수에 포함 시키려면 변수를로 선언하면됩니다 global.

config.php

global $variable;

$variable = 5;

other.php

function name()
{
    require_once __DIR__ . '/config.php';
}

사용할 수도 있습니다 $GLOBALS. 그것은 초 세계적이므로 어디에서나 액세스 할 수 있습니다.

$GLOBALS['variable'] = 5;

function name()
{
    echo $GLOBALS['variable'];
}

선택에 따라 둘 중 하나를 선택할 수 있습니다.


9

이 답변은 매우 늦었지만 부울, 배열 및 정수 초기 값을 전역 범위 정적 변수로 보유하는 클래스를 설정했습니다. 상수 문자열은 그대로 정의됩니다.

define("myconstant", "value"); 

class globalVars {

    static $a = false;

    static $b = 0;

    static $c = array('first' => 2, 'second' => 5);

}


function test($num) {

    if (!globalVars::$a) {

        $returnVal = 'The ' . myconstant . ' of ' . $num . ' plus ' . globalVars::$b . ' plus ' . globalVars::$c['second'] . ' is ' . ($num + globalVars::$b + globalVars::$c['second']) . '.';

        globalVars::$a = true;

    } else {

        $returnVal = 'I forgot';

    }

    return $returnVal;

}

echo test(9); ---> The value of 9 + 0 + 5 is 14.

echo "<br>";

echo globalVars::$a; ----> 1

static키워드 그렇지 않으면 클래스에 있어야합니다 $ A, $ B를 바르, 및 $ C 세계적 범위되지 않습니다.


여러 가지 이유로 좋은 솔루션입니다. 정적 클래스에는 기본 변수 이름에 몇 자만 추가하면됩니다. G :: $ Name, 선언은 다음과 같습니다. class G {static $ Name, $ Name2;} G는 전역 변수 일 수 있습니다. 직원과 관련된 변수에 사용됩니다. PHP가 지원하는 풀 스케일 객체 지향 패러다임보다 프로그래밍하기가 더 쉽습니다. 상수가 정말로 필요한 경우, "정적"뒤에 선언 된 변수와 같이 "const"뒤에 선언 할 수 있습니다. 달러 기호 만 빼십시오. G :: 예는 전역 상수의 예입니다.
David Spector

5

당신은 당신이 질문을 쓴 방식으로 이것을 대답했습니다- 'define'을 사용하십시오. 그러나 일단 설정되면 정의를 변경할 수 없습니다.

또는 class :: constant와 같이 클래스에 상수가있는 트릭이 있습니다. 정적 속성을 변경하려는 경우 정적 속성을 설정하는 함수를 사용하여 클래스에 정적 속성을 선언하여 변수를 변수로 만들 수도 있습니다.


5

이것이 의도에 맞는 경우 클로저 함수 또는 Lambdasuse 에서 키워드 를 사용해 볼 수 있습니다 ... PHP 7.0. 그것은 더 좋지는 않지만 대안입니다.

$foo = "New";
$closure = (function($bar) use ($foo) {
    echo "$foo $bar";
})("York");

데모 | 정보


1

조금 다르게 생각합시다.

class globe{
    static $foo = "bar";
}

다음과 같이 원하는대로 사용하고 수정할 수 있습니다.

function func(){
    echo globe::$foo;
}

0

변수 대신 절차 함수를 사용하여 어디에서나 호출하면 어떻게 될까요?

나는 보통 구성 값을 모아서 return 문으로 함수 안에 넣습니다. 나는 단지 글로벌 가치를 활용하고 특정 기능을 호출 해야하는 곳에 포함시킵니다.

function host()
{
   return "localhost";
}

0

$GLOBALS[] 이다 적합한 솔루션은,하지만 우리는 대안에 대해 얘기하고 있기 때문에, 기능도 쉽게 작업을 할 수 있습니다 :

function capital() {
    return my_var() . ' is the capital of Italy';
}

function my_var() {
    return 'Rome';
}

-19

더 이상 전역을 사용해서는 안되며 PHP 5.4에서는 사용할 수 없습니다.


19
REGISTER GLOBALS가 제거되었습니다. 글로벌이 아닙니다.
unity100

7
이 답변은 서면으로 틀 렸으며 unity100의 의견을 반영하여 업데이트되어야합니다. 그래도 GLOBALS를 사용할 수 있다면 GLOBAL vars의 어떤 부분이 변경되었는지 명확히하십시오. 이 같은.
crashwap


@RobertColumbia 매우 흥미로운 게시물이며 다른 답변을 염두에 두어야하지만이 특별한 경우에는 적용되지 않습니다. (저는 메타를 사용하여 "하지 마십시오"라는 대답 어떻게 유효 수 있는지를 지적하고 이것이 옳다는 것을 정당화하지는 않기를 바랍니다.) " "하지 마십시오 " 올바른 대답이 될 있습니다 . "-" ""하지 "입니다 수 있습니다. " 하지만 때로는 아무 것도 대신 할 필요가 없습니다 . 잘못된 일을 중단하면 모든 것이 마술처럼 다시 작동하기 시작합니다. "-코드가 "파손되지"않았으므로 여기에는 적용되지 않습니다. OP는 단지 "낮은 타이핑"방식의 작업을 원합니다. …
robinCTS

" 실제로 질문에 대답하려고합니까? 대부분의 경우, "- "모두"가 아니라 "모두"입니다. (나는 심지어 "가장 많은 것"에 대해 이의를 제기 할 것이지만, 정보에 근거한 주장을하기에 충분한 대답을 보지 못했다.). " .이 경우, 그것은 아니다 "그리고이 "답"이 바로 그 이유도없는에서 - " 더 나쁜, 머피의 대답은 문제에 대한 해결책을 제시하지 않습니다. " "그리고 그것은주고를하지 않습니다 " 자신의 문제에 대한 해결책과 유사한 도구 나 방법 또는 무엇인가를 요구하는 것 " …
robinCTS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.