- php에 존재하는 scope 종류 -
php에는 scope가 딱 두 종류 있습니다.
하나는 글로벌 스코프고, 다른 하나는 함수 스코프입니다.
다른 언어들처럼 블록 스코프가 존재하지 않습니다.
글로벌 스코프, 아니면 함수 스코프이기 때문에 함수 안에서는 블록과 상관없이 자유롭습니다.
블록 안에서 정의한 변수일지라도 블록 밖에서 접근할 수 있습니다.
반대로, 블록 밖에서 정의한 변수를 블록 안에서 접근할 수도 있습니다.
function foo(){
if (true) {
$var = "hello big world";
}
echo $var; //=>"hello big world"
}
- 글로벌 스코프와 함수 스코프 사이의 독립성 -
글로벌 스코프와 함수 스코프는 서로 따로 존재합니다.
함수 안에서 선언한 변수를 글로벌 스코프에서 접근할 수도 없고,
반대로 글로벌 스코프에서 선언한 변수를 함수 안에서 접근할 수도 없습니다.
//함수 스코프에서 글로벌 변수에 접근 불가
$msg = "hello big world";
function foo1(){
echo $msg;
}
foo1(); //=> Undefined variable: msg on line number ~~
//글로벌 스코프에서 함수 변수에 접근 불가
function foo1(){
$msg = "hello big world";
}
foo1();
echo $msg; //=> Undefined variable: msg on line number ~~
- 함수 안에서 글로벌 스코프 변수에 접근하기 -
함수 스코프와 글로벌 스코프는 서로 독립적이라고 했습니다.
그렇지만 접근할 방법이 아예 없지는 않습니다.
먼저 함수 스코프에서 글로벌 스코프에 접근하는 법을 알아보겠습니다.
글로벌 스코프에 저장된 변수는 $GLOBALS라는 변수 안에 들어 있습니다.
$GLOBALS['변수명'] 으로 접근할 수 있습니다.
//함수 스코프 안에서 글로번 변수에 접근하기
$msg = "hello big world";
echo $msg; //=> hello big world
function foo2(){
$result = $GLOBALS['msg'];
echo $result; //=> hello big world
$GLOBALS['msg'] = "hello from foo2";
}
foo2();
echo $msg; //=> hello from foo2
- 글로벌 스코프에서 함수 스코프 변수에 접근하기 -
이번에는 함수 안에서 정의해 놓은 변수를 함수 밖에서 접근할 수 있도록 만드는 방법을 알아보겠습니다.
앞에서 알아봤던 글로벌 변수 $GLOBALS를 활용해 봅시다.
함수 밖에서 쓰고 싶은 데이터를 $GLOBALS 변수 안에 넣어 둡니다.
그러면 글로벌 스코프에서 선언한 변수와 마찬가지가 됩니다.
//함수 스코프 안에서 글로벌 변수로 데이터 전달하기
function foo3(){
$GLOBALS['msg'] = "hello big world";
}
foo3();
echo $msg;
- 함수 내부 값을 유지하기 -
함수가 끝나면 함수 안에서 사용했던 함수 스코프 변수들은 스택에서 릴리즈 됩니다.
함수를 한 번만 부르고 말 거라면 메모리 낭비가 적어지니 그게 더 낫겠죠.
하지만 그 함수를 여러 번 부를 거라면 이야기가 다릅니다.
여러 번 부르는 동안 어떤 값을 계속 유지해야 하는 경우가 있습니다.
이럴 때는 그 변수를 static 으로 선언하면 해결됩니다.
static 으로 선언한 변수는 함수가 끝나고 나서도 사라지지 않고 값이 유지됩니다.
function foo2() {
static $count = 0;
if(isset($count)){
$count++;
}
echo $count;
}
foo2(); //=> 1
foo2(); //=> 2
foo2(); //=> 3
foo2(); //=> 4
- 클로저로 함수 내부에서 선언한 변수의 값을 얻어오기 -
function foo3($msg) {
return function () use ($msg) {
return $msg;
};
}
$foo1 = foo3("hello big world");
echo $foo1(); //=> hello big world
function foo3($msg) {
return function ($param) use ($msg) {
return $msg . $param;
};
}
$foo1 = foo3("hello big");
echo $foo1(" world"); //=> hello big world
function foo3($msg) {
$var = " big";
$msg = $msg . $var;
return function ($param) use ($msg) {
return $msg . $param;
};
}
$foo1 = foo3("hello");
echo $foo1(" world"); //=> hello big world
참고 자료 : https://pronist.tistory.com/16
'PHP' 카테고리의 다른 글
[php] 자주 쓰는 함수 정리 (시간, 파일, 문자열, 숫자) (0) | 2022.03.18 |
---|---|
[php] usort 사용법과 예시 (ft. 클로저 함수) (0) | 2022.03.17 |
[php] require / include 차이와 사용법 예시 / _once 붙이면? (0) | 2022.03.17 |
[php] namespace 란? 그 의미와 쓰는 이유는? 예시 (0) | 2022.03.17 |
php 에서 spl_autoload_register 의미 (0) | 2022.03.17 |