너의 개발은/PHP

PHP: 변수 (가변 변수, 스코프, 슈퍼 글로벌 변수)

변수

변수는 타 언어와 마찬가지로 값을 담을 수 있는 메모리 공간입니다. 객체의 경우에는 메모리의 주소가 저장되어 힙영역에 있는 값을 참조할 것입니다. 그 외에는 일반적인 스택 메모리에 저장이 되겠지요. PHP 는 동적인 언어입니다. 따라서 런타임 중에 변수의 값이 자유자재로 변경될 수 있습니다. 이는 자바스크립트나 파이썬과 비슷합니다. PHP 의 변수는 변수의 이름 앞에 $ 를 붙여서 선언할 수 있겠습니다.

$message = 'Hello, world'; // String
$userCount = 0; // Int
$pi = 3.14; // Double
$is_visited = false; // Boolean
$temp = null; // NULL

변수 사용하기

일반적으로 변수를 사용하려면 그저 $ 기호와 함께 변수의 이름을 적어주면 됩니다.

$message;

문자열 내부에서 사용하기

문자열 내부에서 변수를 사용하는 것은 일부 규칙이 있습니다. 먼저, ' 로 구성된 문자열 내부에서는 변수를 사용할 수 없고, 반드시 " 를 사용한 문자열 내부에서만 변수를 사용할 수 있습니다.

// -> The message is $message
'The message is $message';
// -> THe message is Hello, world
"The message is $message";

Here DOC & Now DOC

Here Doc, Now Doc 이라는 것은 PHP 에서 제공하는 흥미로운 기능입니다. 일반적으로 문자열을 구성할 때 사용하는 큰 따옴표와 작은 따옴표를 통해서 문자열을 표현할 수 있지만, 특수한 케이스에는 Here Doc, Now Doc 이라는 것을 사용할 수 있습니다.

 

아래의 코드에서는 시작을 나타내는 <<< 과 더불어 Here Doc 의 이름인 HTML 이 있습니다. 이는 그저 이름일 뿐이므로 임의로 정해줄 수 있습니다. 이름 부분에서 'HTML' 이 된다면 이는 Now Doc 이며, 변수가 적용되지 않습니다. 즉, Here Doc 은 큰 따옴표 같은 것이고 Now Doc 은 작은 따옴표 같은 것이죠.

<<<HTML
<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>HTML Template</title>
    </head>
    <body>
        <h1>$message</h1>
    </body>
</html>
HTML;

가변 변수

가변 변수는 변수를 선언할 때 변수의 이름을 다른 변수의 값으로 대체할 수 있는 것을 말합니다. 아래의 코드를 보면, $varName 변수의 값을 $$varName 라는 형태로 사용하여 결과적으로 $message 라는 변수가 선언 된 것을 볼 수 있습니다.

$varName = 'message';

// $message = 'Hello, world';
$$varName = 'Hello, world';

var_dump($message); // -> Hello, world

변수의 할당 해제하기

변수의 할당을 해제하는 방법은 언어구조 unset() 을 사용하면 메모리에서 변수가 릴리즈 됩니다.

unset($message);

변수의 스코프

스코프글로벌 스코프함수 스코프 이 두가지만 존재합니다. 즉, 자바스크립트 처럼 블록 스코프가 아니기 때문에 블록 내부에서 선언된 변수라고 할 지라도 블록 밖에서 접근할 수 있습니다.

if (true) {
    $variableScope = 'Hello, world';
}

// -> Hello, world
echo $variableScope;

글로벌 스코프 & 함수 스코프

최상위에 설정된 변수글로벌 스코프에 있으며 이는 함수 내부에서도 접근할 수 있고, 함수 내부에서 글로벌 스코프 변수에 값을 할당할 수도 있습니다. 함수 내부에서는 $GLOBALS 슈퍼 글로벌 변수로 글로벌 스코프에 있는 변수에 접근합니다. 그 외에 함수 내부에서 선언된 변수는 함수 스코프로 일반적으로 함수 밖에서는 이에 접근할 수 없습니다.

$message = 'Hello, world';

function foo()
{
    // global $message;
    $GLOBALS['message'] = 'Who are you?';

    // $message = 'Who are you?';
    // echo $message;
}

정적 변수로 값 유지하기

일반적으로 함수가 끝나면 함수 내부에 선언된 로컬 변수는 스택에서 릴리즈되어 더는 접근할 수 없게되지만, static 키워드로 정적 변수를 선언하면 함수가 끝나더라도 함수 내부에서 값이 유지됩니다.

function foo2()
{
    static $count = 0;
}

// $count = 0
foo2();
// $count = 1
foo2();

클로저로 함수 내부의 값을 얻어오기

함수 내부에 있는 값을 일반적으로 return 을 통해서 밖으로 내보내지만, Closure 를 사용하면 함수를 리턴함으로써 함수 내부에 선언된 변수의 값에 접근할 수 있게됩니다.

 

추가적으로 자바스크립트와 같은 언어와는 다르게 function 키워드를 통해 익명 함수를 정의할 때 외부의 변수에 접근하려면 use 키워드를 사용해야 합니다. 단 Arrow Functions 를 사용할 때는 그러지 않아도 됩니다.

function foo3($arg)
{
    return function () use ($arg) {
        return $arg;
    };
    // return fn () => $arg;
}

$func = foo3('Hello, world');

// -> Hello, world
echo $func();

외부로부터 오는 변수들 & 슈퍼 글로벌 변수

PHP 에는 슈퍼 글로벌 변수라 하여 $_SERVER, $GLOBALS, $_SESSION 와 같이 미리 정의되어 있는 글로벌 변수들과 유저로부터 받아온 데이터를 담고 있는 변수들이 있습니다. $_GET, $_POST, $_REQUEST, $_COOKIE 가 있습니다. 예를들어 다음과 같은 폼이 가정해보겠습니다.

<form action="/" method="post">
	<input type="text" name="email">
	<input type="password" name="password">
</form>

그렇다면 아래의 코드로 값을 받아올 수 있습니다. 여기서 $_POSTPOST 요청으로 날라온 값들을 담고 있고 이는 배열입니다.

[ 'email' => $email, 'password' => $password ] = $_POST

GET 요청은 $_GET,쿠키에 대한 정보는 $_COOKIE, 세션에 대한 정보는 $_SESSION, 그리고 GET 과 POST 요청을 포함한 정보들은 $_REQUEST 가 가지고 있습니다.

 

 

PHP 7+ 프로그래밍: 리부트 - 인프런

기초 문법부터 내장 함수, 웹 보안, 게시판 만들기까지 PHP 언어를 시작하는 분들을 위해 바이블이 될 수 있게 만들어보고자 하는 마음으로 이번 강좌를 만들어보았습니다. 입문 웹 개발 프로그��

www.inflearn.com

 

PHP 7+ 프로그래밍: 객체지향 - 인프런

PHP 객체지향, 내장 클래스, PSR, Composer, MVC(Model, View, Controller)까지 모던 PHP를 익히기 위한 근간을 이야기합니다. 초급 프로그래밍 언어 알고리즘 PHP 객체지향 알고리즘 온라인 강의 모던 PHP 프로��

www.inflearn.com

'너의 개발은 > PHP' 카테고리의 다른 글

PHP: 조건문 (if, switch)  (0) 2020.03.27
PHP: 연산자  (0) 2020.03.23
PHP: 상수 (매직상수)  (0) 2020.03.12
PHP: 변수 (가변 변수, 스코프, 슈퍼 글로벌 변수)  (0) 2020.03.09
PHP: 자료형  (0) 2020.03.07
PHP: 기본 문법  (0) 2020.03.06