1. PHP 시작
- 1) PHP 개요
- 1. 클라이언트 사이드(client-side)
- 자바스크립트
- 2. 서버 사이드(server-side)
- PHP
- 1. 클라이언트 사이드(client-side)
- 2) PHP 소개
- PHP(PHP: Hypertext Preprocessor)
- 사전 지식
- - HTML
- - CSS
- - JavaScript
- 목적
- 동적 웹 페이지를 쉽고 빠르게 만들 수 있도록
- 특징
- 장점
- 대부분의 웹 서버에서 지원
- 직관적으로 코드를 작성할 수 있어서, 작성해야 하는 코드의 양이 적습니다
- 텍스트 처리에 특화되어 있어 HTML 문서 처리에 적합
- 단점
- 복잡한 사이트를 만드는 데는 효율적이지 못합니다
- 보안에 안전하지 않은 언어 구조
- 장점
- 역사
- 1995년에 PHP 1(Personal Home Page Tools) 버전이 라스무스 러도프(Rasmus Lerdorf)에 의해 만들어짐
- 1997년에는 PHP/FI 2(Personal Home Page / Forms Interpreter)이 공개
- 1998년에 이르러 오늘날의 PHP와 매우 유사한 PHP 3이 공개
- 2000년에는 Zend 엔진을 도입한 PHP 4가 공개
- 2004년에는 객체 지향 개념이 강화된 PHP 5가 발표
- 2015년 12월에 PHP 7 발표
- 기존 PHP 5와의 호환성을 최대한 유지하면서도 기존보다 2배 이상의 속도 향상
- 2016년 12월에 드디어 PHP 7.1 정식버전이 발표
- PHP 표준
- 버전별 주요 특징
- PHP 5
- 객체 지향 프로그래밍의 개념이 많이 추가
- PHP 5.3
- 네임스페이스(namespaces)가 추가
- PHP 5.4
- 단일 상속의 한계를 없앤 트레이트(traits) 개념이 추가
- PHP 7
- 2배 이상의 속도 향상 및 익명 클래스(anonymous classes)가 추가
- PHP 5
- 3) PHP 동작 원리
- 웹 프로그래밍 언어
- 언어 운영체제 웹 서버 제조사 속도 이식성
- PHP 리눅스, 윈도우 Apache 등 오픈 소스 빠름 보통
- JSP 리눅스, 윈도우 Tomcat, Jeus 등 Oracle 느림 좋음
- ASP.NET 윈도우 IIS Microsoft 보통 나쁨
- 서버 사이드 스크립트 언어
- 동적 웹 페이지
- 서버에 미리 저장된 파일이 아닌 서버에 있는 데이터들을 서버 사이드 스크립트 언어로 가공하여 생성되는 페이지
- 동적 웹 페이지
- 동작원리
- 브라우저
- 1. 웹서버에 웹 페이지를 요청
- 웹서버
- 2. php파서에 스크립트 실행 요청
- 5. 결과를 브라우저에 보냄(응답)
- php 파서
- 3. DB와 작업
- 4. 작업처리결과를 웹서버에 보내줌
- DB
- 브라우저
- 웹 프로그래밍 언어
- + - 4) PHP 문법
- 코드 영역
- 웹 페이지의 어느 부분에나 위치
- 문법
- 1. PHP 권장 스타일 : <?php ... ?>
- <!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>PHP Syntax</title>
</head>
<body>
<?php
echo "PHP 수업에 잘 오셨습니다!";
?>
</body>
</html>
- <!DOCTYPE html>
- 2. HTML 스크립트 스타일 : <script language = "php"> ... </script>
- 3. SGML 스타일 : <? ... ?>
- 4. ASP 스타일 : <% ... %>
- 1. PHP 권장 스타일 : <?php ... ?>
- 문법
- C언어처럼 PHP 명령문도 마지막은 세미콜론(;)
- <?php
echo "PHP 수업에 잘 오셨습니다!";
?> - PHP 코드가 종료되면 자동으로 세미콜론을 적용
- <?php
echo "PHP 수업에 잘 오셨습니다!"
?>
- <?php
- <?php
- 코드 영역을 나타내는 종료 태그도 생략 가능
- <?php
echo "PHP 수업에 잘 오셨습니다!";
- <?php
- C언어처럼 PHP 명령문도 마지막은 세미콜론(;)
- 주석
- 1. 한 줄 C언어 스타일 : //주석문
- 2. 여러 줄 C언어 스타일 : /*주석문*/
- 3. 한 줄 쉘 스타일 : #주석문
- ※
- '?>'인 종료 태그의 직전까지만 적용
- echo(), print(), isset() 등
- 함수처럼 생겼지만 실제 함수가 아닌 구문
- 언어 구조(language construct)
- 실제 함수가 아니므로, 인수를 전달할 때 괄호( ) 생략 가능
- 함수처럼 생겼지만 실제 함수가 아닌 구문
- echo() 함수
- HTML 스트림에 문자열을 출력
- 두 개 이상의 인수를 전달할 때는 반드시 괄호 사용 안됨
- <?php
echo "문자열을 출력합니다.<br>";
echo ("인수를 전달할 때 괄호를 사용해도 괜찮습니다!<br>");
ECHO "echo() 함수의 키워드는 대소문자를 구분하지 않습니다!<br>";
echo "첫 번째 인수, ", "두 번째 인수";
//echo("첫 번째 인수, ", "두 번째 인수"); // 오류 발생
?>
- <?php
- 코드 영역
2. PHP 기초
- 5) 변수
- 식별자
- 식별할 때 사용하는 이름
- $변수이름 = 초깃값;
- 타입 명시 안함
- 대입하는 값에 따라 자동으로 결정
- 타입 명시 안함
- 대소문자 구분
$var = 10; // 정수값을 대입함
echo gettype($var); // 해당 변수의 타입을 출력함
echo " : $var <br>";
$var = 3.14; // 실수값을 대입함
echo gettype($var); // 해당 변수의 타입을 출력함
echo " : $var <br>";
$var = "PHP"; // 문자열을 대입함
echo gettype($var); // 해당 변수의 타입을 출력함
echo " : $var";
?>- integer : 10
double : 3.14
string : PHP - $var는 처음에는 정수형 변수였다가, 나중에는 실수형 변수, 마지막에는 문자열 변수로 바뀜
- gettype() 함수는 인수로 전달받은 데이터의 타입을 출력
- 문자열내에 변수 이름 사용할 때는 중괄호({})를 사용하여, 어디까지가 변수의 이름인지를 명확히 명시
- 예제
- $var = 10;
① echo "$var"; // 10
② echo "{$var}"; // 10
③ echo "변수 \$var에 저장된 값은 $var"; // 변수 $var에 저장된 값은 . -> php파서가 변수 인식 못함
④ echo "변수 \$var에 저장된 값은 {$var}"; // 변수 $var에 저장된 값은 10
- $var = 10;
- 기본값으로 자동 초기화
- 불리언(boolean) FALSE
- 정수(integer) 0
- 실수(float) 0.0
- 문자열(string) 빈 문자열
- 배열(array) 빈 배열
- 예제
- // 선언되지 않은 변수의 기본값
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번째 배열 요소" }
- // 선언되지 않은 변수의 기본값
- 식별자
- 6) 변수의 종류
- 1. 지역 변수(local variable)
- 함수 내부 등
- 2. 전역 변수(global variable)
- + - 함수 내부에서 접근할 때는 global 키워드를 사용하여 호출 후 사용
- $var = 10; // 전역 변수로 선언함
function varFunc() {
echo "함수 내부에서 호출한 전역 변수 var의 값은 {$var}<br>";
global $var; // 함수 내에서 사용할 전역 변수를 명시함
echo "함수 내부에서 호출한 전역 변수 var의 값은 {$var}<br>";
}
varFunc();
echo "함수 밖에서 호출한 전역 변수 var의 값은 {$var}";- 함수 내에서 호출한 전역 변수 var의 값은
함수 내에서 호출한 전역 변수 var의 값은 10
함수 밖에서 호출한 전역 변수 var의 값은 10 PHP Warning: Undefined variable $var in /home/jdoodle.php on line 15
- 함수 내에서 호출한 전역 변수 var의 값은
- $var = 10; // 전역 변수로 선언함
- global 키워드 대신 $GLOBALS 배열을 사용
- + - PHP는 모든 전역 변수를 $GLOBALS 배열에 저장
- $var = 10; // 전역 변수로 선언함
function varFunc() {
echo "함수 내부에서 호출한 전역 변수 var의 값은 {$var}<br>";
echo "함수 내부에서 호출한 전역 변수 var의 값은 {$GLOBALS['var']}<br>";
}
varFunc();
echo "함수 밖에서 호출한 전역 변수 var의 값은 {$var}";
- $var = 10; // 전역 변수로 선언함
- + - PHP는 모든 전역 변수를 $GLOBALS 배열에 저장
- 슈퍼 글로벌
- 미리 정의된 전역 변수
- 특별한 선언 없이 스크립트 내의 어디에서라도 바로 사용 가능
- 1. $GLOBALS
- 2. $_SERVER
- 3. $_GET
- 4. $_POST
- 5. $_FILES
- 6. $_COOKIE
- 7. $_SESSION
- 8. $_REQUEST
- 9. $_ENV
- 미리 정의된 전역 변수
- + - 함수 내부에서 접근할 때는 global 키워드를 사용하여 호출 후 사용
- 3. 정적 변수(static variable)
- 함수 내부에서 static 키워드로 선언한 변수
- 호출이 종료되더라도 메모리상에서 사라지지 않음
- 지역 변수처럼 해당 함수 내부에서만 접근
- 해당 함수를 여러번 호출할때 값 변경저장 가능
- 함수 내부에서 static 키워드로 선언한 변수
- 1. 지역 변수(local variable)
- 7) 상수
- 선언
- define(상수이름, 상숫값, 대소문자구분여부)
- 세 번째 인수
- 상수의 이름이 대소문자를 구분여부
- 기본값은 false로 대소문자를 구분
- 상수의 이름이 대소문자를 구분여부
echo PHP; // PHP 수업에 잘 오셨습니다!
echo php; // php -> 상수 인식 안됨
define("PHP", "<br>PHP 수업에 잘 오셨습니다!", true); // 대소문자를 구분하지 않음.
echo php; // PHP 수업에 잘 오셨습니다!
echo Php; // PHP 수업에 잘 오셨습니다! - 세 번째 인수
- define(상수이름, 상숫값, 대소문자구분여부)
- 선언된 상수는 스크립트의 어디에서라도 참조
- 함수내에서 선언되어도 함수밖에서 사용 가능
- 선언되기 이전의 스크립트 영역에서는 해당 상수 참조 안됨
- 마법 상수
- 미리 정의된 다양한 상수
- 대소문자 구분 X
- 예제
- echo "<pre>";
print_r(get_defined_constants(true));
echo "</pre>";
- echo "<pre>";
- 종류
- __LINE__ 파일의 현재 줄 번호를 반환함.
- __FILE__
- 파일의 전체 경로와 이름을 반환함.
- include 내부에서 사용할 경우 include된 파일명을 반환함.
- __DIR__
- 파일의 디렉터리를 반환함.
- 포함한 파일 안에서 사용할 경우 포함된 파일의 디렉터리를 반환함.
- dirname(__FILE__)과 같은 결과를 반환함.
- __FUNCTION__ 함수의 이름을 반환함.
- __CLASS__ 클래스의 이름을 반환함. 클래스 이름은 대소문자를 구분함.
- __TRAIT__
- 트레이트(trait)의 이름을 반환함.
- 트레이트의 이름은 트레이트를 선언한 네임스페이스를 포함함.
- __METHOD__ 클래스의 메소드 이름을 반환함.
- __NAMESPACE__ 현재 네임스페이스의 이름을 반환함.
- 미리 정의된 다양한 상수
- 선언
- 8) 기본 타입
- 1. 불리언(boolean)
- 2. 정수(integer)
- 3. 실수(float)
- 최대 범위를 넘는 값은 미리 정의된 상수인 INF(infinite)로 인식
- 4. 문자열(string)
- 문자열 리터럴은 큰따옴표("")나 작은따옴표('')로 감싸서 표현
- 아스키(ASCII) 인코딩
- 영문자는 한 글자당 1바이트, 한글은 한 글자당 2바이트
- UTF-8 인코딩
- 영문자는 한 글자당 1바이트, 한글은 한 문자당 3바이트
- strlen()
- 문자열의 길이를 반환
- 5. 배열(array)
- 한 쌍의 키(key)와 값(value)으로 이루어진 맵(map)으로 구성되는 순서가 있는 집합
- 키값
- 정수와 문자열
- 다른 타입은 내부적으로 타입 변환
- - 불리언은 true는 1로, false는 0으로 자동 타입 변환
- - 유효한 숫자로만 이루어진 문자열은 정수나 실수로 자동 타입 변환
- - 실수는 소수 부분이 제거되고, 정수로 자동 타입 변환
- - NULL은 빈 문자열("")로 자동 타입 변환
- - 배열과 객체는 배열의 키값으로 사용할 수 없습니다.
- 다른 타입은 내부적으로 타입 변환
- 배열 선언시 키값 1과 "1" 같이 선언한 것은, 같은 키값이 되며 먼저 선언한것은 대체됨
- 마지막에 선언된 값만 저장
- + - 예제
- <?php
$arr = array(
1 => "첫 번째 값", // php의 배열에서 키값의 1과 "1"은 같은 값을 나타냄.
"1" => "두 번째 값", // 같은 키값을 사용하여 두 번 선언했기 때문에 나중에 선언된 "두 번째 값"만 남게됨.
10 => "세 번째 값",
-10 => "네 번째 값"
);
var_dump($arr);
echo "<br>";
echo $arr[1]."<br>";
echo $arr["1"]."<br>";
echo $arr[10]."<br>";
echo $arr[-10];
?>- array(3) { [1]=> string(14) "두 번째 값" [10]=> string(14) "세 번째 값" [-10]=> string(14) "네 번째 값" }
두 번째 값
두 번째 값
세 번째 값
네 번째 값
- array(3) { [1]=> string(14) "두 번째 값" [10]=> string(14) "세 번째 값" [-10]=> string(14) "네 번째 값" }
- <?php
- 정수와 문자열
- 6. 객체(object)
- 클래스의 인스턴스(instance)를 저장하기 위한 타입
- 7. 리소스(resource)
- PHP 외부에 존재하는 외부 자원
- 데이터베이스 연결 등을 반환할 때 사용
- PHP 외부에 존재하는 외부 자원
- 8. NULL
- unset($var_01); // $var_01 변수를 삭제함.
- 메모리에서 삭제
- unset($var_01); // $var_01 변수를 삭제함.
- ※
- var_dump($int_01)
- 변수의 타입과 값을 보여줌
- var_dump($int_01)
- 9) 타입 변환
- 강제 타입 변환
- 사용자가 직접 데이터의 타입을 변환해야 할 경우
- 타입 캐스트 연산자
- 괄호( )
- $var_03 = 0;
var_dump($var_03); // int(0)
$var_04 = (boolean) $var_03;
var_dump($var_04); // bool(false)
- $var_03 = 0;
- 괄호( )
- 가변 변수
- $의 중복사용
- 타입뿐만 아니라 변수의 이름까지 동적으로 바꿀 수 있습니다
- 예제
- $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 = "HTML";
- $의 중복사용
- 강제 타입 변환
3. 연산자
- 10) 산술 연산자
- ** 왼쪽 피연산자의 값에 오른쪽 피연산자의 값을 제곱함. (PHP 5.6에서 추가됨)
- PHP 연산자의 우선순위표
- 11) 대입 연산자
- =
- 복합 대입 연산자
- += 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 왼쪽의 피연산자에 대입함.
- -= 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 왼쪽의 피연산자에 대입함.
- *= 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 왼쪽의 피연산자에 대입함.
- /= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 왼쪽의 피연산자에 대입함.
- %= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함.
- .= 왼쪽 피연산자의 문자열에 오른쪽 피연산자의 문자열을 추가한 후, 왼쪽의 피연산자에 대입함.
- <<=
- 왼쪽의 피연산자의 비트를 오른쪽의 피연산자만큼 전부 왼쪽으로 이동시킨 후, 왼쪽의 피연산자에 대입
- >>=
- 왼쪽 연산자 비트를 부호를 유지하면서 오른쪽의 피연산자만큼 오른쪽으로 이동시킨 후, 왼쪽연산자에 대입
- &=
- 왼쪽연산자와 오른쪽연산자의 논리식이 모두 true면 왼쪽 피연산자에 true을 대입, 그 외에는 false 대입
- |=
- 왼쪽연산자나 오른쪽연산자의 논리식 중 하나라도 true면 왼쪽연산자에 true 대입, 그 외에는 false 대입
- ^=
- 왼쪽연산자 논리식과 오른쪽연산자 논리식이 서로 다르면 왼쪽연산자에 true 대입, 그 외에는 false 대입
- 12) 증감 연산자
- ++$var 먼저 피연산자의 값을 1 증가시킨 후에 해당 연산을 수행함.
- $var++ 먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 증가시킴.
- 항이 여러개일때 두 항의 연산 후에 증감연산자 적용
- --$var 먼저 피연산자의 값을 1 감소시킨 후에 해당 연산을 수행함.
- $var-- 먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 감소시킴.
- 13) 비교 연산자
- 참(true)과 거짓(false)을 반환
- == 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 참을 반환함.
- === 왼쪽의 피연산자와 오른쪽의 피연산자가 같고, 같은 타입이면 참을 반환함. (PHP 4에서 추가됨)
- != 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참을 반환함.
- <> 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참을 반환함.
- !== 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않거나, 타입이 다르면 참을 반환함. (PHP 4에서 추가됨)
- < 왼쪽의 피연산자가 오른쪽의 피연산자보다 작으면 참을 반환함.
- <= 왼쪽의 피연산자가 오른쪽의 피연산자보다 작거나 같으면 참을 반환함.
- > 왼쪽의 피연산자가 오른쪽의 피연산자보다 크면 참을 반환함.
- >= 왼쪽의 피연산자가 오른쪽의 피연산자보다 크거나 같으면 참을 반환함.
- 다양한 타입의 비교
- 숫자로 시작하는 문자열과 리소스는 숫자로 변환한 후 비교
- 14) 논리 연산자
- and 논리식이 모두 참이면 참을 반환함. (AND 연산)
- or 논리식 중에서 하나라도 참이면 참을 반환함. (OR 연산)
- xor 논리식이 서로 다르면 참을 반환함. (XOR 연산)
- && 논리식이 모두 참이면 참을 반환함. (AND 연산)
- || 논리식 중에서 하나라도 참이면 참을 반환함. (OR 연산)
- ! 논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환함. (NOT 연산)
- 15) 비트 연산자
- 비트(bit) 단위로 논리 연산을 수행
- & 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산)
- | 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)
- ^ 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)
- ~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산)
- << 지정한 수만큼 비트를 전부 왼쪽으로 이동시킴. (left shift 연산)
- >> 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산)
- 16) 기타 연산자
- 삼항 연산자
- 조건식 ? 반환값1 : 반환값2
- 문자열 연산자
- .
- echo() 함수에서는 쉼표 연산자(,)를 이용하여 문자열을 연결
- ex
- $str_01 = "PHP 수업";
$str_02 = "에 오신것을 환영";
echo "두 문자열을 합친 문자열은 '".($str_01.$str_02)."'<br>";
echo $str_01, $str_02;- 두 문자열을 합친 문자열은 'PHP 수업에 오신것을 환영'
PHP 수업에 오신것을 환영
- 두 문자열을 합친 문자열은 'PHP 수업에 오신것을 환영'
- $str_01 = "PHP 수업";
- 배열 합집합 연산자
- +
- 연산 순서에 따라 키값이 보존됨
- 앞에 있는 연산자 키값 우선
$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 연산자
- 어떤 클래스의 인스턴스 인지 확인
- 부모 클래스(parent class)에서 상속받은 클래스인지를 확인
- 인터페이스(interface)로 구현한 클래스의 객체 인스턴스 인지 확인
- 삼항 연산자
4. 제어문
- 17) 조건문
- if 문
- if (조건식1) {
조건식1의 결과가 참일 때 실행하고자 하는 명령문;
}
elseif (조건식2) {
조건식2의 결과가 참일 때 실행하고자 하는 명령문;
}
else {
조건식1의 결과도 거짓이고, 조건식2의 결과도 거짓일 때 실행하고자 하는 명령문;
}- 명령문이 한 줄이면 중괄호({})를 생략가능
- if (조건식1) {
- 삼항 연산자에 의한 조건문
- switch 문
- switch (조건 값)
{
case 값1:
조건 값이 값1일 때 실행하고자 하는 명령문;
break;
case 값2:
조건 값이 값2일 때 실행하고자 하는 명령문;
break;
...
default:
해당 case가 없을 때 실행하고자 하는 명령문;
break;
}- $var = "아보카도";
switch ($var) {
case "귤":
case "사과":
case "바나나":
case "아보카도":
echo "여기 있는 과일은 제가 먹어본 과일";
break;
case "파파야":
case "두리안":
case "석가":
echo "여기 있는 과일은 제가 먹어보지 못한 과일";
break;
default:
echo "여기 있는 것은 과일이 아닙니다.";
break;
}
- $var = "아보카도";
- switch (조건 값)
- if 문
- 18) 반복문
- 1. while 문
- while (조건식) {
조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}- $i = 0;
while ($i < 5) {
echo ($i++)."<br>";
}
- $i = 0;
- while (조건식) {
- 2. do / while 문
- do {
조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
} while (조건식);- do { // do / while문은 조건식과 상관없이 반드시 한 번은 루프를 실행함
echo "변수 j의 값은 ".(++$j)."<br>";
} while ($j > 5);
- do { // do / while문은 조건식과 상관없이 반드시 한 번은 루프를 실행함
- do {
- 3. for 문
- for (초기식; 조건식; 증감식) {
조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}- 초기식, 표현식, 증감식은 각각 생략될 수 있습니다.
- 쉼표 연산자(,)를 사용하면 여러 개의 초기식이나 증감식을 동시에 사용
- for ($i = 0; $i < 5; $i++) {
echo "{$i}<br>";
}
- for (초기식; 조건식; 증감식) {
- 4. foreach 문
- 배열의 모든 요소를 손쉽게 순회
- foreach (배열 as 값을저장할변수) {
실행하고자 하는 명령문;
} - 예제
- foreach 문이 끝난 뒤에는 unset() 함수를 사용하여 해제
- $arr = array(2, 4, 6, 8);
foreach ($arr as $value) {
echo "변수 \$value의 현재값은 {$value}<br>";
}
unset($value);
- $arr = array(2, 4, 6, 8);
- 배열의 값뿐만 아니라 키값도 저장하여 활용
- $arr = array(
"둘" => 2,
"넷" => 4,
"여섯" => 6,
"여덟" => 8,
);
foreach ($arr as $key => $value) {
echo "배열 \$arr에서 키값 '{$key}'에 대한 값은 {$value}<br>";
}
unset($value);
- $arr = array(
- foreach 문이 끝난 뒤에는 unset() 함수를 사용하여 해제
- 1. while 문
- 19) 기타 제어문
- continue 문
- 루프의 나머지 부분을 건너뛰고, 바로 다음 조건식으로 이동
- break 문
- 반복문 다음에 위치한 명령문으로 이동
- goto 문
- 지정된 레이블(label)로 이동
- 현재는 거의 사용 안함
- 프로그램의 흐름을 매우 복잡하게 만듬
- 현재는 거의 사용 안함
- 지정된 레이블(label)로 이동
- 제어문의 대체 문법
- <?php $var = 5; ?>
<?php if ($var > 6): ?> -> 대체 문법 시작
변수의 값은 6보다 큽니다. <!-- 이 부분은 HTML 구문임 -->
<?php elseif ($var == 6): ?>
변수의 값은 6 <!-- 이 부분은 HTML 구문임 -->
<?php elseif ($var < 6): ?>
변수의 값은 6보다 작습니다. <!-- 이 부분은 HTML 구문임 -->
<?php endif; ?> -> 대체 문법 종료: endif;, endswitch;, endwhile;, endfor;, endforeach; 가능- 제어문의 여는 괄호({)를 콜론(:)으로 대체
- <?php $var = 5; ?>
- continue 문
5. 배열
- 20) 배열의 기초
- 배열
- 맵(map: 키+ 값)으로 이루어진, 순서가 있는 집합
- 1. 1차원 배열
- $배열이름 = array();
- 2. 다차원 배열
- 3. 연관 배열
- 배열 요소의 참조
- $배열이름[인덱스]
- 인덱스는 숫자 또는 문자열
- $배열이름[인덱스]
- 배열 요소의 추가
- 생성 따로, 배열 요소 추가 따로
- $arr = array(); // 배열 생성
$arr[0] = "apple"; // 배열 요소 추가
$arr[1] = "banana";
$arr[2] = "orange";
- $arr = array(); // 배열 생성
- 생성하면서 동시에 배열 요소를 초기화
- $배열이름 = array(배열요소1, 배열요소2, ...);
- $arr = array("apple", "banana", "orange"); // 배열 생성과 동시에 초기화
- 생성없이 배열요소 추가
- 자동 생성
- $arr[0] = "apple"; // 배열이 존재하지 않으므로, 배열 생성 후 요소 추가됨
$arr[1] = "banana";
$arr[] = "orange"; - 인덱스를 지정하지 않으면 0부터 자동 생성
- $arr[0] = "apple"; // 배열이 존재하지 않으므로, 배열 생성 후 요소 추가됨
- 자동 생성
- 생성 따로, 배열 요소 추가 따로
- 배열의 홀(hole)
- 특정 인덱스에만 배열 요소를 추가
- 나머지는 null
- for문 count()값이 홀을 포함 안함
- 홀(null값)을 가진 배열은 for문으로 접근 안되고, foreach 로 접근해야 함
- $arr = array(); // 배열의 생성
$arr[10] = "banana"; // 인덱스 10에만 배열 요소를 추가함.
var_dump(isset($arr[0])); // false
var_dump(isset($arr[10])); // true
- 특정 인덱스에만 배열 요소를 추가
- 루프를 이용한 배열로의 접근
- $arr = array("apple", "banana", "orange");
for($i = 0; $i < count($arr); $i++){
echo $arr[$i]."<br>";
}- 홀을 포함 안함
- count() 함수는 배열의 모든 요소의 개수를 반환
- $arr = array("apple", "banana", "orange");
- 배열
- 21) 다차원 배열
- $배열이름 = array(
array(),
array(),
...
); - 2차원 배열 요소 입력
- $arr = array( // 1차원 배열을 3개 갖는 2차원 배열 선언
array(),
array(),
array()
);
$arr[0][0] = "apple"; // 배열 요소 입력
$arr[0][1] = "korea";
$arr[0][2] = 1000;
$arr[1][0] = "banana";
$arr[1][1] = "philippines";
$arr[1][2] = 2000;
$arr[2][0] = "orange";
$arr[2][1] = "us";
$arr[2][2] = 1500;
echo $arr[0][0].", ".$arr[0][1].", ".$arr[0][2]."<br>";
echo $arr[1][0].", ".$arr[1][1].", ".$arr[1][2]."<br>";
echo $arr[2][0].", ".$arr[2][1].", ".$arr[2][2]";
- $arr = array( // 1차원 배열을 3개 갖는 2차원 배열 선언
- 생성하면서 동시에 배열 요소를 초기화
- $배열이름 = array(
array(배열요소00, 배열요소01, ...),
array(배열요소10, 배열요소11, ...),
...
);
- $배열이름 = array(
- 루프를 이용한 2차원 배열로의 접근
- for($row = 0; $row < 3; $row++) {
for($column = 0; $column < count($arr[$row]); $column++){
echo $arr[$row][$column].", ";
}
}
- for($row = 0; $row < 3; $row++) {
- 3차원 배열
- $배열이름 = array(
array(
array(),
array(),
...
),
array(
array(),
array(),
...
),
...
);- 정육면체 모양
- $배열이름 = array(
- $배열이름 = array(
- 22) 연관 배열
- 배열의 인덱스를 정수뿐만이 아닌 다양한 타입으로 설정한 배열
- 키값에 좀 더 명확한 의미를 부여
- 다른 타입의 값을 키값으로 사용하면, 내부적으로 정수와 문자열로 타입 변환
- 생성
- $배열이름 = array();
- 배열이 존재하지 않으면, 해당 이름으로 새로운 배열을 만든 후에 배열 요소를 추가
- $array["apple"] = 1000; // 배열이 존재하지 않으므로, 먼저 배열을 생성한 후에 요소가 추가됨.
$array["banana"] = 2000;
$array["orange"] = 1500;
echo $array["apple"].", ".$array["banana"].", ".$array["orange"];
- $array["apple"] = 1000; // 배열이 존재하지 않으므로, 먼저 배열을 생성한 후에 요소가 추가됨.
- 연관 배열의 참조
- $배열이름["키"] = 값;
- $array = array(); // 배열 생성
$array["apple"] = 1000; // 연관 배열 요소 추가
$array["banana"] = 2000;
$array["orange"] = 1500;
- $array = array(); // 배열 생성
- $배열이름 = array("키1" => 값1, "키2" => 값2, ...);
- // 연관 배열 생성과 동시에 초기화
$array = array("apple" => 1000, "banana" => 2000, "orange" => 1500);
echo $array["apple"].", ".$array["banana"].", ".$array["orange"];
- // 연관 배열 생성과 동시에 초기화
- $배열이름["키"] = 값;
- 루프를 이용한 연관 배열로의 접근
- for문 안됨
- 인덱스가 숫자 아님
- foreach 문 사용
- $array = array("apple" => 1000, "banana" => 2000, "orange" => 1500);
foreach ($array as $key => $value) {
echo $key." ".$value."<br>";
}
- $array = array("apple" => 1000, "banana" => 2000, "orange" => 1500);
- each() 함수 사용
- 배열 커서(array cursor)가 현재 가리키고 있는 배열 요소를 반환하고, 다음 배열 요소를 가리킴
- $array = array("apple" => 1000, "banana" => 2000, "orange" => 1500);
while($element = each($array)) {
echo $element['key']." ".$element['value']."<br>";
}
- for문 안됨
- 배열의 인덱스를 정수뿐만이 아닌 다양한 타입으로 설정한 배열
6. 함수
- 23) 함수의 기초
- 특징
- 반복 회피
- 모듈화로 인한가독성
- 구조
- 1. 함수 이름
- function 키워드로 선언
- 2. 괄호 안에 쉼표(,)로 구분되는 함수의 매개변수(parameter)
- 3. 중괄호({})로 둘러싸인 PHP 수행 코드
- 1. 함수 이름
- 문법
- function 함수이름(매개변수1, 매개변수2,...)
{
함수가 호출 되었을 때 실행될 코드;
}
- function 함수이름(매개변수1, 매개변수2,...)
- 특징
- 24) 사용자 정의 함수
- 함수의 호출
- 모든 함수와 클래스는 전역 범위(global scope)
- 함수의 값 반환
- return 키워드를 사용하여 명시
- 반환 타입
- 객체를 포함한 PHP에서 사용할 수 있는 모든 타입 가능
- 약한 강도
- unction sum($x, $y) : float // 반환값의 타입을 float 타입으로 설정함.
{
return $x + $y;
}
...
var_dump(sum(3 + 4)); // float
- unction sum($x, $y) : float // 반환값의 타입을 float 타입으로 설정함.
- 강한 강도
- declare(strict_types = 1); // strict 모드로 설정함.(강한강도 설정)
function sum($x, $y) : float // 반환값의 타입을 float 타입으로 설정함.
{
return $x + $y;
}
...
① var_dump(sum(3 + 4)); // 오류가 발생함.
② var_dump(sum(3 + 4.5)); // float
- declare(strict_types = 1); // strict 모드로 설정함.(강한강도 설정)
- 함수의 호출
- 25) 매개변수와 인수
- 매개변수의 전달 방식
- 1. 값 전달 방식
- 변수를 함수에 매개변수로 사용한후, 함수 안에서 변경되어도 함수 밖 원본 데이터는 영향 없음
- 함수 호출시의 매개변수와 함수 내부에서 사용되는 인수는 엄밀히 다른 값임
- 인수는 매개변수의 복사본
- 2. 참조 전달 방식
- 함수 내부에서 함수 밖의 데이터를 조작하기 위해서는 해당 변수를 전역 변수로 선언 가능
- 참조 전달(pass by reference)을 이용하여 원본 데이터를 그대로 참조
- function increment(&$para) // 인수로 전달되는 값의 원본을 참조함.
{
$para++;
}
$value = 1;
increment($value);
- function increment(&$para) // 인수로 전달되는 값의 원본을 참조함.
- 1. 값 전달 방식
- 디폴트 매개변수
- 호출시 매개변수가 적으면 매개변수의 왼쪽부터 차례대로 대입
- function sum($value1, $value2 = 0, $value3 = 0)
- echo sum(1, 2, 3); // 6
echo sum(1, 2); // 3
echo sum(1); // 1
//echo sum(); // 오류가 발생
- echo sum(1, 2, 3); // 6
- function sum($value1 = 0, $value2, $value3 = 0)
- ① echo sum(1, 2, 3); // 6
② echo sum(1, 2); // 3
③ //echo sum(1); // 오류가 발생함.
- ① echo sum(1, 2, 3); // 6
- 가변 길이 인수 목록
- PHP 5.5 이하
- func_num_args(), func_get_arg(), func_get_args() 함수를 사용
- func_get_args() 함수는 sum() 함수가 호출될 때 전달된 인수들을 배열의 형태로 반환
- sum() 함수가 호출될 때 전달되는 인수의 개수는 변동 가능
- function sum()
{
$sum = 0;
foreach(func_get_args() as $n) { // PHP 5.5 이하
$sum += $n;
}
return $sum;
}
- func_num_args(), func_get_arg(), func_get_args() 함수를 사용
- PHP 5.6 이상
- '...' 토큰을 사용
- $num 은 배열이 됨
- function sum(...$num) // PHP 5.6 이상
{
$sum = 0;
foreach($num as $n) {
$sum += $n;
}
return $sum;
}
- '...' 토큰을 사용
- PHP 5.5 이하
- 매개변수의 전달 방식
- 26) 함수의 활용
- 조건 함수(conditional function)
- 특정 조건을 만족할 때만 선언되는 함수
- $makefunc = true;
//func(); // 이 부분은 func() 함수가 선언되기 전이므로, 함수를 호출할 수 없습니다.
if($makefunc) {
function func()
{
echo "이제 함수를 사용할 수 있습니다";
}
func(); // 이 부분은 func() 함수가 선언되었으므로, 함수를 호출할 수 있습니다.
}
- 함수안의 함수(function within function)
- function out()
{
function in()
{
echo "이제 함수를 사용할 수 있습니다";
}
}
① //in(); // 이 부분은 in() 함수가 선언되기 전이므로, 함수를 호출할 수 없습니다.
② out();
③ in(); // 이 부분은 in() 함수가 선언되었으므로, 함수를 호출할 수 있습니다.- 모든 함수는 전역함수
- 외부함수가 호출되어야 내부함수가 선언된다
- function out()
- 재귀 함수
- function factorial($num)
{
if($num > 1) // 1이 될 때까지
return $num * factorial($num - 1); // 1씩 감소시킨 값을 전달하여 자기 자신을 계속 호출함.
else
return 1;
}
echo factorial(4); - 100번 이상의 재귀 호출은 스택의 한계에 도달하여 스크립트가 중단될 수 있음
- function factorial($num)
- 가변 함수
- 변수를 사용하여 함수를 호출
- 함수명을 변수에 대입
{
echo "first() 함수<br><br>";
}
function second($para)
{
echo "second() 함수<br>";
echo "함수 호출 시 전달받은 인수의 값은 {$para}";
}
$func = "first";
$func(); // first() 함수를 호출함.
$func = "second"
$func(20); // second() 함수를 호출함.
- 변수를 사용하여 함수를 호출
- 조건 함수(conditional function)
7. PHP 내장 함수
- 27) 변수 관련 함수
- 티입확인
- gettype($x)
- 타입을 반환
- 실행 속도 느림
- is_xxxxx() 함수 권장
- 실행 속도 느림
- 타입을 반환
- gettype($x)
- 변수의 타입 변경
- settype($x, "string")
- 변수의 타입을 변경
- 변경 성공/실패= true/false 리턴
- 변수의 타입을 변경
- settype($x, "string")
- 변수의 상태 변경
- isset()
- 변수가 선언되고 초기화되어 있는지 검사
- empty()
- 전달받은 변수가 비어있는지를 검사
- !isset($var) | $var==false
- - 정수 0
- - 실수 0.0
- - 문자열 "0"
- - 빈 문자열 ""
- - null
- - false
- - 빈 배열 array()
- - 초기화되지 않은 변수
- 전달받은 변수가 비어있는지를 검사
- isset()
- 특정 타입으로 변경
- $x = "123.56789abc";
echo intval($x); // 123
echo floatval($x); // 123.56789
echo strval($x); // 123.56789abc- intval()
- floatval()
- strval()
- $x = "123.56789abc";
- 티입확인
- 28) 배열 관련 함수
- 배열의 생성
- $arr = array(1, 2, 3, 4, 5);
- 배열 요소의 개수
- count(), sizeof()
- 요소의 개수
- 해당 값이 몇 번 등장하는지
echo "배열 요소의 개수는 ".count($arr)."<br>";
echo "배열 요소의 개수는 ".sizeof($arr)."<br><br>";
$acv = array_count_values($arr);
echo "배열 요소의 값마다 나타난 횟수는 다음과 같습니다.<br>";
foreach($acv as $key => $value) {
echo $key." : ".$value."번<br>";
}- 배열 요소의 개수는 7
배열 요소의 개수는 7
배열 요소의 값마다 나타난 횟수는 다음과 같습니다.
1 : 2번
5 : 1번
7 : 1번
3 : 2번
2 : 1번
- count(), sizeof()
- 배열의 탐색
- 현재 선택된 배열 요소가 어느 요소인지를 가리키는 포인터가 별도로 존재
- 배열 포인터
- current(), pos()
- 배열 포인터가 현재 가리키고 있는 요소를 반환
- next()
- 배열 포인터를 앞으로 하나 이동시킨 후에, 해당 요소를 반환
- prev()
- 배열 포인터를 뒤로 하나 이동시킨 후에, 해당 요소를 반환
- each()
- 배열 포인터가 현재 가리키고 있는 요소의 키와 값을 연관 배열로 반환하고, 배열 포인터를 앞으로 하나 이동
- reset()
- 배열 포인터가 첫 번째 배열 요소를 가리키도록 한 뒤에, 해당 요소의 값을 반환
- end()
- 배열 포인터가 마지막 배열 요소를 가리키도록 한 뒤에, 해당 요소의 값을 반환
- ex
- $arr = array(2, 3, 7, 4, 6);
$element = current($arr); // 배열의 첫 번째 요소를 가리킴.
while($element) { // 배열의 마지막 요소까지
echo $element; // 해당 요소의 값을 출력하고,
$element = next($arr); // 다음 요소를 가리킨 후에 해당 요소를 반환함.
} // 2, 3, 7, 4, 6
$element = end($arr); // 배열의 마지막 요소를 가리킴.
while($element) { // 배열의 첫 번째 요소까지
echo $element; // 해당 요소의 값을 출력하고,
$element = prev($arr); // 이전 요소를 가리킨 후에 해당 요소를 반환함.
} // 6, 4, 7, 3, 2
- $arr = array(2, 3, 7, 4, 6);
- 현재 선택된 배열 요소가 어느 요소인지를 가리키는 포인터가 별도로 존재
- 배열의 정렬
- sort()
- 배열을 정렬하여 새로운배열 반환
- 두 번째 인수로는 배열 요소를 정렬할 기준
//sort($arr); 배열 정렬 -> 1, 2, 15, 21, 121
① sort($arr, SORT_NUMERIC); // 배열 요소를 숫자로 비교함. -> 1, 2, 15, 21, 121
② sort($arr, SORT_STRING); // 배열 요소를 문자열로 비교함. -> 1, 121, 15, 2, 21
- 배열을 정렬하여 새로운배열 반환
- sort()
- 연관 배열의 정렬
- 오름차순
- ksort()
- 키를 기준으로 정렬
- 값을 기준으로 정렬
asort($arr); // 요소의 값을 기준으로 배열 정렬 -> apple, orange, banana
ksort($arr); // 키값을 기준으로 배열 정렬 -> apple, banana, orange
- ksort()
- 내림차순
- rsort(), krsort(), arsort()
- 기타
- array_multisort()
- 여러 배열이나 다차원 배열의 배열 요소를 정렬함.
- natcasesort()
- 대소문자를 구분하지 않는 영문숫자 순(natural order)의 알고리즘으로 배열 요소를 정렬함.
- natsort()
- 영문숫자 순(natural order)의 알고리즘으로 배열 요소를 정렬함.
- usort()
- 사용자가 정의한 비교 함수를 사용하여, 배열 요소의 값을 기준으로 정렬함.
- uksort() 사용자가 정의한 비교 함수를 사용하여, 배열 요소의 키를 기준으로 정렬함.
- uasort() 사용자가 정의한 비교 함수를 사용하여, 인덱스 연관성을 유지한 채 배열 요소를 정렬함.
- array_multisort()
- 오름차순
- 배열 요소의 재배치
- shuffle()
- 섞은 뒤에 무작위로 재배치
- array_reverse()
- 역순으로 변경
- 원본 배열에는 영향 X
- 역순으로 변경
- shuffle()
- 배열의 생성
- 29) 문자열 관련 함수
- 문자열의 길이
- strlen()
- 한글이 포함되면, 문자열의 길이가 아닌 문자열의 총 바이트(byte) 수를 반환
- mb_strlen()
- 한글이 포함된 문자열길이
- 두 번째 인수로 인코딩 방식
- 두번재 인수 없으면 내부 인코딩 방식을 사용
- 두 번째 인수로 인코딩 방식
- 한글이 포함된 문자열길이
- strlen()
- 문자열 비교
- strcmp()
- 앞쪽인수가 크면 양수, 작으면 음수, 같으면 0
- 대소문자를 구분
- 대소문자를 구분 안함
echo strcasecmp("abc", "ABC")."<br><br>"; // 0
echo strcmp("2", "10")."<br>"; // 양수 1
echo strnatcmp("2", "10"); // 음수 -1 - 앞쪽인수가 크면 양수, 작으면 음수, 같으면 0
- strcmp()
- 특정 문자열 검색
- strstr()
- 일치하는 부분을 포함한 이후의 모든 문자를 같이 반환
- 뒤에서 일치하는 부분
echo strrchr("ABCabcDEFabc", "abc")"; // abc
echo stristr("ABCabcDEFabc", "abc"); // ABCabcDEFabc
- strstr()
- 특정 문자열 위치 찾기
- strpos()
- 일치하는 부분의 시작 인덱스를 반환
- strrpos()
- 뒤에서 일치하는 부분의 시작 인덱스를 반환
- 인덱스는 언제나 0부터
- strpos()
- 문자열 추출
- substr()
- echo substr($str, -3); // 끝에서부터 세 글자 출력
echo substr($str, 1, 5); // 두 번째 문자부터 다섯 글자 출력
- echo substr($str, -3); // 끝에서부터 세 글자 출력
- substr()
- 문자열 대소문자 바꾸기
- strtolower()
- strtoupper()
- ucfirst()
- 첫 번째 문자만을 대문자로
- ucwords()
- 단어별로 첫 번째 문자만을 대문자로
- 문자열 합치고 나누기
- explode()
- 특정 문자로 문자열을 나누어서 하나의 배열로 반환
- implode() 함수와 join()
- 전달받은 배열의 각 요소를 특정 문자를 사용하여 하나로 합쳐친 문자열로 반환
- strtok()
- 특정 문자를 기준으로 토큰화
- 한 번에 하나씩만을 토큰화
- 특정 문자를 기준으로 토큰화
- + - ex
- $str = "hello, beautiful, world!";
$array = explode(',', $str); // ','를 기준으로 문자열을 나눔.
echo $array[0]; // hello
echo $array[1]; // beautiful
echo $array[2]; // world!
$str2 = implode('!', $array); // '!'를 기준으로 문자열을 결합함.
echo $str2; // hello! beautiful! world!
$token = strtok($str2, '!'); // '!'를 기준으로 토큰화
echo $token; // hello
while($token != ""){ // 문자열이 끝날 때까지
$token = strtok('!'); // '!'를 기준으로 토근화하고 출력함.
echo $token; // beautiful, world
}
- $str = "hello, beautiful, world!";
- explode()
- 문자열 대체
- str_replace()
- substr_replace()
- 세 번째 인수
- 교체를 시작할 부분의 인덱스
- 세 번째 인수
- ex
- $str = "hello, world!";
echo str_replace('o', '*', $str); // 문자열의 모든 'o'를 '*'로 대체함.
echo substr_replace($str, '*', 2); // 세 번째 문자부터 끝까지를 '*'로 대체함.
echo substr_replace($str, '*', -2); // 끝에서 두 번째 문자부터 끝까지를 '*'로 대체함.
echo substr_replace($str, '*', 2, 4); // 세 번째 문자부터 네 글자를 '*'로 대체함.
echo substr_replace($str, '*', 2, -4); // 세 번째 문자부터 끝에서 다섯 번째 문자까지를 '*'로 대체함.
echo substr_replace($str, '*', 2, 0); // 두 번째 문자 뒤에 '*'을 삽입함.
- $str = "hello, world!";
- 문자열 다듬기
- ltrim()
- rtrim()
- chop()
- trim()
- chop()
- rtrim()
- 제거하는 문자
- - 띄어쓰기 " "
- - 탭 문자 "\t"
- - 줄 바꿈 문자 "\n", "\r"
- - 널 문자 "\0"
- - 수직 탭 문자 "\x0B"
- ltrim()
- 문자열의 길이
- 30) 날짜와 시간 관련 함수
- 날짜와 시간의 형식화
- + - date()
- d
- 날짜를 두 자리 숫자로 표현함. 00부터 31
- D
- 요일을 세 개의 문자로 표현함. Mon에서 Sun
- j
- 날짜를 숫자로 표현함. 1부터 31
- l(소문자 'L') 요일을 완전한 문자열로 표현함. Sunday부터 Saturday
- N 요일을 ISO-8601 숫자로 표현함. (PHP 5.1.0에서 추가됨) 1(월요일)부터 7(일요일)
- S 날짜 뒤에 영어 서수를 붙임. st, nd, rd, th, j
- w 요일을 숫자로 표현함. 0(일요일)부터 6(토요일)
- z 일 년 중 몇 번째 날인지를 숫자로 표현함. 0부터 365
- W 일 년 중 몇 번째 주인지를 숫자로 표현함. (PHP 4.1.0에서 추가됨) 42(그 해의 42번째 주)
- F 월을 완전한 문자열로 표현함. January에서 December
- m 월을 두 자리 숫자로 표현함. 01부터 12
- M 월의 축약형을 세 개의 문자로 표현함. Jan에서 Dec
- n 월을 숫자로 표현함. 1부터 12
- t 해당 월의 총일 수를 숫자로 표현함. 28부터 31
- L 윤년 여부를 표현함. 윤년엔 1, 그 외엔 0
- o
- ISO-8601 연도값으로 Y값과 같은 값을 나타냄.
- 1999나 2003
- 하지만, W값이 이전 해나 다음 해에 포함되면, 연도를 이 값으로 사용함.
- (PHP 5.1.0에서 추가됨)
- ISO-8601 연도값으로 Y값과 같은 값을 나타냄.
- Y 연도를 완전한 네 자리 숫자로 표현함. 1999나 2003
- y 연도를 두 자리 숫자로 표현함. 99나 03
- a 오전과 오후의 소문자를 표현함. am 또는 pm
- A 오전과 오후의 대문자를 표현함. AM 또는 PM
- B 견본 인터넷 시간을 표현함. 000에서 999
- g 12시간 형식으로 시간을 표현함. 1부터 12
- G 24시간 형식으로 시간을 표현함. 0부터 23
- h 12시간 형식 시간을 두 자리 숫자로 표현함. 01부터 12
- H 24시간 형식 시간을 두 자리 숫자로 표현함. 00부터 23
- i 분을 두 자리 숫자로 표현함. 00부터 59
- s 초를 두 자리 숫자로 표현함. 00부터 59
- u 초를 마이크로초로 표현함. (PHP 5.2.2에서 추가됨) 54321
- e 시간대(timezone) 식별자를 표현함. (PHP 5.1.0에서 추가됨) UTC, GMT
- I(대문자 i) 서머타임 적용 여부를 표현함. 서머타임이면 1, 아니면 0
- O 그리니치 시각(GMT)과 시차를 표현함. +0200
- P 시와 분 사이에 콜론이 들어가는 그리니치 시각(GMT)과 시차를 표현함. +02:00
- T 시간대(timezone)를 나타내는 축약어임. EST, MDT
- Z
- 시간대(timezone)를 나타내는 오프셋 초를 표현함.
- -43200부터 50400
- UTC 서쪽은 항상 음수, UTC 동쪽은 항상 양수로 표현됨.
- 시간대(timezone)를 나타내는 오프셋 초를 표현함.
- c ISO-8601 형식의 날짜를 표현함. (PHP 5에서 추가됨) 2004-02-12T15:19:21+00:00
- r RFC 2822 형식의 날짜를 표현함. Thu, 21 Dec 2000 16:01:07 +0200
- U 타임스탬프를 표현함. time() 참조
- d
- echo date("Y/m/d h:i:s");
- + - date()
- 타임스탬프
- mktime()
- echo mktime(0, 0, 0, 1, 1, 2000)."<br>"; // 2000년 1월 1일을 나타내는 타임스탬프
- time()
- mktime()
- 날짜와 시간 정보
- getdate()
- 타임스탬프에 해당하는 정보를 연관 배열의 형태로 반환
- + - getdate() 연관 배열의 키
- seconds
- 해당 타임스탬프에 해당하는 초를 숫자로 저장함.
- minutes
- 해당 타임스탬프에 해당하는 분을 숫자로 저장함.
- hours
- 해당 타임스탬프에 해당하는 시간을 숫자로 저장함.
- mday 해당 타임스탬프에 해당하는 일을 숫자로 저장함.
- wday 해당 타임스탬프에 해당하는 요일을 숫자로 저장함.
- mon 해당 타임스탬프에 해당하는 월을 숫자로 저장함.
- year 해당 타임스탬프에 해당하는 연도를 네 자리의 숫자로 저장함.
- yday 해당 타임스탬프에 해당하는 일자가 일 년 중 몇 번째 날인지를 숫자로 저장함.
- weekday 해당 타임스탬프에 해당하는 요일을 완전한 문자열로 저장함.
- month 해당 타임스탬프에 해당하는 월을 완전한 문자열로 저장함.
- 0 타임스탬프값을 저장함.
- getdate()
- 타임 존
- date_default_timezone_set()
- echo date_default_timezone_get()." : ".date("h:i:s")."<br>"; // 현재 타임 존과 시간을 받아옴.
date_default_timezone_set("America/Los_Angeles"); // 타임 존을 변경함.
echo date_default_timezone_get()." : ".date("h:i:s");
- echo date_default_timezone_get()." : ".date("h:i:s")."<br>"; // 현재 타임 존과 시간을 받아옴.
- date_default_timezone_get()
- PHP 5.1.0부터
- date_default_timezone_set()
- 날짜의 유효성 검사
- checkdate()
- 전달받은 날짜의 유효성을 검사
- 유효하다면 true를 반환하고, 유효하지 않다면 false
- 전달받은 날짜의 유효성을 검사
- checkdate()
- 날짜와 시간의 형식화
- 31) 수학 관련 함수
- 최댓값과 최솟값
- 올림과 내림
- 지수와 로그
- 삼각 함수
- 기타 함수
8. 정규 표현식
- 32) 정규 표현식의 개념
- 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴
- 1. POSIX
- POSIX 정규 표현식은 배우기가 쉽고 실행 속도가 빠른 편
- 2. PCRE(Perl-Compatible Regular Expression)
- POSIX 정규 표현식을 확장하였기에 더 강력하고 유연하게 동작
- 정규 표현식 리터럴
- /검색패턴/플래그
- preg_match() 함수
- preg_match($pattern, $subject [,$matches]);
- 일치하는 패턴을 검색
- 첫 번째 인수로 전달받은 정규 표현식에 해당하는 패턴을 두 번째 인수로 전달받은 문자열에서 검색
- 패턴이 존재하면 1을 반환하고, 존재하지 않으면 0을 반환
- 패턴이 검색되면, 더는 검색하지 않고 검색을 중단
- 단순한 패턴 검색
- 예제
- /abc/
- 예제
- 플래그
- i 검색 패턴을 비교할 때 대소문자를 구분하지 않도록 설정함.
- g 검색 패턴을 비교할 때 일치하는 모든 부분을 선택하도록 설정함.
- m 검색 패턴을 비교할 때 여러 줄의 입력 문자열을 그 상태 그대로 여러 줄로 비교하도록 설정함.
- y 대상 문자열의 현재 위치부터 비교를 시작하도록 설정함.
- u 대상 문자열이 UTF-8로 인코딩된 것으로 설정함.
- 33) 정규 표현식의 기초
- 특수 문자
- 복잡한 조건을 사용하려면 특수 문자를 사용
- .
- 줄 바꿈 문자(\n)를 제외한 임의의 한 문자를 의미함.
- ?
- 해당 문자 패턴이 0번 또는 1번만 반복됨.
- *
- 해당 문자 패턴이 0번 이상 반복됨.
- + 해당 문자 패턴이 1번 이상 반복됨.
- {...} 반복되는 횟수를 지정함.
- ^ 문자열의 처음을 의미함.
- $ 문자열의 끝을 의미함.
- \ 특수문자를 무시함.
- | 선택을 의미함. (OR)
- (...) 그룹화의 시작과 끝을 의미함.
- + - ex
- /.ap/ // 문자열 "ap" 앞에 임의의 한 문자가 등장하는 문자열 : aap, bap, cap, @ap, #ap, ...
/a?b/ // b 앞에 a가 0번 또는 1번 등장하는 문자열 : b, ab
/a*b/ // b 앞에 a가 0번 이상 등장하는 문자열 : b, ab, aab, aaab, ...
/a+b/ // b 앞에 a가 1번 이상 등장하는 문자열 : ab, aab, aaab, aaaab, ...
/a{2,4}b/ // b 앞에 a가 2번 이상 4번 이하 등장하는 문자열 : aab, aaab, aaaab
/a{2,}b/ // b 앞에 a가 2번 이상 등장하는 문자열 : aab, aaab, aaaab, aaaaab, ...
/^abc/ // abc로 시작하는 문자열 : abc, abcd, abcdef, ...
/abc$/ // abc로 끝나는 문자열 : abc, zabc, xyzabc, ...
/abc|def|ghi/ // abc, def 또는 ghi 중 하나의 문자열
- /.ap/ // 문자열 "ap" 앞에 임의의 한 문자가 등장하는 문자열 : aap, bap, cap, @ap, #ap, ...
- 양화사
- 특수 문자로 수량을 나타내는 다양한 양화사를 사용
- - '*'는 바로 앞의 문자가 0번 이상 나타날 경우를 검색({0, }와 같음)
- - '+'는 바로 앞의 문자가 1번 이상 나타날 경우를 검색({1, }과 같음)
- - '?'는 바로 앞의 문자가 0번 또는 1번만 나타날 경우를 검색({0,1}과 같음)
- - '{n,m}'은 바로 앞의 문자가 반복되는 횟수를 지정
- 바로 앞의 문자가 최소 n번이상 최대 m번이하로 나타날 경우를 검색
- + - ex
- $subject = "PHP is cooooool!";
// 문자 'l' 바로 앞에 문자 'o'가 0 또는 1번 나타나는 경우를 검색함.
preg_match_all('/o?l/', $subject, $match_01);
var_dump($match_01);
echo "<br><br>";
// 문자 'l' 바로 앞에 문자 'o'가 0번 이상 나타나는 경우를 검색함.
preg_match_all('/o*l/', $subject, $match_02);
var_dump($match_02);
echo "<br><br>";
// 문자 'l' 바로 앞에 문자 'o'가 1번 이상 나타나는 경우를 검색함.
preg_match_all('/o+l/', $subject, $match_03);
var_dump($match_03);
echo "<br><br>";
// 영문 소문자가 1번 이상 나타나는 경우를 검색함.
// 즉, 영문 소문자만으로 이루어진 부분 문자열을 검색함.
preg_match_all('/[a-z]+/', $subject, $match_04);
var_dump($match_04);- array(1) { [0]=> array(1) { [0]=> string(2) "ol" } }
array(1) { [0]=> array(1) { [0]=> string(7) "ooooool" } }
array(1) { [0]=> array(1) { [0]=> string(7) "ooooool" } }
array(1) { [0]=> array(2) { [0]=> string(2) "is" [1]=> string(8) "cooooool" } }
// 문자 'l' 바로 앞에 문자 'o'가 최소 2번 이상 최대 4번 이하로 나타나는 경우를 검색함.
preg_match_all('/o{2,4}l/', $subject, $match_01);
var_dump($match_01);
echo "<br><br>";
// 문자 'l' 바로 앞에 문자 'o'가 최소 2번 이상 나타나는 경우를 검색함.
preg_match_all('/o{2,}l/', $subject, $match_02);
var_dump($match_02);
echo "<br><br>";
// 문자 'l' 바로 앞에 문자 'o'가 정확히 6번 나타나는 경우를 검색함.
preg_match_all('/o{6}l/', $subject, $match_03);
var_dump($match_03);- array(1) { [0]=> array(1) { [0]=> string(5) "ooool" } }
array(1) { [0]=> array(1) { [0]=> string(7) "ooooool" } }
array(1) { [0]=> array(1) { [0]=> string(7) "ooooool" } }
- array(1) { [0]=> array(1) { [0]=> string(2) "ol" } }
- $subject = "PHP is cooooool!";
- 위치 문자
- 패턴을 검색할 단어의 위치까지 지정
- - '^'는 단어의 맨 앞에 위치한 해당 패턴만을 검색
- // 단어가 문자열 "abc"로 시작하는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함.
$match_01 = preg_replace('/^abc/', 'ABC',$subject);
- // 단어가 문자열 "abc"로 시작하는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함.
- - '$'는 단어의 맨 뒤에 위치한 해당 패턴만을 검색
- // 단어가 문자열 "abc"로 끝나는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함.
$match_02 = preg_replace('/abc$/', 'ABC', $subject);
- // 단어가 문자열 "abc"로 끝나는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함.
- 선택 문자
- 특수문자 '|'를 사용하여 여러 개의 검색 패턴을 사용
- // 문자열 'abc' 또는 'def' 또는 'jkl'만을 검색함.
// 즉, 위의 세 문자열 중 어느 하나에만 일치해도 검색됨.
preg_match_all('/abc|def|jkl/', $subject, $match);
- // 문자열 'abc' 또는 'def' 또는 'jkl'만을 검색함.
- 특수문자 '|'를 사용하여 여러 개의 검색 패턴을 사용
- 문자 클래스
- 범위에 해당하는 한 문자만을 선택
- 꺾쇠 괄호[ ]를 사용
- /[0-3]/ // 0부터 3까지의 숫자에 해당하는 한 문자
/[a-z]/ // 영문 소문자에 해당하는 한 문자
/[0-9a-zA-Z]/ // 숫자 또는 영문 대소문자에 해당하는 한 문자 - // 문자열 "ap" 앞에 영문자 한 문자가 나타나는 경우를 검색함.
preg_match('/[a-zA-Z]ap/', $subject, $match_02);
- /[0-3]/ // 0부터 3까지의 숫자에 해당하는 한 문자
- POSIX 문자 클래스
- 종류
- [:alnum:]
- 영문자와 숫자에 포함되는지를 확인함.
- [:alpha:]
- 영문 대소문자에 포함되는지를 확인함.
- [:lower:]
- 영문 소문자에 포함되는지를 확인함.
- [:upper:] 영문 대문자에 포함되는지를 확인함.
- [:digit:] 십진법 숫자에 포함되는지를 확인함.
- [:xdigit] 16진법 숫자나 문자에 포함되는지를 확인함.
- [:punct:] 구두점에 포함되는지를 확인함.
- [:blank:] 탭과 띄어쓰기에 포함되는지를 확인함.
- [:space:] 공백 문자에 포함되는지를 확인함.
- [:cntrl:] 제어 문자에 포함되는지를 확인함.
- [:print:] 출력할 수 있는 문자에 포함되는지를 확인함.
- [:graph:] 띄어쓰기를 제외한 모든 출력할 수 있는 문자에 포함되는지를 확인함.
- POSIX 정규 표현식에서만 사용할 수 있는 문자 클래스
// a1, a2, ..., b1, b2, ... - [:alnum:]
- 종류
- 특수 문자
- 34) 정규 표현식의 활용
- 데이터가 해당 형식에 맞는지를 손쉽게 확인
- 전화번호 확인
- ① /^[[:digit:]]{2}\-[[:digit:]]{4}\-[[:digit:]]{4}/ // 02-1234-5678, ...
② /^[[:digit:]]{2,3}\-[[:digit:]]{3,4}\-[[:digit:]]{4}/ // 02-1234-5678, 031-123-5678, 010-1234-5678, ...- \- => - 로 인식
- '\'문자 바로 뒤에 특수 문자가 나오면, 해당 문자는 일반 문자로 인식
- ① /^[[:digit:]]{2}\-[[:digit:]]{4}\-[[:digit:]]{4}/ // 02-1234-5678, ...
- 이메일 주소 확인
- ① /([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)\.([0-9a-zA-Z_-]+)/ // help@abcd.com, ...
② /([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)(\.[0-9a-zA-Z_-]+){1,2}/ // help@abcd.com, help@abcd.co.kr, ...- [0-9a-zA-Z_-]+
- 숫자나 영문 대소문자, 언더스코어(_) 또는 '-'기호를 포함한 문자가 1번 이상 반복되는 문자열
- ①
- '@'문자와 '.'문자를 각각 하나씩만 포함하는 이메일 주소만을 검색
- ②
- '.'문자를 2개 이상 포함하는 이메일 주소 검색
- [0-9a-zA-Z_-]+
- 설명
- ① /([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)\.([0-9a-zA-Z_-]+)/ // help@abcd.com, ...
- 한글 확인
- ① /[가-힣]/ // 한글 소리 마디(초성 19개, 중성 21개, 종성 28개로 이루어지는 총 11,172개의 한글 문자)
② /[\\x{ac00}-\\x{d7af}]/u // 한글 소리 마디의 유니코드 범위 목록값②번 정규 표현식처럼 'u'플래그를 추가하여 해당 정규 표현식 문자열을 UTF-8로 인코딩된 것처럼 취급- $text = "123가나abc다라";
$pattern = "/[\\x{ac00}-\\x{d7af}]+/u"; // 한글 소리 마디(UTF-8)
$arr = preg_match_all('/./u', $text, $matches); // 줄 바꿈 문자(\n)를 제외한 임의의 한 문자씩 검색함.
echo preg_replace($pattern, '', $text); // 해당 문자가 한글이면, 빈 문자열로 대체함.
- $text = "123가나abc다라";
- 해당 문자열에서 한글만을 제거하는 예제
- ①번 정규 표현식은 언어 설정이 한글이 아닌 시스템에서는 동작이 안 될 수도 있습니다.
- ① /[가-힣]/ // 한글 소리 마디(초성 19개, 중성 21개, 종성 28개로 이루어지는 총 11,172개의 한글 문자)
9. 클래스
- 35) 클래스의 기초
- 프로퍼티(property)와 메소드(method)로 구현
- 객체 지향 프로그래밍(OOP, Object-Oriented Programming)
- 모든 데이터를 객체(object)로 취급하며, 객체가 바로 프로그래밍의 중심
- 코드의 관리가 쉬워지고, 적은 노력으로도 손쉽게 코드를 변경, 유지 관리
- 36) 클래스의 구조
- class 클래스이름
{
클래스의 프로퍼티과 메소드의 정의;
} - 생성자
- 객체가 생성될 때마다 자동으로 호출
- 생성자의 이름은 __construct()로 정해져 있음
- class 클래스이름
{
function __construct(매개변수1, 매개변수2, ...)
{
생성자가 호출될 때 실행될 코드;
}
}
- 객체가 생성될 때마다 자동으로 호출
- 소멸자
- 삭제할 때 호출
- 이름은 __desturct()
- class 클래스이름
{
function __desturct()
{
소멸자가 호출될 때 실행될 코드;
}
}
- 삭제할 때 호출
- class 클래스이름
- 37) 클래스의 사용
- new 키워드를 사용
- $객체이름 = new 클래스이름(인수1, 인수2, ...);
- 클래스 멤버에 접근
- 화살표 기호(->)를 사용
- $객체이름->프로퍼티이름;
$객체이름->메소드이름; - $this->프로퍼티이름;
- 객체 내부에서 해당 인스턴스의 프로퍼티에 접근하고 싶을 때는 특별한 변수인 $this를 사용
- 접근 제어
- 변수나 function 앞에 키워드를 붙인다
- 키워드
- public
- private
- protected
- + - ex
- class ClassName
{
public $publicVar;
private $privateVar;
protected $protectedVar;
public function __construct()
{
$this->publicVar = "public property<br>";
$this->privateVar = "private property<br>";
$this->protectedVar = "protected property<br>";
}
public function publicMethod()
{
echo "public method()<br>";
}
private function privateMethod()
{
echo "private method()<br>";
}
protected function protectedMethod()
{
echo "protected method()<br>";
}
}
$object = new ClassName();
echo $object->publicVar; // 접근 가능
//echo $object->protectedVar; // 접근 불가능
//echo $object->privateVar; // 접근 불가능
$object->publicMethod(); // 호출 가능
//$object->protectedMethod(); // 호출 불가능
//$object->privateMethod(); // 호출 불가능
- class ClassName
- new 키워드를 사용
10. OOP
- 38) 상속
- extend 키워드를 사용
- class B extends A
{
B 클래스만의 프로퍼티와 메소드;
}
- class B extends A
- private 멤버를 제외한 모든 프로퍼티와 메소드를 상속
- 오버라이딩
- 이미 정의된 메소드를 같은 이름의 메소드로 다시 정의
- 자식 클래스에서 상속받은 메소드를 오버라이딩
- extend 키워드를 사용
- 39) 정적 멤버
- static 키워드
- 프로퍼티
- 인스턴스를 생성하지 않아도 접근
- 인스턴스화된 객체에서는 접근할 수 없음
- 인스턴스를 생성하지 않아도 접근
- 메소드
- 인스턴스화된 객체에서도 접근 가능
- $this 의사 변수를 사용할 수 없습니다.
- ex
- 클래스 StaticMember 선언
echo StaticMember::showProperty(); // 호출 가능
echo StaticMember::$staticProperty; // 접근 가능
$var = new StaticMember(); // 인스턴스 생성
echo $var->showProperty(); // 호출 가능
//echo $var->$staticProperty; // 접근 불가능
- 클래스 StaticMember 선언
- 프로퍼티
- 범위 지정 연산자(::)
- 클래스의 정의 내에서 프로퍼티나 메소드를 사용하고 싶을 때는 범위 지정 연산자(::)를 사용
- 클래스의 상수, 정적(static) 멤버 또는 재정의된 멤버에 접근
- echo OtherClassName::CONSTANT;
- 클래스의 정의 내에서 특정 프로퍼티나 메소드에 접근
- 1. self : 자기 자신에 접근할 때
- echo self::$property;
- 2. parent : 부모 클래스에 접근할 때
- echo parent::CONSTANT;
- 1. self : 자기 자신에 접근할 때
- static 키워드
- 40) 인터페이스
- 추상 메소드
- 오버라이딩해야만 사용할 수 있는 메소드
- 선언부만이 존재하며, 구현부는 작성 X
- abstract 접근제어자 function 메소드이름();
- 추상 클래스
- 하나 이상의 추상 메소드를 포함하는 클래스
- 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의 하도록 함
- 인스턴스를 생성 X
- 상속을 통해 자식 클래스 만들어 사용
- 인터페이스
- 인터페이스 클래스
- 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할
- 일종의 추상 클래스
- 내부의 모든 추상 메소드는 public
- 문법
- interface 인터페이스이름
{
구현할 메소드;
}
- interface 인터페이스이름
- 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할
- 구현하는 클래스
- implements 키워드를 사용하여 구현
- 인터페이스(interface)도 클래스처럼 extends 키워드를 사용하여 상속 가능
- + - ex
- interface Transport // 인터페이스의 정의
{
public function move(); // 구현할 메소드
public function stop(); // 구현할 메소드
}
interface Overland extends Transport // Transport 인터페이스를 상속받는 Overland 인터페이스
{
public function highpass(); // 구현할 메소드
}
class Car implements Overload // Overland 인터페이스를 구현하는 Car 클래스
{
function move() // 메소드 구현
{
...
}
function stop() // 메소드 구현
{
...
}
function highpass() // 메소드 구현
{
...
}
}
- interface Transport // 인터페이스의 정의
- 인터페이스 클래스
- 추상 메소드
- 41) 오버로딩
- 다형성
- 하나의 프로퍼티가 여러 가지 상태를 가질 수 있는 것
- 오버로딩과 지연 정적 바인딩(late static bindings)을 통해 구현
- 오버로딩
- 멤버(프로퍼티, 메소드)를 동적으로 '생성한다'는 의미
- 동적으로 생성된 멤버는 매직 메소드(magic method)를 통해 처리
- 오버로딩되는 메소드는 반드시 public으로 정의
- 멤버(프로퍼티, 메소드)를 동적으로 '생성한다'는 의미
- 프로퍼티 오버로딩
- 접근불가 프로퍼티오버로딩
- 동적 생성된 멤버나 접근 불가 프로퍼티를 사용하기 위해 매직 메소드 구현 필요
- 접근불가 프로퍼티
- 현재 영역에서는 정의되어 있지 않거나, 접근 제어로 인해 보이지 않는 프로퍼티
- 매직 메소드
- 특수한 기능을 위해 미리 정의한 메소드
- 이름은 두 개의 언더스코어(__)로 시작
- 메소드 이름과 매개변수, 반환 타입, 호출의 타이밍만이 정해져 있으며, 그 내용은 사용자가 직접 작성하여 사용
- 종류
- 1. public void __set(string $name, mixed $value)
- 접근 불가 프로퍼티의 값을 설정할 때 호출
- 2. public mixed __get(string $name)
- 접근 불가 프로퍼티의 값을 읽을 때 호출
- 3. public bool __isset(string $name)
- 접근 불가 프로퍼티에 대해 isset() 함수나 empty() 함수가 호출될 때 호출
- 4. public bool __unset(string $name)
- 접근 불가 프로퍼티에 대해 unset() 함수가 호출될 때 호출
- 1. public void __set(string $name, mixed $value)
- 특수한 기능을 위해 미리 정의한 메소드
- + - ex
- class PropertyOverloading
{
private $data = array(); // 오버로딩된 변수가 저장될 배열 생성
public $declared = 10; // public으로 선언된 프로퍼티
private $hidden = 20; // private로 선언된 프로퍼티
public function __set($name, $value)
{
echo "$name 프로퍼티를 {$value}의 값으로 생성";
$this->data[$name] = $value;
}
public function __get($name)
{
echo "$name 프로퍼티의 값을 읽습니다!<br>";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
} else {
return null;
}
}
public function __isset($name)
{
echo "$name 프로퍼티가 설정되어 있는지 확인<br>";
return isset($this->data[$name]);
}
public function __unset($name)
{
echo "$name 프로퍼티를 해지";
unset($this->data[$name]);
}
}
$obj = new PropertyOverloading(); // PropertyOverloading 객체 생성
$obj->prop = 1; // ①동적 프로퍼티 생성
echo "<br><br>";
echo $obj->prop; // ②동적 프로퍼티에 접근
echo "<br><br>";
var_dump(isset($obj->prop)); // ③동적 프로퍼티로 isset() 함수 호출
echo "<br><br>";
unset($obj->prop); // ④동적 프로퍼티로 unset() 함수 호출
echo "<br><br>";
var_dump(isset($obj->prop)); // ⑤동적 프로퍼티로 isset() 함수 호출
echo "<br><br>";
echo $obj->declared; // ⑥선언된 프로퍼티는 오버로딩을 사용하지 않음.
echo "<br><br>";
echo $obj->hidden; // ⑦private로 선언된 프로퍼티는 클래스 외부에서 접근할 수 없으므로, 오버로딩을 사용- ①번 라인에서는 동적으로 프로퍼티를 생성
②번 라인에서는 그 값에 접근
③과 ⑤번 라인에서는 생성된 동적 프로퍼티를 isset() 함수에 인수로 전달
④번 라인에서는 unset() 함수에 인수로 전달
①번부터 ⑤번 라인까지의 모든 동작은 앞서 구현한 네 가지 메소드가 상황에 맞게 자동 호출됨
⑥번 라인과 같이 일반적인 방법으로 선언된 프로퍼티에 접근할 때는 __get() 메소드를 호출 않함
⑦번 라인처럼 private로 선언된 프로퍼티는 클래스 외부에서는 접근할 수 없으므로, __get() 메소드 호출
- ①번 라인에서는 동적으로 프로퍼티를 생성
- class PropertyOverloading
- 접근불가 프로퍼티오버로딩
- 메소드 오버로딩
- 접근불가 메소드(inaccessible method)를 오버로딩 위해 매직 메소드 구현 필요
- 매직 메소드
- 1. public mixed __call(string $name, array $arguments)
- 클래스 영역에서 접근 불가 메소드를 호출할 때 호출
- 2. public static mixed __callStatic(string $name, array $arguments)
- 정적(static) 영역에서 접근 불가 메소드를 호출할 때 호출
- 1. public mixed __call(string $name, array $arguments)
- ex
- class MethodOverloading
{
public function __call($name, $arguments)
{
echo join(", ", $arguments)."에서 접근 불가 메소드를 호출";
}
public static function __callStatic($name, $arguments)
{
echo join(", ", $arguments)."에서 접근 불가 메소드를 호출";
}
}
$obj = new MethodOverloading(); // MethodOverloading 객체 생성
$obj->testMethod("클래스 영역"); // ①클래스 영역에서 접근 불가 메소드 호출
echo "<br><br>";
MethodOverloading::testMethod("정적 영역");// ②정적 영역에서 접근 불가 메소드 호출- 클래스 영역에서 접근 불가 메소드를 호출
정적 영역에서 접근 불가 메소드를 호출 - ①번 라인에서는 동적으로 testMethod() 메소드를 생성하고, 바로 그 값에 접근
- __call() 자동 호출
- ②번 라인에서는 MethodOverloading 클래스의 정적 영역에서 동적 메소드에 접근
- __callStatic() 자동 호출
- 클래스 영역에서 접근 불가 메소드를 호출
- class MethodOverloading
- 다형성
- 42) 늦은 정적 바인딩
- 바인딩
- 프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는 행위
- 함수를 호출하는 부분에서 실제 함수가 위치한 메모리를 연결하는 것 등
- 1. 정적 바인딩(static binding) : 실행 시간 전에 일어나고, 실행 시간에는 변하지 않은 상태로 유지되는 바인딩임.
- 2. 동적 바인딩(dynamic binding) : 실행 시간에 이루어지거나 실행 시간에 변경되는 바인딩임.
- 늦은 바인딩(late binding)
- PHP에서는 정적 바인딩과 동적 바인딩의 중간 정도 수준인 늦은 정적 바인딩(LSB)을 제공
- 늦은 정적 바인딩
(late static bindings,
LSB)- PHP 5.3.0부터
- static 키워드와 함께 범위 지정 연산자(::)를 사용하여 수행
- 오버라이드된 메서드에서 정확한 클래스 이름을 참조할 수 있도록 해줌
- class ParentClass {
public static function whoAmI() {
echo static::class; //늦은바인딩 사용대상
}
}
class ChildClass extends ParentClass {
}
ChildClass::whoAmI(); // 출력: ChildClass - static::
- PHP 5.3.0부터
- 바인딩
11. PHP Form
- 43) Form 처리
- <form action="request.php" method="post">
이름 : <input type="text" name="name"><br>
이메일 : <input type="text" name="email"><br>
<input type="submit">
</form>- action 속성값
- form 요소를 처리할 서버의 PHP 스크립트 파일 주소
- 전송한 데이터를 처리하는 PHP 스크립트
- $name = $_POST["name"];
$email = $_POST["email"];
echo $name."님의 이메일 주소는 ".$email."";
- $name = $_POST["name"];
- 1. GET 방식
- 주소에 데이터(data)를 추가하여 전달
- 보안상 취약점이 존재
- 브라우저에 의해 캐시되어(cached) 저장
- 쿼리 문자열(query string)에 포함되어 전송되므로, 길이의 제한
- 주소에 데이터(data)를 추가하여 전달
- 2. POST 방식
- 데이터(data)를 별도로 첨부하여 전달
- 브라우저에 의해 캐시되지 않으므로, 브라우저 히스토리에도 남지 않음
- 쿼리 문자열과는 별도로 전송
- 길이 제한 없으며, GET 방식보다 보안성이 높음
- 미리 선언된 전역 변수인 슈퍼 글로벌 배열($_GET, $_POST)을 사용하므로, 어디에서든 제약 없이 접근
- PHP 4.1.0부터
- action 속성값
- <form action="request.php" method="post">
- 44) Form 검증
- <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
이름 : <input type="text" name="name">
성별 :
<input type="radio" name="gender" value="female">여자
<input type="radio" name="gender" value="male">남자
이메일 : <input type="text" name="email">
홈페이지 : <input type="text" name="website">
관심 있는 분야 :
<input type="checkbox" name="favtopic[]" value="movie"> 영화
<input type="checkbox" name="favtopic[]" value="music"> 음악
<input type="checkbox" name="favtopic[]" value="game"> 게임
<input type="checkbox" name="favtopic[]" value="coding"> 코딩
기타 : <textarea name="comment"></textarea>
<input type="submit" value="전송">
</form>- <?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>
- form 요소의 action 속성값으로 사용
- $_SERVER
- PHP에서 제공하는 슈퍼 글로벌로 인덱스
- "PHP_SELF"를 사용하면, 현재 실행 중인 PHP 스크립트의 파일 이름을 반환
- PHP에서 제공하는 슈퍼 글로벌로 인덱스
- htmlspecialchars()
- 인수로 전달받은 문자열에 포함된 특수 문자들을 HTML 엔티티로 변환
- 입력 문자열에 사용자가 안 좋은 의도로 HTML 코드를 삽입하는 것을 막을 수 있음
- if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = $_POST["name"];
$gender = $_POST["gender"];
$email = $_POST["email"];
$website = $_POST["website"];
$favtopic = $_POST["favtopic"];
$comment = $_POST["comment"];
}- POST 방식의 HTTP 요청에서만 동작
- <?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>
- <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
- 45) Form 필수 입력 검증
- if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 이름에 대한 필수 입력 검증
if (empty($_POST["name"])) {
$nameMsg = "이름을 입력해 주세요!";
} else {
$name = $_POST["name"];
}
// 성별에 대한 필수 입력 검증
① if (!isset($_POST["gender"]) || $_POST["gender"]==false) {
$genderMsg = "성별을 선택해 주세요!";
} else {
$gender = $_POST["gender"];
}
$email = $_POST["email"];
$website = $_POST["website"];
// 관심 있는 분야에 대한 필수 입력 검증
if (empty($_POST["favtopic"])) {
$favtopicMsg = "하나 이상 골라주세요!";
} else {
$favtopic = $_POST["favtopic"];
}
$comment = $_POST["comment"];
}- empty() 함수나 isset() 함수로 검사
- empty()
- =
- !isset($var) || $var==false
- =
- if ($_SERVER["REQUEST_METHOD"] == "POST") {
- 46) Form 입력 형식 검증
- 이름 입력 형식 검증
- preg_match() 함수를 사용하여 정규 표현식을 이용
- 이메일과 URL 주소 입력 형식 검증
- if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailMsg = "이메일을 정확히 입력해 주세요!";
}
- if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
- 검증 필터
- FILTER_VALIDATE_BOOLEAN
- 해당 변수가 "1", "true", "on", "yes"인 경우에만 true를 반환하고, 나머지는 전부 false를 반환
- FILTER_VALIDATE_EMAIL 해당 변수가 유효한 이메일 주소인지를 검증함.
- FILTER_VALIDATE_FLOAT 해당 변수가 float 타입인지를 검증함.
- FILTER_VALIDATE_INT 해당 변수가 int 타입인지를 검증함.
- FILTER_VALIDATE_IP 해당 변수가 유효한 IP 주소인지를 검증함.
- FILTER_VALIDATE_MAC 해당 변수가 유효한 MAC 주소인지를 검증함.
- FILTER_VALIDATE_REGEXP
- 해당 변수를 펄 호환 정규 표현식(Perl-Compatible Regular Expression, PCRE)으로 검증
- FILTER_VALIDATE_URL 해당 변수가 유효한 URL 주소인지를 검증함.
- FILTER_VALIDATE_BOOLEAN
- 이름 입력 형식 검증
12. 파일 처리
- 47) 파일 읽기
- 1. 파일 열기, 열리지 않으면 종료함.
- fopen()
- $fp = fopen("list.txt", 'a');
- 인수1
- 파일의 주소
- 인수2
- 접근 권한을 명시하는 파일 모드
- + - 모드
- r
- 파일을 읽기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함.
- r+
- 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 시작 부분에 위치함.
- w
- 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함.
- 만약 파일이 존재하면 덮어쓰고, 파일이 없다면 새로 생성함.
- w+
- 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 시작 부분에 위치함.
- 만약 파일이 존재하면 덮어쓰고, 파일이 없다면 새로 생성함.
- a
- 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 끝부분에 위치함.
- 만약 파일이 존재하면 이어 쓰고, 파일이 없다면 새로 생성함.
- a+
- 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 끝부분에 위치함.
- 만약 파일이 존재하면 이어 쓰고, 파일이 없다면 새로 생성함.
- x
- 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함.
- 만약 파일이 존재하면 false를 반환하고 오류를 발생시킴.
- x+
- 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 시작 부분에 위치함.
- 만약 파일이 존재하면 false를 반환하고 오류를 발생시킴.
- c
- 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함.
- 만약 파일이 없다면 새로 생성하고, 파일이 존재하면 파일을 덮어쓰지도 않고 오류를 발생시키지도 않음.
- c+
- 파일을 읽고 쓰기 위해 열고, 나머지는 'c'와 같음.
- r
- flag
- t
- 텍스트 모드
- 줄 바꿈 문자('\n', '\r\n')를 해석
- 텍스트 모드
- b
- 바이너리 모드
- 줄 바꿈 문자('\n', '\r\n')를 해석 X
- 바이너리 모드
- PHP 버전 간의 이식성을 고려하여 항상 'b' 플래그를 추가하는 것이 좋습니다
- t
- fopen()
- 2. 파일에서 데이터 읽기
- 1. fgets()
- 한 줄씩
- 파일 포인터가 파일의 끝에 도달하거나, 줄 바꿈 문자를 만날 때까지 계속
- 한 줄씩
- 2. fgetc()
- 한 글자씩
- 3. readfile()
- 한 번에 모두 읽어 들임
- 출력 버퍼(output buffer)에 저장
- 한 번에 모두 읽어 들임
- ※
- feof() 함수
- 파일의 끝 확인
- feof() 함수
- 1. fgets()
- 3. 파일 닫기
- fclose($fp);
- 1. 파일 열기, 열리지 않으면 종료함.
- 48) 파일 쓰기
- 파일 쓰기
- 1. 파일 열기, 파일이 존재하지 않으면 생성함.
- fopen()
- $fp = fopen("list.txt", 'w');
- fopen()
- 2. 파일에 데이터 쓰기
- 문자열을 저장
- fwrite()
- 바이너리 데이터를 안전하게 처리
- fputs()
- fwrite()
- 문자열을 저장
- 3. 파일 닫기
- fclose($fp);
- 1. 파일 열기, 파일이 존재하지 않으면 생성함.
- 파일 쓰기
- 49) 기타 파일 관련 함수
- 파일 존재 여부 확인
- file_exists("list.txt")
- 파일 크기 확인
- echo filesize("list.txt");
- 2GB보다 크게 되면 예상치 못한 결과를 반환
- echo filesize("list.txt");
- 파일 내부 탐색
- 1. ftell() : 전달받은 파일 포인터가 현재 가리키고 있는 위치
- 2. rewind() : 전달받은 파일 포인터를 해당 파일의 맨 처음으로 이동
- 3. fseek()
- 전달받은 파일 포인터를 특정 위치로 이동
- 인수1
- 파일 포인터
- 인수2
- 얼마만큼 파일 포인터를 옮겨야 하는지에 대한 오프셋
- 인수3
- 오프셋 기준
- 1. SEEK_SET : 파일의 처음을 기준으로 함. (기본 설정)
- 2. SEEK_CUR : 파일 포인터의 현재 위치를 기준으로 함.
- 3. SEEK_END : 파일의 끝을 기준으로 함.
- 오프셋 기준
- 파일 삭제
- 파일 존재 여부 확인
13. 쿠키와 세션
- 50) 쿠키
- 서버에 의해 사용자의 컴퓨터에 저장되는 정보
- 클라이언트(client) 측의 컴퓨터에 남겨서 필요할 때마다 재사용
- 로그인 정보나 장바구니 정보를 저장하는 용도로 많이 활용
- 쿠키 생성
- setcookie()
- setcookie ( $name [, $value [, $expire [, $path [, $domain [, $secure [, $httponly ]]]]]] )
- 쿠키 명을 제외한 매개변수는 모두 옵션
- 브라우저가 닫히기 전까지 계속 유효
- 명시된 지속 시간이 지나면 무효
- setcookie() 함수가 포함된 PHP 스크립트 코드는 <html>태그보다 앞서 위치
- HTTPS 프로토콜에서 사용하려면 secure 값을 true로 설정
- HTTP 프로토콜에서만 사용하도록 하려면 httponly 값을 true로 설정
- 생성된 쿠키는 $_COOKIE["쿠키이름"]을 통해 접근 가능
- <?php
$cookieName = "city";
$cookieValue = "서울";
setcookie($cookieName, $cookieValue, time()+60, "/"); // 쿠키가 60초 간 지속됨.
?>
...
<?php
if(!isset($_COOKIE[$cookieName])) { // 해당 쿠키가 존재하지 않을 때
- <?php
- setcookie()
- 쿠키 삭제
- unset() 함수나 setcookie()
- setcookie($cookieName, $cookieValue, time()-60, "/"); // 쿠키를 삭제함. unset($_COOKIE["city"])와 같음.
- unset() 함수나 setcookie()
- 51) 세션
- 브라우저를 닫아 서버와의 연결을 끝내는 시점까지
- 여러 페이지에 걸쳐 사용되는 사용자 정보를 저장하는 방법
- 서버 측에 데이터를 저장
- 세션의 키값만을 클라이언트 측에 남겨둡니다
- 보안에 취약한 쿠키를 보완
- 키값을 이용하여 서버에 저장된 데이터를 사용
- 세션의 키값만을 클라이언트 측에 남겨둡니다
- 세션 시작
- session_start()
- 세션 아이디가 이미 존재하는지를 확인하고, 존재하지 않으면 새로운 아이디를 만듭니다
- 세션 아이디
- 웹 서버에 의해 무작위로 만들어진 숫자
- 쿠키와 마찬가지로 세션도 어떤 헤더<html>보다도 먼저 생성해야만
- 웹 서버
- 클라이언트로부터 받아온 세션 아이디를 가지고, 해당 아이디에 대응되는 세션 변수에 접근
- session_start();
- 세션의 지속 시간
- php.ini 파일에 설정
- session_start()
- 세션 변수의 등록
- $_SESSION 배열에 등록
- 수퍼 글로벌
- 세션 변수의 이름이 키값이 되며, 이 내용은 서버 측에 저장
- $_SESSION["city"] = "부산"; // 세션 변수의 등록
$_SESSION["gu"] = "해운대구";
echo "세션 변수가 등록되었습니다!";
- $_SESSION["city"] = "부산"; // 세션 변수의 등록
- $_SESSION 배열에 등록
- 세션 변수에 접근
- $_SESSION["세션변수이름"]으로 접근
- echo "제가 살고 있는 도시는 {$_SESSION['city']}<br>";
echo "그 중에서도 {$_SESSION['gu']}에 살고 있습니다.<br>";
print_r($_SESSION); // 모든 세션 변수의 정보를 연관 배열 형태로 보여줌.
- echo "제가 살고 있는 도시는 {$_SESSION['city']}<br>";
- $_SESSION["세션변수이름"]으로 접근
- 세션 변수의 등록 해지
- unset()
- session_unset()
- 현재 등록된 모든 세션 변수를 해지
- session_destroy()
- 세션 아이디를 삭제
- 브라우저를 닫아 서버와의 연결을 끝내는 시점까지
14. 예외 처리
- 52) 예외 처리
- 예외
- 실행 중에 발생하는 런타임 오류
- 예외 강제 발생
- throw 예외객체;
- 예외 객체는 반드시 Exception 클래스나 Exception 클래스를 상속받은 자식 클래스
- throw 예외객체;
- 예외 처리
- try / catch / finally 문
- try{
예외를 처리하길 원하는 실행 코드;
}catch(예외객체 매개변수){
예외가 발생할 경우에 실행될 코드;
}finally{
try 블록이 종료되면 무조건 실행될 코드;
}
- Exception 클래스
- 모든 예외의 조상 클래스
- PHP 7부터 Exception 클래스는 Throwable 인터페이스를 구현
- 프로퍼티
- $message
- 예외 메시지
- $code
- 예외 코드
- $file
- 예외가 발생한 파일명
- $line 예외가 발생한 라인
- $message
- 메소드
- __construct()
- 생성자
- getMessage()
- 예외 메시지를 반환함.
- getCode()
- 예외 코드를 반환함.
- getFile()
- 예외가 발생한 파일의 경로를 반환함.
- getLine()
- 예외가 발생한 라인 번호를 반환함.
- getTrace()
- 발생한 예외에 대한 정보를 포함한 배열(Exception stack trace)을 반환함.
- getTraceAsString() getTrace()의 결과를 문자열로 반환함.
- __toString() 발생한 예외에 대한 정보를 문자열로 반환함.
- __construct()
- ex
- try{
throw new Exception("예외 메시지"); // 예외 객체 던짐.
}catch(Exception $ex) // 예외 처리
{
echo $ex->getMessage()."<br>";
echo "예외가 발생한 파일 경로 : ".$ex->getFile()."<br>";
echo "예외가 발생한 라인 번호 : ".$ex->getLine();
}
- try{
- 예외
- 53) 사용자 정의 예외
- 사용자가 직접 정의한 예외 객체
- Exception 클래스를 상속받아 만들 수 있습니다
- 중첩 예외
- try 블록 안에 또 다른 try 블록을 정의
- 다중 catch 문
- 사용자가 직접 정의한 예외 객체
15. PHP와 MySQL
- 54) MySQL 기초
- 55) MySQL 연결
- 연결하기 위해 사용할 수 있는 API
- 1. MySQL improved extension(MySQLi extension)
- 2. PHP Data Objects(PDO)
- 서버와의 연결
- PDO를 사용
- <?php
$servername = "localhost";
$dbname = "testDB";
$user = "choi";
$password = "0219";
try
{
① $connect = new PDO('mysql:host=$servername;dbname=$dbname', $user, $password);
② $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "서버와의 연결 성공!";
}
③ catch(PDOException $ex)
{
echo "서버와의 연결 실패! : ".$ex->getMessage()."<br>";
}
?>- 서버 이름, 데이터베이스 이름, 사용자명과 비밀번호를 전달하여 새로운 PDO 객체를 생성
- 생성된 PDO 객체에 에러 모드(error mode)를 설정
- ③에러가 발생할 때마다 PDOException 예외를 던질 것
- ①
- <?php
- PDO를 사용
- 서버와의 연결 종료
- <?php
$connect= null;
?>
- <?php
- sql실행
- $connect->exec($sql);
- 연결하기 위해 사용할 수 있는 API
- 56) MySQL CREATE
- 테이블 생성
- $connect->exec($sql);
- 테이블 생성
- 57) MySQL INSERT
- 58) MySQL UPDATE
- 59) MySQL DELETE
- 60) MySQL SELECT
- foreach ($connect->query($sql) as $field) {
echo $field['Name']."님의 예약일자 : ";
echo $field['ReserveDate']."<br>";
}
- foreach ($connect->query($sql) as $field) {
반응형