2013-03-28 2 views
43

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

<?php 
$data='My data'; 
function menugen(){ 

    echo "[".$data."]"; 
} 
menugen(); 
?> 

출력 []있다.

+3

는 글로벌로 취급 설명서는 말을 않는 인수 –

+1

로 함수에 전달하지 않습니다? – deceze

+0

관련 읽기 : [PHP 전역 기능] (http://stackoverflow.com/q/5166087/1409082) – Jocelyn

답변

83

당신이 접근 할 수 있습니다있는 전역 변수를 선언이 때문에 작동하지 않습니다 :

$data='My data'; 
function menugen(){ 
    global $data; // <-- add this line 
    echo "[".$data."]"; 
} 
menugen(); 

그렇지 않으면 당신을 $GLOBALS['data']으로 액세스 할 수 있습니다. http://php.net/manual/en/language.variables.scope.php

약간의 구약이라도 사용하지 않는 것이 좋습니다. 전역 변수는 매개 변수로 전달하는 것을 선호합니다.

+0

고마워, 네 말이 맞지만 두 번째 예제에서이 줄을 사용하지 않았다. http : //php.net/manual/en/language.variables.scope.php –

+3

실제로 두 번째 예제는 이 스크립트는 echo 문이 $ a 변수의 로컬 버전을 참조하고이 범위 내에서 값을 할당받지 않았기 때문에 출력을 생성하지 않습니다. ' –

+1

Dang! 난 단지 php 변수의 범위를 잊어 버렸기 때문에이 대답을 upvote에 로그인해야만했다. –

0

당신은 함수에 변수를 전달해야

$data = 'My data'; 

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

범위의 문제입니다. 즉, 글로벌 변수는 SO 피해야한다 : 참조 : 그것은

class MyClass 
{ 
    private $data = ""; 

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

} 

편집 클래스 및 액세스에

$data = 'My data'; 

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

또는 그것을 가지고 :

당신에게 하나가 매개 변수로 전달해야 @MatteoTassinari뿐만 아니라 글로벌 액세스로 표시 할 수 있지만 일반적으로 전역 변수는 필요하지 않으므로 코딩을 다시 생각하는 것이 현명합니다.

+0

그리고 또 다른 방법은 ** global ** 키워드를 사용하는 것입니다 (이것이 최선의 방법은 아닙니다). – Jocelyn

+0

그래, 그냥 Matteo의 게시물에 언급을 추가하도록 편집했습니다. – webnoob

+0

"Should"는 질문에 답하지 않고 모든 경우에 대해 최선의 방법이 아닐 수도 있습니다. 간단한 스크립트의 경우 매개 변수를 변경하고 클래스를 추가하는 것이 어렵습니다. 자바 스크립트와 마찬가지로 PHP에서 모든 것이 객체 지향적이어야하고 wazoo의 이름 공간이 필요하지는 않습니다. – Beejor

7

다음 중 하나를 수행 할 수

<?php 
$data='My data'; 
function menugen(){ 
    global $data; 
    echo "[".$data."]"; 
} 
menugen(); 

또는

말했다되고 그건
<?php 
$data='My data'; 
function menugen(){ 
    echo "[".$GLOBALS['data']."]"; 
} 
menugen(); 

는 전역의 남용은 형편없는 코드로 이어질 수 있습니다. 일반적으로 필요한 것을 전달하는 것이 좋습니다. 예를 들어 전역 데이터베이스 객체를 참조하는 대신 데이터베이스에 대한 핸들을 전달하고 그에 따라 행동해야합니다. 이것은 종속성 주입이라고합니다. 자동화 된 테스트를 구현하면 일상 생활이 훨씬 쉬워집니다.

3

또 다른 방법은 그것을 할 : 당신은 당신이 한 번 변경 정의 할 수없는 상수를 만들고 사용하는 기능이 있지만이 기능을 "정의"할 수 원하는 경우

<?php 

$data = 'My data'; 

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

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

$menugen(); 
-1

.

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

function myTest() { 
    echo GREETING; 
} 

myTest(); 
?> 

http://www.w3schools.com/php/php_constants.asp

+0

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

+0

다른 점은 무엇입니까? 아무 것도 저장할 수 있습니다. –

+2

한 번 정의 된 상수는 변경할 수 없습니다. – Beejor