대부분의 프로그래밍 언어 범위 규칙에 따르면 내부 함수 외부에 정의 된 변수에 액세스 할 수 있지만이 코드가 작동하지 않는 이유는 무엇입니까?
<?php
$data = 'My data';
function menugen() {
echo "[" . $data . "]";
}
menugen();
?>
출력은 []
.
대부분의 프로그래밍 언어 범위 규칙에 따르면 내부 함수 외부에 정의 된 변수에 액세스 할 수 있지만이 코드가 작동하지 않는 이유는 무엇입니까?
<?php
$data = 'My data';
function menugen() {
echo "[" . $data . "]";
}
menugen();
?>
출력은 []
.
답변:
액세스 할 전역 변수를 선언 해야 하기 때문에 작동하지 않습니다 .
$data = 'My data';
function menugen() {
global $data; // <-- Add this line
echo "[" . $data . "]";
}
menugen();
그렇지 않으면 $GLOBALS['data']
. 변수 범위를 참조하십시오 .
주제에서 약간 벗어난 경우에도 전역 사용을 전혀 피하고 매개 변수로 전달하는 것을 선호합니다.
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.
다음 중 하나를 수행 할 수 있습니다.
<?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 답변도 참조하십시오. 전역으로 표시하여 액세스 할 수 있지만 전역 변수는 일반적으로 필요하지 않으므로 코딩을 다시 생각하는 것이 좋습니다.
menugen()
단순히 메뉴를 생성하는 것보다 더 많은 것이 진행될 것임을 의미합니다. 예를 들어, 다른 소스에서 더 많은 항목을 추가하기 위해 해당 메뉴를 확장하는 것은 어떻습니까? 메뉴에있는 현재 선택된 페이지를 선택하는 것은 어떻습니까? 무작위 전역 변수와 논리가 OOP 디자인에 비명을 지르는 곳입니다. PHP / JS가 구조화 될 필요가 없다는 사실은 복잡한 코드를 많이 찾는 가장 큰 이유 중 하나입니다. 그것은 매우 잘 할 수 있지만 사람들이 앞으로의 유지 관리 가능성에 대해 생각하지 못하게합니다.
이를 수행하는 또 다른 방법 :
<?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 등과 같은 것을 사용했다면 알지 못하는 사이 전역 변수를 참조하게됩니다.
<?php
$data = 'My data';
$menugen = function() use ($data) {
echo "[ $data ]";
};
$menugen();
?>
또한 단순화 할 수 있습니다.
echo "[" . $data . "]"
...에
echo "[$data]"
echo "[" . $data . "]"
와 echo "[ $data ]"
같은 (후자의 출력에서 두 개의 여분의 공간)이 아니다.