What is PHP?
PHP는 웹 개발자들이 쉽고 빠르게 동적 웹페이지를 만들 수 있도록 해주는 서버 측에서 실행되는 서버 사이드 스크립트 언어이다.
PHP로 작성된 코드를 HTML 코드 안에 추가하면, 웹 서버는 해당 코드를 해석하여 자동으로 HTML 문서를 생성한다.
따라서 PHP를 사용하면 동적으로 빠르게 HTML 문서를 만들 수 있다.
PHP를 실행하기 위해서는 웹서버가 필요하다. 우린 이제 공부를 시작하는 입장이니 우리의 컴퓨터에 웹 서버를 설치해서 쓰도록 하자. 우리는 Apache 웹 서버와 함께 PHP와 MySQL을 설치할 것이다.
Quick Start
통합 설치 프로그램을 통해 설치를 진행하자. APM( Apache, PHP, MySQL) 중 XAMPP를 사용할 것이다.
https://www.apachefriends.org/download.html
Download XAMPP
Includes: Apache 2.4.53, MariaDB 10.4.24, PHP 7.4.29 + SQLite 2.8.17/3.38.5 + multibyte (mbstring) support, Perl 5.34.1, ProFTPD 1.3.6, phpMyAdmin 5.2.0, OpenSSL 1.1.1o, GD 2.2.5, Freetype2 2.4.8, libpng 1.6.37, gdbm 1.8.3, zlib 1.2.11, expat 2.0.1, Sablot
www.apachefriends.org
XAMPP 프로그램을 다운로드 하고 실행하자.
Windows 8 이상에서는 위와 같은 경고가 발생할 수 있다.
Program Files 디렉토리 외에 자유롭게 쓰기가 가능한 곳에 설치한다.
최소한의 설치를 위해 위와 같이 진행하도록 한다.
이후 다음을 눌러 설치를 진행시킨다.
설치가 완료되었다면 XAMPP 제어판에서 웹 서버를 시작시킨다.
브라우저를 실행 후 주소창에 localhost:80을 입력하면 아래와 같이 서버가 실행된 것을 확인할 수 있다.
컴퓨터를 리부팅하고 나면 웹 서버는 동작하지 않는 상황일 것이다. 그런 경우 C:\xampp\xampp-control.exe를 실행해 제어할 수 있다.
PHP 문법
-PHP 명령문의 마지막은 세미콜론(;)으로 끝난다.
-PHP 주석은 다음과 같이 여러 가지 스타일을 사용할 수 있다.
1. 한 줄 C언어 스타일 : //주석문
2. 여러 줄 C언어 스타일 : /*주석문*/
3. 한 줄 쉘 스타일 : #주석문
-echo() 함수는 html 스트림에 문자열을 출력해준다. 실제 함수가 아니므로, 인수를 전달할 때 괄호(())를 사용해도 되고 생략할 수도 있다.
-echo() 함수는 가변 길이 인수와 같이 함수 문맥으로도 사용할 수 없다.
-echo() 함수는 두개 이상의 인수를 전달할 때는 반드시 괄호를 사용해서는 안된다.
-PHP는 키워드, 클래스, 함수, 사용자 함수 이름의 대소문자를 구분하지 않기 때문에 ECHO나 Echo를 사용해도 같은 동작을 한다.
1) PHP 코드 영역
PHP 코드는 웹 페이지의 어느 부분에나 위치할 수 있다. 따라서 PHP 파서가 PHP 코드를 인식하기 위해서는 그 시작과 끝을 알려줄 필요가 있다.
PHP 코드 영역을 알려주는 방식에는 다음과 같이 여러 가지 스타일을 사용할 수 있다.
1. PHP 권장 스타일 : <?php ... ?>
2. HTML 스크립트 스타일 : <script language = "php"> ... </script>
3. SGML 스타일 : <? ... ?>
4. ASP 스타일 : <% ... %>
SGML 스타일과 ASP 스타일은 php.ini 설정 파일의 특정 태그를 활성화했을 경우에만 정확히 인식되기 때문에 PHP 권장 스타일을 사용하는 것을 권장한다.
2) 변수와 상수
-변수(variable)
PHP에서는 달러 ($) 기호를 사용하여 변수를 선언한다.
$변수이름 = 초깃값;
또한 변수를 선언할 때 따로 타입을 명시하지 않는다. PHP에서 변수의 타입은 해당 변수에 대입하는 값에 따라 자동으로 결정된다.
-변수의 종류
PHP에서 변수는 스크립트 내 어느 곳에서 선언할 수 있지만 변수의 유효 범위에 따라 변수의 종류를 구분한다.
1. 지역 변수 (local variable)
2. 전역 변수 (global variable)
3. 정적 변수 (static variable)
1. 지역 변수 (local variable)
함수 내부에서 선언된 변수는 오직 함수 내부에서만 접근할 수 있다. 또한 함수 내부에서 선언된 변수는 함수의 호출이 종료되면 메모리에서 제거되는데 이렇게 함수 내부에서 선언된 변수는 지역 변수 (local variable) 라고 한다.
function varFunc() {
$var = 10; // 지역 변수로 선언함
echo "함수 내부에서 호출한 지역 변수 var의 값은 {$var}입니다.<br>";
}
varFunc();
echo "함수 밖에서 호출한 지역 변수 var의 값은 {$var}입니다.";
위 예제에서는 함수 밖에서 함수 내부의 지역 변수 var를 참조하려고 하지만 함수의 호출이 종료되었으므로, 함수 내부에서 선언된 모든 지역 변수들이 메모리에서 제거되었기 때문에 아무런 값도 얻을 수 없다.
2. 전역 변수 (global variable)
함수 밖에서 선언된 변수는 함수 밖에서만 바로 접근할 수 있다.
함수 밖에서 선언된 변수를 함수 내부에서 접근하고자 할 때는 global 키워드를 함께 사용해야 한다.
함수 밖에서 선언된 변수를 전역 변수(global variable)라고 한다.
PHP는 모든 전역 변수를 $GLOBALS 배열에 저장한다. 이 배열에 인덱스로 변수의 이름을 사용하면, 해당 전역 변수의 값에 접근할 수 있다.
이 배열은 함수 내부에서도 접근할 수 있으며, 이 배열을 통해 바로 전역 변수의 값을 변경할 수도 있다.
3. 슈퍼 글로벌(superglobal)
PHP는 미리 정의된 전역 변수인 슈퍼 글로벌(superglobal)을 제공한다.
이러한 슈퍼 글로벌은 특별한 선언 없이 스크립트 내의 어디에서라도 바로 사용할 수 있다.
PHP에서 제공하는 슈퍼 글로벌은 다음과 같다.
- $GLOBALS
- $_SERER
- $_GET
- $_POST
- $_FILES
- $_COOKIE
- $_SESSION
- $_REQUEST
- $_ENV
3.정적 변수(static variable)
정적 변수(static variable)란 함수 내부에서 static 키워드로 선언한 변수를 의미한다.
함수 내부에서 선언된 정적 변수는 함수의 호출이 종료되더라도 메모리 상에서 사라지지 않는다. 하지만 지역 변수처럼 해당 함수 내부에서만 접근할 수 있다.
아래 예제에서 정적 변수인 $count는 함수의 호출이 종료된 후에도 계속해서 그 값을 유지하고 있다.
function counter() {
static $count = 0;
echo "함수 내부에서 호출한 static 변수 count의 값은 {$count}입니다.<br>";
$count++;
}
counter();
counter();
counter();
-상수(constant)
PHP에서는 define() 함수를 사용하여 상수를 선언할 수 있다.
define(상수이름, 상숫값, 대소문자구분여부)
선언된 상수는 스크립트의 어디에서라도 참조할 수 있으나 해당 상수가 선언되기 이전의 스크립트 영역에서는 해당 상수를 참조할 수 없다.
-마법 상수(magic constants)
PHP는 어떤 스크립트에서도 사용할 수 있는 미리 정의된 다양한 상수를 제공한다.
다음 예제는 PHP에서 미리 정의된 모든 상수를 출력해준다.
echo "<pre>";
print_r(get_defined_constants(true));
echo "</pre>";
PHP는 위와 같이 미리 정의된 상수 이외에도 어디에 사용하느냐에 따라 용도가 변경되는 8개의 마법 상수를 제공한다.
이러한 마법 상수는 대소문자를 구분하지 않는다.
3) 기본 타입
PHP가 제공하는 기본 타입은 다음과 같다.
-불리언(boolean)
불리언은 참(true)과 거짓(false)을 표현한다.
PHP에서 불리언은 상수인 true와 false를 사용해 나타내며,대소문자를 구분하지 않는다.
PHP에서 다음 값들을 불리언 타입으로 변환되면 모두 false로 인식된다.
- 불리언 : false
- 정수 : 0
- 실수 : 0.0
- 빈 문자열과 문자열 "0"
- 빈 배열
- NULL
-정수(integer)
PHP에서 정수의 표현 범위는 운영체제에 따라 달라지며, 64비트 운영체제 기준으로 -2⁶³~(2⁶³-1) 사이의 값을 가진다.
PHP에서 부호가 없는 정수(unsigned integer)는 지원하지 않으며, 정수는 10진수, 8진수, 16진수로도 표현할 수 있다.
-실수(float)
PHP에서 실수의 표현 범위는 운영체제에 따라 달라지지만 대략 ~1.8e307까지 표현할 수 있다.
PHP에서는 e 지수 표현과 E 지수 표현이 모두 가능하다.
변수에 실수의 최대 범위를 넘는 값이 대입되면 그 변수는 자동으로 미리 정의된 상수 INF(infinite, 무한)로 인식된다.
-문자열(string)
PHP에서 문자열 리터럴은 큰따옴표("")나 작은따옴표('')로 감싸서 표현한다.
-배열(array)
PHP에서 배열(array)은 한 쌍의 키(key)와 값(value)으로 이루어진 맵(map)으로 구성되는 순서가 있는 집합을 의미한다.
맵의 키값으로는 정수와 문자열만이 가능하며, 하나의 배열에 두 가지 키값을 같이 사용할 수 있다.
만약 정수와 문자열 이외에 다른 타입의 값을 키값으로 사용하면, 내부적으로 다음과 같이 타입 변환이 이루어진다.
-불리언은 true는 1로, false는 0으로 자동 타입 변환된다.
-유효한 숫자로만 이루어진 문자열은 정수나 실수로 자동 타입 변환된다.
-실수는 소수 부분이 제거되고, 정수로 자동 타입 변환된다.
-NULL은 빈 문자열("")로 자동 타입 변환된다.
-배열과 객체는 배열의 키값으로 사용할 수 없다.
-객체(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 상수)만을 가질 수 있는 특별한 타입으로 아직 어떠한 값도 대입되지 않은 변수를 의미한다.
-타입 변환
-자동 타입 변환(type juggling)
PHP에서는 변수를 선언할 때 타입을 명시할 필요가 없고 해당 변수에 대입하는 값에 따라 자동으로 결정된다. 이렇게 타입이 상황에 따라 자동으로 변환되는 것을 자동 타입 변환(type jugglin)이라고 한다.
$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 ...
달러($) 기호를 사용하여 변수의 이름을 유동적으로 설정하거나 사용할 수 있다.
4) 연산자
-산술 연산자(arithmetic operator)
산술 연산자는 사칙 연산을 다루는 가장 기본적이면서도 많이 사용하는 연산자로 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.
-대입 연산자(assignment operator)
대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다.
또한 PHP에서는 대입 연산자와 산술 연산자 등을 겨합한 다양한 복합 대입 연산자를 제공한다.
복합 대입 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다.
-증감 연산자(increment and decrement operator)
증감 연산자는 피연산자를 1씩 증가 혹은 감소시킬 때 사용하는 연산자이며 피연산자가 단 하나뿐인 단항 연산자이다.
-비교 연산자(comparison operator)
비교 연산자는 피연산자 사이의 상대적인 크기를 판단하여, 참(true)과 거짓(false)을 반환한다.
비교 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.
PHP에서는 다양한 타입의 값을 서로 비교해야 할 때 다음 규칙에 따라 비교한다.
-논리 연산자(logical operator)
논리 연산자는 논리식을 판단하여, 참(true)과 거짓(false)을 반환한다.
-비트 연산자(bitwise operator)
비트 연산자는 비트(bit) 단위로 논리 연산을 수행한다.
또한, 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다.
-삼항 연산자(ternary operator)
삼항 연산자는 유일하게 피연산자를 세 개 가지는 조건 연산자로 문법은 다음과 같다.
조건식 ? 반환값1 : 반환값2
조건식에 따라 결괏값이 참이면 반환값1을 반환하고 결괏값이 거짓이면 반환값2를 반환한다.
-문자열 연산자(string operator)
PHP에선 문자열 연산자(.)를 사용하여 문자열을 연결할 수 있다.
얼핏 보기에는 연산자가 아닌 것처럼 보이지만 양쪽에 위치한 두 문자열을 연결해주는 역할을 수행한다.
또한 echo() 함수에서는 쉼표 연산자(,)를 이용하여 문자열을 연결할 수 있다.
$str_01 = "PHP 수업";
$str_02 = "에 오신것을 환영합니다!";
echo "두 문자열을 합친 문자열은 '".($str_01.$str_02)."'입니다.<br>";
echo $str_01, $str_02;
-배열 합집합 연산자(array union operator)
배열 합집합 연산자(+)는 피연산자로 오는 두 배열의 합집합을 반환한다.
왼쪽 피연산자로 오는 배열의 키값은 유지하면서, 거기에 맞춰 오른쪽 피연산자로 오는 배열을 덧붙이는 방식을 취한다.
따라서 같은 키에 대한 값에는 왼쪽 피연산자로 오는 배열의 값이 저장된다.
$arr_01 = array("1st" => "PHP", "2nd" => "MySQL");
$arr_02 = array("1st" => "HTML", "2nd" => "CSS", "3rd" => "JavaScript");
$result_01 = $arr_01 + $arr_02; // [PHP, MySQL, JavaScript]
var_dump($result_01);
$result_02 = $arr_02 + $arr_01; // [HTML, CSS, JavaScript]
var_dump($result_02);
$arr_01 = array("PHP", "MySQL");
$arr_02 = array("HTML", "CSS", "JavaScript");
$result_01 = $arr_01 + $arr_02; // [PHP, MySQL, JavaScript]
var_dump($result_01);
$result_02 = $arr_02 + $arr_01; // [HTML, CSS, JavaScript]
var_dump($result_02);
-instanceof 연산자
instanceof 연산자는 다음과 같은 사항을 확인하고자 할 때 사용할 수 있다.
5) 제어문
-조건문
대부분의 프로그래밍 언어처럼 if문, else문, else if문, switch 문을 가진다.
-반복문
대부분의 프로그래밍 언어처럼 while 문, for 문을 가지며 do/while문과 foreach 문을 가진다.
- do / while 문
do / while 문은 먼저 루프를 한 번 실행한 후에 표현식을 검사한다.
즉 do / while 문은 표현식의 결과와 상관없이 무조건 한 번은 루프를 실행한다.
- foreach 문
foreach 문은 배열의 모든 요소를 손쉽게 순회할 수 있도록 해준다.
foreach (배열 as 값을저장할변수) {
실행하고자 하는 명령문;
}
6) 배열
PHP에서 배열(array)은 맵(map)으로 이루어진 순서가 있는 집합을 의미한다.
이때 배열을 구성하는 각각의 맵을 배열 요소(array element)라고 한다.
-1차원 배열
1차원 배열은 가장 기본적인 배열로 다음과 같은 문법에 따라 선언된다.
$배열이름 = array();
PHP에서는 배열 요소에 접근하기 위해 인덱스(index)를 사용한다.
배열의 각 요소를 참조하고 싶을 때는 [] 연산자를 사용한다.
$배열이름[인덱스]
PHP에서는 인덱스로 숫자뿐만 아니라 문자열을 사용할 수도 있으며 인덱스로 문자열을 사용하는 배열을 연관 배열이라고 한다.
인덱스를 이용하여 배열에 요소를 추가할 수 있다.
$arr = array(); // 배열 생성
$arr[0] = "apple"; // 배열 요소 추가
$arr[1] = "banana";
$arr[2] = "orange";
또한, 배열을 생성하면서 동시에 배열 요소를 초기화할 수 있다.
$배열이름 = array(배열요소1, 배열요소2, ...);
PHP에선 배열의 특정 인덱스에만 배열 요소를 추가할 수 있다.
$arr = array(); // 배열의 생성
$arr[10] = "banana"; // 인덱스 10에만 배열 요소를 추가함.
var_dump($arr);
var_dump($arr[0]); // NULL
var_dump(isset($arr[0])); // false
var_dump(isset($arr[10])); // true
이렇게 인덱스에 대응하는 배열 요소가 없는 부분을 배열의 홀(hole)이라고 한다.
이러한 배열의 홀(hole)을 참조하게 되면, 초기화되지 않은 변수를 참조할 때처럼 NULL을 반환한다.
루프를 이용하여 배열 요소에 쉽게 접근할 수 있다.
배열의 모든 요소의 개수를 반환하는 함수 count()를 이용할 수 있다.
-다차원 배열(multidimensional array)
다차원 배열은 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 사용한다.
대부분의 프로그래밍 언어처럼 [] 연산자를 차원에 따라 사용하여 접근할 수 있다.
#example. 2차원 배열 선언 방법
$배열이름 = array(
array(),
array(),
...
);
-연관 배열(associative array)
연관 배열은 배열의 인덱스를 정수뿐만이 아닌 다양한 타입으로 설정한 배열을 의미한다.
이러한 연관 배열을 사용하면 키값에 좀 더 명확한 의미를 부여할 수 있다.
연관 배열을 생성하는 방법은 정수를 인덱스로 하는 배열을 생성하는 방법과 같다.
$배열이름 = array();
연관 배열의 각 요소를 참조하고 싶을 때는 배열 이름과 함께 키(key)를 사용하면 된다.
연관 배열에 특정 키값으로 값을 저장하는 방법은 다음과 같다.
$배열이름["키"] = 값;
$array = array(); // 배열 생성
$array["apple"] = 1000; // 연관 배열 요소 추가
$array["banana"] = 2000;
$array["orange"] = 1500;
또한, 연관 배열을 생성하면서 동시에 배열 요소를 초기화할 수도 있다.
이때는 키와 값 사이에 '=>'를 넣어 주어 배열 요소에 저장될 키와 값을 지정할 수 있다.
이 방법을 사용하면 초기화 리스트에 따라 각각의 배열 요소가 순서대로 추가된 배열이 생성된다.
$배열이름 = array("키1" => 값1, "키2" => 값2, ...);
7) 함수
PHP에서 함수는 function 키워드로 선언되며, 구조는 다음과 같다.
function 함수이름(매개변수1, 매개변수2,...)
{
함수가 호출 되었을 때 실행될 코드;
}
매개변수 타입과 리턴 타입을 지정할 수도 있다.
리턴 타입은 함수 이름 끝에 :타입
<?php
function add(int $a, int $b ): int // int 형으로 반환한다.
{
return $a + $b;
}
add(1, 2); // 함수 사용.
?>
매개변수에 기본값을 지정하는 것도 가능하다.
<?php
function add($a = 'bar' )
{
return $a;
}
add('foo'); // foo 반환
add(); // bar 반환
?>
매개변수 앞에 &을 붙이면 참조를 통해 값을 전달할 수 있다.
...을 사용해 여러 인자를 받을 수 있다.
<?php
function add(...$a)
{
return $a[0] + $a[1];
}
add(1, 2); // 함수 사용. 3을 반환한다.
?>
PHP에서는 변수에 함수도 대입할 수 있다.
$test = function myName()
{
return '홍길동';
}
$test(); // myName() 함수 사용
함수를 다른 변수에 대입해서 쓰거나 클로저에 사용할 땐 익명함수(이름이 없는 함수)를 사용한다.
<?php
$add = function (int $a, int $b ): int // $add 라는 변수에 대입
{
return $a + $b;
};
$add(1, 2);
?>
대부분의 프로그래밍 언어에서 람다식이라고도 하는 익명함수를 편하게 사용하기 위해 화살표 함수를 사용할 수도 있다.
$add = fn($x, $y) => $x + $y; // 익명함수를 $add 라는 변수에 할당하고 있다.
$add(1,2); // 리턴 값 3, 변수에 할당 했으므로 실행할때도 변수를 통해 호출한다.
(fn($x, $y)=>$x +$y)(1,2) // 즉시 실행함수로 선언 한 예시
//----------- 아래는 클로저를 이용한 예시이다.
$y = 1;
$add = fn($x) => $x + $y; // 선언
$add(2); //리턴 값 3
// 실행 클로저는 클로저가 선언된 바깥의 변수를 참조 할 수 있어서
//변수 y의 1과 매개변수 x의 2로 1+2 가 되었다.
//위 코드와 같은 코드를 기존문법으로 적으면
$y = 1;
$add = function($x) use ($y) //PHP 에서 클로저는 use 키워드를 사용했다.
{
return $x + $y;
}
$add(2); //리턴 값 3
fn 키워드는 function의 줄여쓰기이다.
함수를 정의함과 동시에 바로 실행되는 즉시실행 함수를 사용할 수 있다.
<?php
(function (int $a, int $b ): int
{
return $a + $b;
})(1,2); // 바로 실행됨
?>
8) 클래스
객체란 실생활에서 우리가 인식할 수 있는 사물로 이해할 수 있다.
이러한 객체의 상태(state)와 행동(behavior)은 각각 프로퍼티(property)와 메소드(method)로 구현된다.
또한, 객체(object)를 만들어 내기 위한 틀이나 설계도와 같은 개념이 바로 클래스(class)이다.
PHP에서 클래스는 class 키워드를 사용하여 다음과 같이 선언한다.
class 클래스이름
{
클래스의 프로퍼티과 메소드의 정의;
}
클래스의 이름을 생성할 때는 반드시 다음 규칙을 지켜야만 한다.
클래스는 클래스만의 상수와 변수를 가질 수 있으며, 이것을 프로퍼티(property)라고 한다.
또한 메서드(method)라고 불리는 연산을 정의할 수도 있다.
클래스는 새로운 객체를 생성할 때마다 생성자(constrictor)라는 메서드를 호출한다.
생성자는 객체가 생성될 때마다 호출되어 해당 객체의 프로퍼티를 초기화하거나, 필요한 다른 객체를 생성하는 등의 초기화 작업을 수행한다.
생성자는 다른 메소드와 같은 방식으로 선언되며, 매개변수를 가질 수도 있다.
PHP에서 생성자의 이름은 __construct()로 정해져 있다.
이러한 생성자는 객체가 생성될 때마다 자동으로 호출되므로, 사용자가 직접 호출할 필요가 없다.
class 클래스이름
{
function __construct(매개변수1, 매개변수2, ...)
{
생성자가 호출될 때 실행될 코드;
}
}
소멸자(destructor)는 생성자와는 반대로 해당 객체를 더는 사용하지 않아 삭제할 때 호출한다.
PHP에서 소멸자의 이름은 __desturct()로 정해져 있으며, 매개변수를 가질 수 없다.
class 클래스이름
{
function __desturct()
{
소멸자가 호출될 때 실행될 코드;
}
}
클래스가 선언되고 나면, 선언된 클래스로부터 인스턴스를 생성할 수 있다.
PHP에서는 new 키워드를 사용하여 인스턴스를 생성할 수 있다.
이때 클래스 이름을 통해 생성자로 필요한 인수를 전달 할 수 있다.
$객체이름 = new 클래스이름(인수1, 인수2, ...);
클래스의 프로퍼티에 접근하거나 메소드를 호출할 때는 화살표 기호(->)를 사용한다.
객체의 이름 뒤에 화살표 기호(->)를 붙이고, 접근하려고 하는 프로퍼티나 호출하고자 하는 메소드의 이름을 사용하면 된다.
$객체이름->프로퍼티이름;
$객체이름->메소드이름;
PHP에서는 프로퍼티와 메소드의 접근 범위를 제한할 수 있으므로, 클래스 외부에서는 접근 제어자에 따라 접근이 가능할 수도 있고 또는 불가능할 수도 있다.
또한, 객체 내부에서 해당 인스턴스의 프로퍼티에 접근하고 싶을 때는 특별한 변수인 $this를 사용할 수 있다.
$this 변수는 해당 인스턴스가 바로 자기 자신을 가리키는 데 사용하는 변수이다.
$this->프로퍼티이름;
객체 지향 프로그래밍에서 정보 은닉이란 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념이다.
그렇게 함으로써 사용자는 언제나 최소한의 정보만으로 프로그램을 손쉽게 사용할 수 있게 된다.
PHP에서는 클래스 멤버에 public, private, protected 키워드를 사용하여 각각의 멤버에 대한 접근 제어를 명시할 수 있다.
public으로 선언된 멤버는 외부로 공개되며, 해당 객체를 사용하는 어디에서나 직접 접근할 수 있게 된다.
private로 선언된 멤버는 외부로 공개되지 않으며, 해당 클래스의 멤버에서만 접근할 수 있다.
protected로 선언된 멤버는 상위 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private 멤버처럼 취급된다.
var 키워드를 사용하여 클래스의 프로퍼티를 정의하면, 해당 프로퍼티의 접근 제어는 public으로 자동 정의된다.
또한, 메소드를 작성할 때 접근 제어자를 생략하면 public으로 자동 정의된다.
class ClassName
{
public $publicVar;
private $privateVar;
protected $protectedVar;
public function __constructor()
{
$this->publicVar = "public property<br>";
$this->privateVar = "private property<br>";
$this->protectedVar = "protected property<br>";
}
public function publicMethod()
{
echo "public method<br>";
}
protected function protectedMethod()
{
echo "protected method<br>";
}
private function privateMethod()
{
echo "private method<br>";
}
}
$object = new ClassName();
echo $object->publicVar; // 접근 가능
//echo $object->protectedVar; // 접근 불가능
//echo $object->privatev; // 접근 불가능
$object->publicMethod(); // 호출 가능
//$object->protectedMethod(); // 호출 불가능
//$object->privateMethod(); // 호출 불가능
class ClassName
{
private $privateVar;
public function __constructor()
{
$this->privateVar = "private property";
}
public function getValue()
{
return $this->privateVar;
}
public function setValue($value)
{
$this->privateVar = $value;
}
}
$object = new ClassName();
$object->setValue("hello"); // setValue() 함수를 통해 $private의 값을 변경할 수 있음.
echo $object->getValue; // getValue() 함수를 통해 $private의 값을 출력할 수 있음.
위 예제는 클래스의 외부에서 public 메소드인 getValue()와 setValue() 메소드를 사용하여 해당 클래스의 private 멤버에 접근할 수 있음을 보여주고 있다.
9) OOP (Object-Oriented Programming)
-상속
상속이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 만드는 것을 의미한다.
이러한 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나이다.
상속을 이용하면 기존에 정의되어 있는 클래스의 모든 프로퍼티와 메소드를 물려받아, 새로운 클래스를 생성한다.
이때 기존에 미리 정의되어 있던 클래스를 부모 클래스, 상위 클래스라고 하며 상속을 통해 새롭게 작성되는클래스를 자식 클래스, 하위 클래스라고 한다.
PHP에서는 상속을 통해 클래스 간의 계층 관계를 만들 수 있다.
자식 클래스는 부모 클래스의 모든 public, protected 멤버를 상속받게 된다.
PHP에서는 extend 키워드를 사용하여 상속을 정의한다
다음 예제는 A 클래스를 상속받는 B 클래스를 정의하는 예제이다.
class B extends A
{
B 클래스만의 프로퍼티와 메소드;
}
위의예제에서 B 클래스는 A 클래스의 자식 클래스가 되고, A 클래스는 B 클래스의 부모 클래스가 된다.
B 클래스는 A 클래스의 private 멤버를 제외한 모든 프로퍼티와 메소드를 상속받아 사용할 수 있다.
여기에 필요하다면 자신만의 프로퍼티와 메소드를 추가할 수 있다.
-오버라이딩
오버라이딩이란 이미 정의된 메소드를 같은 이름의 메소드로 다시 정의하는 것이다.
즉, 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미한다.
PHP에서는 부모 클래스의 메소드와 이름만 작성하면, 해당 메소드를 오버라이딩할 수 있다.
class A
{
public $property = "class A";
public function showProperty()
{
echo $this->property."<br>";
}
}
class B extends A // 클래스 A를 상속 받음.
{
public $property = "class B";
public function showProperty() // 클래스 A의 메소드를 오버라이딩
{
echo "hello ".$this->property."<br>";
}
}
$a = new A();
$a->showProperty(); // 클래스 A의 메소드 호출
$b = new B();
$b->showProperty(); // 클래스 B의 메소드 호출