Hypertext Preprocessor

  • 주로 HTML 코드를 프로그래밍적으로 생성

  • 웹 시스템인 클라이언트 / 서버 환경에서 동작하는 서버 사이드 스크립트 언어

  • 장점

    • 가장 많은 공개 소프트웨어가 PHP로 만들어짐
    • 앱에 최적화된 언어
    • 웹 개발에 필요한 수많은 로직들이 함수의 형태로 미리 제공
    • 크로스플랫폼
    • 거의 모든 데이터베이스 지원
    • 크로스플랫폼: 컴퓨터 프로그램, 운영 체제, 컴퓨터 언어, 프로그래밍 언어, 컴퓨터 소프트웨어 등이 여러 종류의 컴퓨터 플랫폼에서 동작
  • 단점

    • 인자 등 일관성이 없어 예측 가능성이 떨어짐
    • 웹 외 용도로 사용되기 어려움
언어운영체제웹 서버제조사속도이식성
PHP리눅스, 윈도우Apache 등오픈 소스빠름보통
JSP리눅스, 윈도우Tomcat,Jeus 등Oracle느림좋음
ASP.NET윈도우IISMicrosoft보통나쁨

작동 원리

  1. 클라이언트가 웹 브라우저를 통해 웹 서버에 원하는 웹 페이지를 요청
  2. 웹 서버는 클라이언트가 요청한 웹 페이지의 로직 및 데이터베이스와의 연동을 위해 PHP 파서(parser)에 처리를 요청
  3. 이때 PHP 파서가 데이터베이스와의 연동이 필요하면 데이터베이스와 데이터 처리를 수행
  4. PHP 파서는 웹 페이지의 로직 및 데이터베이스와의 작업 처리 결과를 웹 서버로 전달
  5. 웹 서버는 전달 받은 데이터로 웹 페이지를 완성해 웹 브라우저로 응답을 전송

PHP는 키워드, 클래스, 함수, 사용자 함수 이름의 대소문자를 구분하지 않음

echo() 함수

  • HTML 스트림에 문자열을 출력
  • 실제 함수가 아니므로 인수를 전달할 때 괄호 생략 가능
  • 두 개 이상 인자를 전달할 때는 불가능

예시 코드)

변수를 선언할 때는 변수의 이름 앞에 달러($) 기호를 사용

변수

변수 규칙

  1. 변수의 이름은 영문 대소문자, 숫자, 언더스코어(_)로만 구성
  2. 변수의 이름은 숫자와의 구분을 빠르게 하기 위해 숫자로는 시작할 수 없음
  3. 변수의 이름에는 공백이 포함될 수 없음
  4. 변수의 이름으로 PHP에서 미리 정의한 $this는 사용할 수 없음
  5. 변수의 이름은 대소문자를 구분

예시 코드)

지역변수, 전역변수, 정적변수

지역변수 예시)

전역변수 예시)

  • global 키워드를 함께 사용
  • 미리 정의된 전역 변수인 슈퍼 글로벌(superglobal)을 제공

정적변수 예시)

  • 함수 내부에서 static 키워드로 선언한 변수

상수

한 번 선언되면, 스크립트가 실행되는 동안 그 데이터를 변경하거나 해제(undefined)할 수 없음

define() 함수

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

예시)

  • 대소문자 구분(기본 설정)

마법 상수(magic constants)

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

__LINE__: 파일의 줄 번호 반환

__FILE__: 파일 전체 경로와 이름 반환

__DIR__: 파일의 디렉터리 반환

__FUNCTION__: 함수의 이름 반환

__CLASS__: 클래스의 이름 반환(이름은 대소문자 구분)

__TRAIT__: 트레이트(trait)의 이름 반환

__METHOD__: 클래스의 메소드 이름 반환

__NAMESPACE__: 현재 네임스페이스의 이름 반환

기본타입

불리언(boolean)

불리언 : false = 정수 : 0 = 실수 : 0.0 = 빈 문자열과 문자열 "0" = 빈 배열 = NULL

정수(integer)

예시)

integer가 표현할 수 있는 범위(263 ~ (263 - 1))
$ int_02 은 범위를 넘지 않음
$ int_03 은 범위를 넘음

-> 변수에 정수의 최대 범위를 넘는 값이 대입되면, 그 변수는 자동으로 실수형(float)으로 인식

실수(float)

예시)

e 지수 표현과 E 지수 표현이 모두 가능
대략 ~1.8e307까지 표현

문자열(string)

문자열 리터럴은 큰따옴표("")나 작은따옴표('')로 감싸서 표현

예시)

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

배열(array)

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

예시)

배열에서 키 값의 1과 “1”은 같은 값
같은 키 값을 두 번 선언해서 나중에 선언한 두 번째 값만 남음

객체(object)

클래스의 인스턴스(instance)를 저장하기 위한 타입

예시)

리소스(resource)

  • PHP 외부에 존재하는 외부 자원
  • 데이터베이스 함수 등에서 데이터베이스 연결 등을 반환할 때 사용

NULL

어떠한 값도 대입되지 않은 변수

예시)

초기화하지 않은 변수는 NULL로 자동 초기화
삭제되거나 존재하지 않는 변수를 참조할 경우에도 NULL을 반환

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

타입 변환

자동 타입 변환(type juggling)

PHP에서 변수의 타입은 해당 변수에 대입하는 값에 따라 자동으로 결정

예시)

강제 타입 변환(type casting)

사용자가 직접 데이터의 타입을 변환해야 할 경우
-> 변환시키고자 하는 데이터나 변수의 앞에 괄호를 붙이고 변환할 타입을 넣음

가변 변수(variable variables)

변수의 타입뿐만 아니라 변수의 이름까지 동적으로 바꿀 수 있음

$$ PHP는 $ HTML 참조하기 때문에 CSS
$$$ PHP는 $$ HTML를 참조하고 $$ HTML는 $ CSS를 참조하므로 JavaScript

연산자

산술 연산자

예시)

대입 연산자

변수에 값을 대입할 때 사용하는 이항 연산자이며 피연산자들의 결합 방향은 오른쪽에서 왼쪽(=)

복합 대입 연산자

  • 대입 연산자와 산술 연산자 등을 결합한 다양한 복합 대입 연산자를 제공
  • 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽

증감 연산자

피연산자를 1씩 증가 혹은 감소 시킬 때 사용하는 연산자

증감 연산자설명
++$var먼저 피연산자의 값을 1 증가 시킨 후에 해당 연산을 수행
$var++먼저 해당 연산을 수행하고 나서 피연산자의 값을 1 증가시킴
--$var먼저 피연산자의 값을 1 감소시킨 후에 해당 연산을 수행
$var--먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 감소시킴

비교 연산자

피연산자 사이의 상대적인 크기를 판단하여, 참(true)과 거짓(false)을 반환

===왼쪽의 피연산자와 오른쪽의 피연산자가 같고, 같은 타입이면 참을 반환
<>왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참을 반환

예시) 

var_dump(0 < true);           // true

→ 숫자 0을 불리언 값으로 변환하여 비교

논리 연산자

논리식을 판단하여, 참(true)과 거짓(false)을 반환

xor논리식이 서로 다르면 참을 반환함. (XOR 연산)
!논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환함. (NOT 연산)

-> and, or, xor 연산자는 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽

연산자는 피연산자가 단 하나뿐인 단항 연산자이며, 피연산자의 결합 방향은 오른쪽에서 왼쪽

비트 연산자

비트(bit) 단위로 논리 연산을 수행

  • 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용
비트 연산자설명
&대응되는 비트가 모두 1이면 1을 반환(비트 AND 연산)
^대응되는 비트가 서로 다르면 1을 반환 (비트 XOR 연산)
~비트를 1이면 0으로, 0이면 1로 반전시킴(비트 NOT 연산)
<<지정한 수만큼 비트를 전부 왼쪽으로 이동시킴 (left shift 연산)
>>부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴 (right shift 연산)

기타 연산자

삼항 연산자(ternary operator)

유일하게 피연산자를 세 개나 가지는 조건 연산자

  • 조건식 ? 반환값1 : 반환값2
  • 예시)

문자열 연산자(string operator)

문자열 연산자(.)를 사용하여 문자열을 연결

예시)

배열 합집합 연산자(array union operator)

피연산자로 오는 두 배열의 합집합을 반환

  • 왼쪽 피연산자로 오는 배열의 키값은 유지하면서, 거기에 맞춰 오른쪽 피연산자로 오는 배열을 덧붙이는 방식

예시)

$ result_01 의 결과는 [PHP, MySQL, JavaScript]
$ result_02 의 결과는 [HTML, CSS, JavaScript]

instanceof 연산자

  1. 해당 변수가 어떤 클래스(class)에서 생성된 객체(object)인지를 확인할 때
  2. 해당 변수가 부모 클래스(parent class)에서 상속받은 클래스인지를 확인할 때
  3. 해당 변수가 클래스의 인스턴스(instance)인지 아닌지를 확인할 때
  4. 해당 변수가 인터페이스(interface)로 구현한 클래스의 객체 인스턴스(object instance)인지 아닌지를 확인할 때

제어문

조건문

if문

조건식의 결과가 참(true)이면 주어진 명령문을 실행하며, 거짓(false)이면 실행X

else문

if 문의 조건식 결과가 거짓(false)일 때 주어진 명령문을 실행

elseif문

여러 번 사용되어 다양한 조건을 설정

switch문

주어진 조건 값에 따라 프로그램이 다른 명령을 수행하도록 하는 조건문

주어진 조건 값과 case 절의 값을 일치 연산자(===)를 사용하여 엄격하게 비교하지 않고 동등 연산자(==)를 사용하여 느슨하게 비교

반복문

while문

특정 조건을 만족할 때까지 계속 주어진 명령문을 반복해서 실행

실행될 명령문이 한 줄뿐이라면 중괄호({})를 생략 가능

do/while문

먼저 루프를 한 번 실행한 후에 표현식을 검사

do {

#조건식의 결과가 참일 동안 반복적으로 실행하고자 하는 명령문

#조건식의 결과를 변경하는 명령문

} while(조건식);

for문

쉼표 연산자(,)를 사용하면 여러 개의 초기식이나 증감식을 동시에 사용

for(초기식; 조건식; 증감식){

#조건식의 결과가 참일 동안 반복적으로 실행하고자 하는 명령문

}

foreach문

배열의 모든 요소를 손쉽게 순회할 수 있도록 함

정확히 배열의 길이(length)만큼 반복

foreach (배열 as 값을 저장할 변수) {

#실행하고자 하는 명령문;

}

기타 제어문

continue문

루프 내에서 사용하여 해당 루프의 나머지 부분을 건너뛰고, 바로 다음 조건식의 판단으로 넘어감

보통 반복문 내에서 특정 조건에 대한 처리를 제외하고자 할 때 사용

switch 문에도 continue를 사용할 수 있어, switch 문을 반복문처럼 사용 가능

break문

해당 반복문을 완전히 종료시키고, 반복문 다음에 위치한 명령문으로 이동시킴

goto문

프로그램의 흐름을 지정된 레이블(label)로 무조건 변경하는 명령문

가장 손쉽게 사용할 수 있지만, 반면에 프로그램의 흐름을 매우 복잡하게 만듦

제어문 대체문

조건문에서는 if 문과 switch 문, 반복문에서는 while 문, for 문과 foreach 문에 사용 가능

사용방법

  1. 제어문의 여는 괄호({)를 콜론(:)으로 대체
  2. 닫는 괄호(})를 각각 endif;, endswitch;, endwhile;, endfor;, endforeach;로 대체

배열

맵(map)으로 이루어진, 순서가 있는 집합

한 쌍의 키(key)와 값(value)

1차원 배열

array()라는 함수를 이용해 배열을 생성

  • 배열 이름은 배열을 선언한 후에 해당 배열에 접근하기 위해 사용

$배열이름 = array();

배열 요소의 참조

인덱스(index)를 사용

  • 인덱스로 숫자뿐만 아니라 문자열을 사용

$배열이름[인덱스]

배열의 홀(hole)

인덱스에 대응하는 배열 요소가 없는 부분

  • 배열의 특정 인덱스에만 배열 요소를 추가 가능
  1. isset() 함수는 인수로 전달받은 변수가 초기화되어 있는지를 확인
  2. 존재하는 인덱스는 10뿐이며, 나머지 인덱스에는 배열 요소가 존재
  3. 홀(hole)을 참조하게 되면. 초기화되지 않은 변수를 참조할 때처럼 NULL을 반환

루프로 배열 접근

for문 사용해서 배열 요소 접근 가능

  • 홀(hole)을 가지는 배열에서는 for문 대신 foreach문 사용

  • count()함수는 홀이 가지는 배열에서 사용 불가능

다차원 배열

2차원 이상의 배열

2차원 배열

배열 요소로 또 다른 1차원 배열을 사용하는 배열

루프를 이용한 2차원 배열로의 접근

1차원 배열과 마찬가지로 for 문에 배열의 인덱스를 이용

  • 2차원 배열에서는 1차원 배열과는 달리 행과 열에 대해 for 문을 2번 사용

3차원 배열

배열 요소로 2차원 배열을 사용하는 배열

연관 배열

배열의 인덱스를 정수뿐만이 아닌 다양한 타입으로 설정한 배열

$배열이름 = array();

연관 배열의 참조

배열 이름과 함께 키(key)를 사용

$배열이름["키"] = 값;

연관 배열을 생성하면서 동시에 배열 요소를 초기화 가능

$배열이름 = array("키1" => 값1, "키2" => 값2, ...);

루프를 이용한 연관 배열로의 접근

연관 배열의 인덱스는 숫자가 아니므로, for 문을 사용하여 배열 요소에 접근 불가능 → foreach 문이나 each() 함수를 사용

foreach문 예시)

each() 함수 예시)

0개의 댓글