본문 바로가기
PHP

PHP 기초

by FraisGout 2020. 7. 2.

변수(variable)

변수(variable)란 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간입니다.

 

, 변수란 데이터(data)를 저장할 수 있는 메모리 공간이며, 저장된 값은 변경될 수 있습니다.

 

변수의 선언

PHP에서는 달러($) 기호를 사용하여 다음과 같이 변수를 선언합니다.

 

문법

$변수이름 = 초깃값;

 

 

 

PHP에서 변수를 선언할 때는 변수의 이름 앞에 달러($) 기호를 사용하여 선언합니다.

 

 

 

또한, C언어와는 달리 변수를 선언할 때 따로 타입을 명시하지 않습니다.

 

PHP에서 변수의 타입은 해당 변수에 대입하는 값에 따라 자동으로 결정되기 때문입니다.

 

)

$var = 10; // 정수값을 대입함

 

$var = 3.14; // 실수값을 대입함

 

$var = "PHP"; // 문자열을 대입함

 

위의 예제에서 변수 $var는 처음에는 정수형 변수였다가, 나중에는 실수형 변수, 마지막에는 문자열 변수로 바뀝니다.

 

이처럼 PHP에서는 변수에 대입되는 값에 따라 자동으로 타입 변환이 일어납니다.

 

gettype() 함수는 인수로 전달받은 데이터의 타입을 출력하는 함수입니다.

 

변수 이름의 생성 규칙

변수의 이름은 그 변수가 가지는 데이터의 의미를 잘 나타내도록 작성하는 것이 좋습니다.

 

PHP에서는 이러한 변수의 이름을 작성할 때 반드시 지켜야 하는 다음과 같은 규칙이 있습니다.

 

 

 

1. 변수의 이름은 영문 대소문자, 숫자, 언더스코어(_)로만 구성됩니다.

 

2. 변수의 이름은 숫자와의 구분을 빠르게 하기 위해 숫자로는 시작할 수 없습니다.

 

3. 변수의 이름에는 공백이 포함될 수 없습니다.

 

4. 변수의 이름으로 PHP에서 미리 정의한 $this는 사용할 수 없습니다.

 

5. 변수의 이름은 대소문자를 구분합니다.

 

PHP에서 변수는 이름을 가지고 식별하므로, 변수의 이름은 식별자(identifier)입니다.

 

식별자(identifier)란 변수나 함수, 클래스의 이름과 같이 해당 요소를 식별할 때 사용하는 이름을 가리킵니다.

 

이렇게 작성한 변수의 이름을 문자열 내에서 사용하면, PHP는 해당 변수에 저장된 값으로 자동 변환해 줍니다.

 

하지만 이때 변수의 이름 뒤에 다른 문자가 오게 되면, 변수의 이름을 정확히 인식하지 못합니다.

 

따라서 문자열 내에 변수의 이름을 사용할 때는 중괄호({})로 변수의 이름을 감싸서, 어디까지가 변수의 이름인지를 명확히 명시해야 합니다.

 

)

$var = 10;

 

 

 

echo "$var"; // 10

 

echo "{$var}"; // 10

 

 

 

echo "변수 \$var에 저장된 값은 $var입니다."; // 변수 $var에 저장된 값은 .

 

echo "변수 \$var에 저장된 값은 {$var}입니다."; // 변수 $var에 저장된 값은 10입니다.

 

위 예제의 번과 번 라인과 같이 변수의 이름 뒤에 아무런 문자도 나오지 않으면 크게 상관이 없습니다.

 

하지만 번 라인과 같이 변수의 이름 뒤에 다른 문자가 나오게 되면, PHP 파서는 "$var"라는 변수의 이름을 찾는 대신에 "$var입니다"라는 이름을 가진 변수를 찾습니다.

 

따라서 번 라인과 같이 변수의 이름을 중괄호로 감싸야만 PHP 파서가 변수의 이름을 정확히 인식할 수 있습니다.

 

변수의 초기화

PHP에서는 반드시 변수의 선언과 동시에 그 값을 초기화할 필요가 없습니다.

 

초기화되지 않은 변수는 해당 변수가 참조되거나 사용되는 위치에 따라 다음과 같은 기본값으로 자동 초기화됩니다.

 

)

// 선언되지 않은 변수의 기본값

 

var_dump($var); // NULL

 

 

 

// 초기화되지 않은 불리언(boolean) 타입 변수의 기본값

 

echo $bool ? "true<br>" : "false<br>"; // false

 

 

 

// 초기화되지 않은 정수(integer) 타입 변수의 기본값

 

$int += 10; var_dump($int); // 0 + 10 = 10

 

 

 

// 초기화되지 않은 실수(float) 타입 변수의 기본값

 

$flt += 3.14; var_dump($flt); // 0.0 + 3.14 = 3.14

 

 

 

// 초기화되지 않은 문자열(string) 타입 변수의 기본값

 

$str .= "프로그래밍"; var_dump($str); // ""."프로그래밍" = "프로그래밍"

 

 

 

// 초기화되지 않은 배열(array) 타입 변수의 기본값

 

$arr[2] = "2번째 배열 요소"; var_dump($arr); // array(1) { [2]=> string(21) "2번째 배열 요소" }

위의 예제처럼 PHP에서는 변수를 초기화할 필요가 없지만, 될 수 있으면 사용하기 전에 초기화하는 것이 좋습니다.

 

변수의 종류

PHP에서 변수는 스크립트 내 어느 곳에서나 선언할 수 있습니다.

 

변수의 유효 범위(variable scope)란 특정 변수를 참조되거나 사용할 수 있는 스크립트 내의 범위를 의미합니다.

 

PHP에서는 이러한 변수의 유효 범위에 따라 변수의 종류를 다음과 같이 구분합니다.

 

 

 

1. 지역 변수(local variable)

 

2. 전역 변수(global variable)

 

3. 정적 변수(static variable)

 

지역 변수(local variable)

함수 내부에서 선언된 변수는 오직 함수 내부에서만 접근할 수 있습니다.

 

또한, 함수 내부에서 선언된 변수는 함수의 호출이 종료되면 메모리에서 제거됩니다.

 

 

 

이렇게 함수 내부에서 선언된 변수를 지역 변수(local variable)라고 합니다.

 

)

function varFunc() {

$var = 10; // 지역 변수로 선언함

echo "함수 내부에서 호출한 지역 변수 var의 값은 {$var}입니다.<br>";

}

varFunc();

echo "함수 밖에서 호출한 지역 변수 var의 값은 {$var}입니다.";

위의 예제에서는 함수 밖에서 함수 내부의 지역 변수 var를 참조하려고 합니다.

 

하지만 함수의 호출이 종료되었으므로, 함수 내부에서 선언된 모든 지역 변수들은 메모리에서 이미 제거되었습니다.

 

따라서 함수 밖에서 지역 변수를 참조하려고 하면 아무런 값도 얻을 수 없습니다.

 

전역 변수(global variable)

함수 밖에서 선언된 변수는 함수 밖에서만 바로 접근할 수 있습니다.

 

함수 밖에서 선언된 변수를 함수 내부에서 접근하고자 할 때는 global 키워드를 함께 사용해야 합니다.

 

 

 

이렇게 함수 밖에서 선언된 변수를 전역 변수(global variable)라고 합니다.

 

)

$var = 10; // 전역 변수로 선언함

function varFunc() {

echo "함수 내부에서 호출한 전역 변수 var의 값은 {$var}입니다.<br>";

global $var; // 함수 내에서 사용할 전역 변수를 명시함

echo "함수 내부에서 호출한 전역 변수 var의 값은 {$var}입니다.<br>";

}

varFunc();

echo "함수 밖에서 호출한 전역 변수 var의 값은 {$var}입니다.";

위의 예제에서 맨 처음 호출한 echo 함수는 아무런 값도 출력하지 못합니다.

 

하지만 사용할 전역 변수를 global 키워드로 명시하고 나서 다시 호출한 echo 함수는 정확한 전역 변수의 값을 출력합니다.

 

 

 

PHP는 모든 전역 변수를 $GLOBALS 배열에 저장합니다.

 

이 배열에 인덱스로 변수의 이름을 사용하면, 해당 전역 변수의 값에 접근할 수 있습니다.

 

이 배열은 함수 내부에서도 접근할 수 있으며, 이 배열을 통해 바로 전역 변수의 값을 변경할 수도 있습니다.

 

)

$var = 10; // 전역 변수로 선언함

function varFunc() {

echo "함수 내부에서 호출한 전역 변수 var의 값은 {$var}입니다.<br>";

echo "함수 내부에서 호출한 전역 변수 var의 값은 {$GLOBALS['var']}입니다.<br>";

}

varFunc();

echo "함수 밖에서 호출한 전역 변수 var의 값은 {$var}입니다.";

 

위의 예제는 함수 내부에서 global 키워드를 사용하는 대신에 $GLOBALS 배열을 사용하여 전역 변수에 접근하고 있습니다.

 

슈퍼 글로벌(superglobal)

PHP는 미리 정의된 전역 변수인 슈퍼 글로벌(superglobal)을 제공합니다.

 

이러한 슈퍼 글로벌은 특별한 선언 없이 스크립트 내의 어디에서라도 바로 사용할 수 있습니다.

 

 

 

PHP에서 제공하는 슈퍼 글로벌은 다음과 같습니다.

 

 

 

1. $GLOBALS

2. $_SERVER

3. $_GET

4. $_POST

5. $_FILES

6. $_COOKIE

7. $_SESSION

8. $_REQUEST

9. $_ENV

 

정적 변수(static variable)

정적 변수(static variable)란 함수 내부에서 static 키워드로 선언한 변수를 의미합니다.

 

 

 

함수 내부에서 선언된 정적 변수는 함수의 호출이 종료되더라도 메모리상에서 사라지지 않습니다.

 

하지만 지역 변수처럼 해당 함수 내부에서만 접근할 수 있습니다.

 

)

function counter() {

static $count = 0;

echo "함수 내부에서 호출한 static 변수 count의 값은 {$count}입니다.<br>";

$count++;

}

counter();

counter();

counter();

위의 예제에서 정적 변수인 $count는 함수의 호출이 종료된 후에도 계속해서 그 값을 유지하고 있습니다.

 

상수(constant)

상수(constant)란 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미합니다.

 

하지만 상수가 변수와 다른 점은 한 번 선언되면, 스크립트가 실행되는 동안 그 데이터를 변경하거나 해제(undefined)할 수 없다는 점입니다.

 

define() 함수

PHP에서는 define() 함수를 사용하여 상수를 선언할 수 있습니다.

 

 

 

define() 함수의 원형은 다음과 같습니다.

 

원형

define(상수이름, 상숫값, 대소문자구분여부)

 

 

 

이 함수는 첫 번째 인수로 상수의 이름을 전달받고, 두 번째 인수로 그 값을 전달받습니다.

 

세 번째 인수는 상수의 이름이 대소문자를 구분하는가를 설정하며, 기본값은 false로 대소문자를 구분합니다.

 

 

 

)

define("PHP", "PHP 수업에 잘 오셨습니다!<br>"); // 대소문자를 구분함.(기본 설정)

echo PHP; // PHP 수업에 잘 오셨습니다!

 

echo php; // php

define("PHP", "<br>PHP 수업에 잘 오셨습니다!", true); // 대소문자를 구분하지 않음.

echo php; // PHP 수업에 잘 오셨습니다!

 

echo Php; // PHP 수업에 잘 오셨습니다!

 

이렇게 선언된 상수는 스크립트의 어디에서라도 참조할 수 있습니다.

 

, 해당 상수가 선언되기 이전의 스크립트 영역에서는 해당 상수를 참조할 수 없습니다.

 

)

function defFunc()

 

{

 

echo PHP; // PHP

define("PHP", "PHP 수업에 잘 오셨습니다!");

 

echo PHP; // PHP 수업에 잘 오셨습니다!

}

 

defFunc();

echo PHP; // PHP 수업에 잘 오셨습니다!

 

위의 예제에서 상수가 선언되기 전의 영역에서 호출한 echo() 함수는 해당 상수의 값을 참조하지 못합니다.

 

또한, 함수 내부에서 선언된 상수가 함수의 호출이 종료된 후에도 사용할 수 있음을 보여줍니다.

 

마법 상수(magic constants)

PHP는 어떤 스크립트에서도 사용할 수 있는 미리 정의된 다양한 상수를 제공합니다.

 

 

 

다음 예제는 PHP에서 미리 정의된 모든 상수를 출력해 주는 예제입니다.

 

)

echo "<pre>";

print_r(get_defined_constants(true));

echo "</pre>";

 

PHP는 위와 같이 미리 정의된 상수 이외에도 어디에 사용하느냐에 따라 용도가 변경되는 8개의 마법 상수를 제공합니다.

 

이러한 마법 상수(magic constants)는 대소문자를 구분하지 않습니다.

 

)

function magicCons() {

echo __LINE__; // 파일의 현재 줄 번호를 반환함.

echo __FUNCTION__; // 함수의 이름을 반환함.

echo __METHOD__; // 클래스의 메소드 이름을 반환함.

}

magicCons();

 

기본 타입

타입(data type)이란 프로그램에서 다룰 수 있는 값의 종류를 의미합니다.

 

PHP에서는 여러 가지 형태의 타입을 미리 정의하여 제공하고 있으며, 이것을 기본 타입이라고 합니다.

 

 

 

PHP가 제공하는 기본 타입은 다음과 같습니다.

 

 

 

1. 불리언(boolean)

 

2. 정수(integer)

 

3. 실수(float)

 

4. 문자열(string)

 

5. 배열(array)

 

6. 객체(object)

 

7. 리소스(resource)

 

8. NULL

 

불리언(boolean)

불리언은 참(true)과 거짓(false)을 표현합니다.

 

PHP에서 불리언은 상수인 truefalse를 사용해 나타내며, 대소문자를 구분하지는 않습니다.

 

 

 

PHP에서 다음 값들은 불리언 타입으로 변환되면, 모두 false로 인식됩니다.

 

 

 

- 불리언 : false

 

- 정수 : 0

 

- 실수 : 0.0

 

- 빈 문자열과 문자열 "0"

 

- 빈 배열

 

- NULL

 

 

 

따라서 위의 값들 이외의 모든 값(음수도 포함)true로 인식됩니다.

 

 

 

)

var_dump((bool) false); // false

 

var_dump((bool) "false"); // true

var_dump((bool) 0); // false

var_dump((bool) -100); // true

var_dump((bool) 0.0); // false

var_dump((bool) ""); // false

var_dump((bool) "0"); // false

var_dump((bool) array()); // false

var_dump((bool) null); // false

 

위의 예제에서 보면 상수 false와 문자열 "false"는 전혀 다른 의미로 해석되는 것을 확인할 수 있습니다.

 

문자열 "false"는 빈 문자열이나 문자열 "0"이 아니므로, true로 인식됩니다.

 

var_dump() 함수는 인수로 전달받은 변수의 타입과 값을 구조화된 정보로 보여주는 함수입니다.

 

정수(integer)

정수(integer)는 부호를 가지는 소수부가 없는 수를 의미합니다.

 

PHP에서 정수의 표현 범위는 운영체제에 따라 달라지며, 64비트 운영체제를 기준으로 -263 ~ (263 - 1) 사이의 값을 가집니다.

 

 

 

PHP에서는 부호가 없는 정수(unsigned integer)는 지원하지 않습니다.

 

또한, 정수는 10진수, 8진수(0으로 시작), 16진수(0x로 시작)로도 표현할 수 있습니다.

 

)

echo "integer 타입의 크기는 ".PHP_INT_SIZE."바이트 입니다.<br>";

echo "integer 타입이 표현할 수 있는 가장 큰 수는 ".PHP_INT_MAX." 입니다.<br>";

$int_01 = 100;

$int_02 = 2147483647; // integer가 표현할 수 있는 범위를 넘지 않는 값을 대입함.

$int_03 = 2147483648; // integer가 표현할 수 있는 범위를 넘는 값을 대입함.

 

위의 예제에서 상수 PHP_INT_SIZE는 정수 타입의 크기를 나타냅니다.

 

따라서 상수 PHP_INT_MAX의 값은 정수 타입이 표현할 수 있는 가장 큰 수를 가리킵니다.

 

PHP에서는 변수에 정수의 최대 범위를 넘는 값이 대입되면, 그 변수는 자동으로 실수형(float)으로 인식됩니다.

 

실수(float)

실수는 소수부나 지수부를 가지는 수를 의미하며, 정수보다 더 넓은 표현 범위를 가집니다.

 

PHP에서 실수의 표현 범위는 운영체제에 따라 달라지지만 대략 ~1.8e307까지 표현할 수 있습니다.

 

 

 

하지만 컴퓨터에서 실수를 표현하는 방식은 반드시 오차가 존재하는 한계를 지니므로, 실수형끼리 직접 값을 비교하는 것은 피하는 것이 좋습니다.

 

)

$float_01 = 3.14;

$float_02 = 1.23e-4;

$float_03 = 1.8E307; // float이 표현할 수 있는 범위를 넘지 않는 값을 대입함.

$float_04 = 1.8E308; // float이 표현할 수 있는 범위를 넘는 값을 대입함.

 

위의 예제처럼 PHP에서는 e 지수 표현과 E 지수 표현이 모두 가능합니다.

 

또한, 변수에 실수의 최대 범위를 넘는 값이 대입되면, 그 변수는 자동으로 미리 정의된 상수인 INF로 인식됩니다.

미리 정의된 상수인 INF는 무한(infinite)이라는 값을 의미합니다.

 

문자열(string)

문자열(string)은 일련의 연속된 문자(character)들의 집합을 의미합니다.

 

PHP에서 문자열 리터럴은 큰따옴표("")나 작은따옴표('')로 감싸서 표현합니다.

 

 

 

오랫동안 사용되어 온 아스키(ASCII) 인코딩 환경에서 영문자는 한 글자당 1바이트, 한글은 한 글자당 2바이트로 표현됩니다.

 

하지만 UTF-8 인코딩 환경에서는 영문자는 한 글자당 1바이트, 한글은 한 문자당 3바이트로 표현됩니다.

 

)

$str_01 = "PHP";

 

$str_02 = "자바스크립트";

 

 

 

echo strlen($str_01); // 3

 

echo strlen($str_02); // 18

strlen() 함수는 인수로 전달받은 문자열의 길이를 반환하는 함수입니다.

 

배열(array)

PHP에서 배열(array)은 한 쌍의 키(key)와 값(value)으로 이루어진 맵(map)으로 구성되는 순서가 있는 집합을 의미합니다.

 

 

 

맵의 키값으로는 정수와 문자열만이 가능하며, 하나의 배열에 두 가지 키값을 같이 사용할 수 있습니다.

 

만약 정수와 문자열 이외에 다른 타입의 값을 키값으로 사용하면, 내부적으로 다음과 같이 타입 변환이 이루어집니다.

 

 

 

- 불리언은 true1, false0으로 자동 타입 변환됩니다.

 

- 유효한 숫자로만 이루어진 문자열은 정수나 실수로 자동 타입 변환됩니다.

 

- 실수는 소수 부분이 제거되고, 정수로 자동 타입 변환됩니다.

 

- NULL은 빈 문자열("")로 자동 타입 변환됩니다.

 

- 배열과 객체는 배열의 키값으로 사용할 수 없습니다.

 

)

$arr = array(

1 => "첫 번째 값", // PHP의 배열에서 키값의 1"1"은 같은 값을 나타냄.

"1" => "두 번째 값", // 같은 키값을 사용하여 두 번 선언했기 때문에 나중에 선언된 "두 번째 값"만 남게됨.

10 => "세 번째 값",

-10 => "네 번째 값"

);

var_dump($arr);

echo $arr[1];

echo $arr["1"];

echo $arr[10];

echo $arr[-10];

 

위의 예제에서 첫 번째 배열 요소의 키값인 1과 두 번째 배열 요소의 키값인 "1"은 같은 값으로 저장됩니다.

 

PHP에서는 같은 키값으로 여러 번 맵(map)을 선언할 경우, 그 키에 해당하는 값을 계속 덮어써서 맨 마지막에 선언된 값만을 저장하게 됩니다.

 

객체(object)

객체(object)는 클래스의 인스턴스(instance)를 저장하기 위한 타입입니다.

 

이러한 객체는 프로퍼티(properties)과 메소드(methods)를 포함할 수 있습니다.

 

)

class Lecture {

function Lecture() {

$this->lec_01 = "PHP";

$this->lec_02 = "MySQL";

}

}

$var = new Lecture; // 객체 생성

echo $var->lec_01; // 객체의 속성 접근

echo "<br>";

echo $var->lec_02;

 

리소스(resource)PHP 외부에 존재하는 외부 자원을 의미합니다.

 

이러한 리소스는 데이터베이스 함수 등에서 데이터베이스 연결 등을 반환할 때 사용됩니다.

 

NULL

NULL은 오직 한 가지 값(NULL 상수)만을 가질 수 있는 특별한 타입입니다.

 

NULL 타입의 변수란 아직 어떠한 값도 대입되지 않은 변수를 의미합니다.

 

)

$var_01;

var_dump($var_01); // 초기화되지 않은 변수를 참조

 

 

$var_01 = 100; // $var_01 변수를 초기화함.

var_dump($var_01);

 

 

unset($var_02); // $var_01 변수를 삭제함.

var_dump($var_02); // 삭제된 변수를 참조

 

위의 예제처럼 PHP에서 초기화하지 않은 변수는 NULL로 자동 초기화됩니다.

 

또한, 삭제되거나 존재하지 않는 변수를 참조할 경우에도 NULL을 반환합니다.

unset() 함수는 인수로 전달받은 변수를 메모리에서 삭제하는 함수입니다.

 

자동 타입 변환(type juggling)

PHP에서는 변수를 선언할 때 타입을 명시할 필요가 없습니다.

 

왜냐하면, PHP에서 변수의 타입은 해당 변수에 대입하는 값에 따라 자동으로 결정되기 때문입니다.

 

이렇게 타입이 상황에 따라 자동으로 변환되는 것을 자동 타입 변환(type juggling)이라고 합니다.

 

 

 

따라서 PHP의 타입 강도(type strength)는 매우 약하며, 타입이 동적으로 결정됩니다.

 

)

$var = "문자열"; // string

 

$var = 10; // int

 

$var = 3.14; // float

 

강제 타입 변환(type casting)

PHP에서는 변수에 값을 대입할 때마다 변수의 타입이 그것에 맞게 변하게 됩니다.

 

하지만 사용자가 직접 데이터의 타입을 변환해야 할 경우도 많습니다.

 

 

 

PHP에서는 이러한 강제 타입 변환을 타입 캐스트 연산자인 괄호(())를 사용하여 수행할 수 있습니다.

 

변환시키고자 하는 데이터나 변수의 앞에 괄호를 붙이고, 그 괄호 안에 변환할 타입을 적으면 됩니다.

 

)

$var_01 = 10;

 

var_dump($var_01); // int(10)

 

$var_02 = (boolean) $var_01;

 

var_dump($var_02); // bool(true)

 

 

 

$var_03 = 0;

 

var_dump($var_03); // int(0)

 

$var_04 = (boolean) $var_03;

 

var_dump($var_04); // bool(false)

 

가변 변수(variable variables)

PHP에서는 변수의 타입뿐만 아니라 변수의 이름까지 동적으로 바꿀 수 있습니다.

 

이러한 변수를 가변 변수(variable variables)라고 하며, 해당 변수의 값을 또 다른 변수의 이름으로 취급합니다.

 

)

$PHP = "HTML";

 

$HTML = "CSS";

 

$CSS = "JavaScript";

 

$JavaScript = "Ajax";

 

$Ajax = "PHP";

 

 

 

echo $PHP; // HTML

 

echo $$PHP; // $HTML -> CSS

 

echo $$$PHP; // $$HTML -> $CSS -> JavaScript

 

echo $$$$PHP; // $$$HTML -> $$CSS -> $JavaScript -> Ajax

 

echo $$$$$PHP; // $$$$HTML -> $$$CSS -> $$JavaScript -> $Ajax -> PHP

 

echo $$$$$$PHP; // $$$$$HTML -> $$$$CSS -> $$$JavaScript -> $$Ajax -> $PHP -> HTML

 

echo $$$$$$$PHP; // $$$$$$HTML -> $$$$$CSS -> $$$$JavaScript -> $$$Ajax -> $$PHP -> $HTML -> CSS ...

위의 예제에서 알 수 있듯이 PHP에서는 달러($) 기호를 사용하여 변수의 이름을 유동적으로 설정하거나 사용할 수 있습니다.

 

 

'PHP' 카테고리의 다른 글

PHP function  (0) 2020.07.02
PHP array  (0) 2020.07.02
PHP expressions  (0) 2020.07.02
PHP operator  (0) 2020.07.02
PHP 기본  (0) 2020.07.02

댓글