대부분의 프로그래밍 언어 범위 규칙에 따르면 함수 내부에서 정의 된 변수에 액세스 할 수 있지만이 코드가 작동하지 않는 이유는 무엇입니까?함수의 PHP 액세스 전역 변수
<?php
$data='My data';
function menugen(){
echo "[".$data."]";
}
menugen();
?>
출력 []있다.
대부분의 프로그래밍 언어 범위 규칙에 따르면 함수 내부에서 정의 된 변수에 액세스 할 수 있지만이 코드가 작동하지 않는 이유는 무엇입니까?함수의 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']
으로 액세스 할 수 있습니다. http://php.net/manual/en/language.variables.scope.php
약간의 구약이라도 사용하지 않는 것이 좋습니다. 전역 변수는 매개 변수로 전달하는 것을 선호합니다.
고마워, 네 말이 맞지만 두 번째 예제에서이 줄을 사용하지 않았다. http : //php.net/manual/en/language.variables.scope.php –
실제로 두 번째 예제는 이 스크립트는 echo 문이 $ a 변수의 로컬 버전을 참조하고이 범위 내에서 값을 할당받지 않았기 때문에 출력을 생성하지 않습니다. ' –
Dang! 난 단지 php 변수의 범위를 잊어 버렸기 때문에이 대답을 upvote에 로그인해야만했다. –
당신은 함수에 변수를 전달해야
$data = 'My data';
function menugen($data)
{
echo $data;
}
범위의 문제입니다. 즉, 글로벌 변수는 SO 피해야한다 : 참조 : 그것은
class MyClass
{
private $data = "";
function menugen()
{
echo this->data;
}
}
편집 클래스 및 액세스에
$data = 'My data';
function menugen($data)
{
echo $data;
}
또는 그것을 가지고 :
당신에게 하나가 매개 변수로 전달해야 @MatteoTassinari뿐만 아니라 글로벌 액세스로 표시 할 수 있지만 일반적으로 전역 변수는 필요하지 않으므로 코딩을 다시 생각하는 것이 현명합니다.
다음 중 하나를 수행 할 수
<?php
$data='My data';
function menugen(){
global $data;
echo "[".$data."]";
}
menugen();
또는
말했다되고 그건<?php
$data='My data';
function menugen(){
echo "[".$GLOBALS['data']."]";
}
menugen();
는 전역의 남용은 형편없는 코드로 이어질 수 있습니다. 일반적으로 필요한 것을 전달하는 것이 좋습니다. 예를 들어 전역 데이터베이스 객체를 참조하는 대신 데이터베이스에 대한 핸들을 전달하고 그에 따라 행동해야합니다. 이것은 종속성 주입이라고합니다. 자동화 된 테스트를 구현하면 일상 생활이 훨씬 쉬워집니다.
또 다른 방법은 그것을 할 : 당신은 당신이 한 번 변경 정의 할 수없는 상수를 만들고 사용하는 기능이 있지만이 기능을 "정의"할 수 원하는 경우
<?php
$data = 'My data';
$menugen = function() use ($data) {
echo "[".$data."]";
};
$menugen();
.
<?php
define("GREETING", "Welcome to W3Schools.com!");
function myTest() {
echo GREETING;
}
myTest();
?>
는 글로벌로 취급 설명서는 말을 않는 인수 –
로 함수에 전달하지 않습니다? – deceze
관련 읽기 : [PHP 전역 기능] (http://stackoverflow.com/q/5166087/1409082) – Jocelyn