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