모든것에 도전하라~~~

홀로서기에 정답은 없다. 최선만이 있을 뿐이다..

직접만든 여행지도 방방곡곡 자세히보기

프로그램 개발/php

php 배우기

bluelegend 2024. 12. 3. 12:17

1. PHP 시작

  • 1) PHP 개요
    • 1. 클라이언트 사이드(client-side)
      • 자바스크립트
    • 2. 서버 사이드(server-side)
      • PHP
  • 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)가 추가
  • 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>
        • 2. HTML 스크립트 스타일 : <script language = "php"> ... </script>
        • 3. SGML 스타일          : <? ... ?>
        • 4. ASP 스타일           : <% ... %>
    • 문법
      • C언어처럼 PHP 명령문도 마지막은 세미콜론(;)
        • <?php
             echo "PHP 수업에 잘 오셨습니다!";
          ?>
        • PHP 코드가 종료되면 자동으로 세미콜론을 적용
          • <?php
               echo "PHP 수업에 잘 오셨습니다!"
            ?>
      • 코드 영역을 나타내는 종료 태그도 생략 가능
        • <?php
             echo "PHP 수업에 잘 오셨습니다!";
    • 주석
      • 1. 한 줄 C언어 스타일   : //주석문
      • 2. 여러 줄 C언어 스타일 : /*주석문*/
      • 3. 한 줄 쉘 스타일      : #주석문
        • '?>'인 종료 태그의 직전까지만 적용
    • echo(), print(), isset() 등
      • 함수처럼 생겼지만 실제 함수가 아닌 구문
        • 언어 구조(language construct)
      • 실제 함수가 아니므로, 인수를 전달할 때 괄호( ) 생략 가능
    • echo() 함수
      • HTML 스트림에 문자열을 출력
      • 두 개 이상의 인수를 전달할 때는 반드시 괄호 사용 안됨
        • <?php
             echo "문자열을 출력합니다.<br>";
             echo ("인수를 전달할 때 괄호를 사용해도 괜찮습니다!<br>");
             ECHO "echo() 함수의 키워드는 대소문자를 구분하지 않습니다!<br>";
             echo "첫 번째 인수, ", "두 번째 인수";
             //echo("첫 번째 인수, ", "두 번째 인수"); // 오류 발생
          ?>

2. PHP 기초

  • 5) 변수
    • 식별자
      • 식별할 때 사용하는 이름
      선언
      • $변수이름 = 초깃값;
        • 타입 명시 안함
          • 대입하는 값에 따라 자동으로 결정
      • 대소문자 구분
      <?php
      $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
      초기화
      • 기본값으로 자동 초기화
        • 불리언(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
      • global 키워드 대신 $GLOBALS 배열을 사용
        • + - PHP는 모든 전역 변수를 $GLOBALS 배열에 저장
          • $var = 10; // 전역 변수로 선언함
            function varFunc() {
               echo "함수 내부에서 호출한 전역 변수 var의 값은 {$var}<br>";
               echo "함수 내부에서 호출한 전역 변수 var의 값은 {$GLOBALS['var']}<br>";
            }
            varFunc();
            echo "함수 밖에서 호출한 전역 변수 var의 값은 {$var}";
      • 슈퍼 글로벌
        • 미리 정의된 전역 변수
          • 특별한 선언 없이 스크립트 내의 어디에서라도 바로 사용 가능
        • 1. $GLOBALS
        • 2. $_SERVER
        • 3. $_GET
        • 4. $_POST
        • 5. $_FILES
        • 6. $_COOKIE
        • 7. $_SESSION
        • 8. $_REQUEST
        • 9. $_ENV
    • 3. 정적 변수(static variable)
      • 함수 내부에서 static 키워드로 선언한 변수
        • 호출이 종료되더라도 메모리상에서 사라지지 않음
        • 지역 변수처럼 해당 함수 내부에서만 접근
      • 해당 함수를 여러번 호출할때 값 변경저장 가능
  • 7) 상수
    • 선언
      • define(상수이름, 상숫값, 대소문자구분여부)
        • 세 번째 인수
          • 상수의 이름이 대소문자를 구분여부
            • 기본값은 false로 대소문자를 구분
        define("PHP", "PHP 수업에 잘 오셨습니다!<br>"); // 대소문자를 구분함.(기본 설정)
        echo PHP; // PHP 수업에 잘 오셨습니다!
        echo php; // php -> 상수 인식 안됨
        define("PHP", "<br>PHP 수업에 잘 오셨습니다!", true); // 대소문자를 구분하지 않음.
        echo php; // PHP 수업에 잘 오셨습니다!
        echo Php; // PHP 수업에 잘 오셨습니다!
    • 선언된 상수는 스크립트의 어디에서라도 참조
      • 함수내에서 선언되어도 함수밖에서 사용 가능
      • 선언되기 이전의 스크립트 영역에서는 해당 상수 참조 안됨
    • 마법 상수
      • 미리 정의된 다양한 상수
        • 대소문자 구분 X
      • 예제
        • echo "<pre>";
          print_r(get_defined_constants(true));
          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) "네 번째 값" }
              두 번째 값
              두 번째 값
              세 번째 값
              네 번째 값
    • 6. 객체(object)
      • 클래스의 인스턴스(instance)를 저장하기 위한 타입
    • 7. 리소스(resource)
      • PHP 외부에 존재하는 외부 자원
        • 데이터베이스 연결 등을 반환할 때 사용
    • 8. NULL
      • unset($var_01);                // $var_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)
    • 가변 변수
      • $의 중복사용
        • 타입뿐만 아니라 변수의 이름까지 동적으로 바꿀 수 있습니다
      • 예제
        • $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 ...

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 수업에 오신것을 환영
    • 배열 합집합 연산자
      • +
        • 연산 순서에 따라 키값이 보존됨
          • 앞에 있는 연산자 키값 우선
          $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 연산자
      • 어떤 클래스의 인스턴스 인지 확인
      • 부모 클래스(parent class)에서 상속받은 클래스인지를 확인
      • 인터페이스(interface)로 구현한 클래스의 객체 인스턴스 인지 확인

4. 제어문

  • 17) 조건문
    • if 문
      • if (조건식1) {
           조건식1의 결과가 참일 때 실행하고자 하는 명령문;
        }
        elseif (조건식2) {
           조건식2의 결과가 참일 때 실행하고자 하는 명령문;
        }
        else {
           조건식1의 결과도 거짓이고, 조건식2의 결과도 거짓일 때 실행하고자 하는 명령문;
        }
        • 명령문이 한 줄이면 중괄호({})를 생략가능
    • 삼항 연산자에 의한 조건문
    • 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;
          }
  • 18) 반복문
    • 1. while 문
      • while (조건식) {
           조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
        }
        • $i = 0;
          while ($i < 5) {
             echo ($i++)."<br>";
          }
    • 2. do / while 문
      • do {
           조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
        } while (조건식);
        • do { // do / while문은 조건식과 상관없이 반드시 한 번은 루프를 실행함
             echo "변수 j의 값은 ".(++$j)."<br>";
          } while ($j > 5);
    • 3. for 문
      • for (초기식; 조건식; 증감식) {
           조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
        }
        • 초기식, 표현식, 증감식은 각각 생략될 수 있습니다.
        • 쉼표 연산자(,)를 사용하면 여러 개의 초기식이나 증감식을 동시에 사용
        • for ($i = 0; $i < 5; $i++) {
             echo "{$i}<br>";
          }
    • 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,
            );
            foreach ($arr as $key => $value) {
               echo "배열 \$arr에서 키값 '{$key}'에 대한 값은 {$value}<br>";
            }
            unset($value);
  • 19) 기타 제어문
    • continue 문
      • 루프의 나머지 부분을 건너뛰고, 바로 다음 조건식으로 이동
    • break 문
      • 반복문 다음에 위치한 명령문으로 이동
    • goto 문
      • 지정된 레이블(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; 가능
        • 제어문의 여는 괄호({)를 콜론(:)으로 대체

5. 배열

  • 20) 배열의 기초
    • 배열
      • 맵(map: 키+ 값)으로 이루어진, 순서가 있는 집합
      • 1. 1차원 배열
        • $배열이름 = array();
      • 2. 다차원 배열
      • 3. 연관 배열
    • 배열 요소의 참조
      • $배열이름[인덱스]
        • 인덱스는 숫자 또는 문자열
    • 배열 요소의 추가
      • 생성 따로, 배열 요소 추가 따로
        • $arr = array();     // 배열 생성
          $arr[0] = "apple";  // 배열 요소 추가
          $arr[1] = "banana";
          $arr[2] = "orange";
      • 생성하면서 동시에 배열 요소를 초기화
        • $배열이름 = array(배열요소1, 배열요소2, ...);
        • $arr = array("apple", "banana", "orange");  // 배열 생성과 동시에 초기화
      • 생성없이 배열요소 추가
        • 자동 생성
          • $arr[0] = "apple";  // 배열이 존재하지 않으므로, 배열 생성 후 요소 추가됨
            $arr[1] = "banana";
            $arr[] = "orange";
          • 인덱스를 지정하지 않으면 0부터 자동 생성
    • 배열의 홀(hole)
      • 특정 인덱스에만 배열 요소를 추가
        • 나머지는 null
        isset() 함수는 인수로 전달받은 변수가 초기화되어 있는지를 확인
        • 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() 함수는 배열의 모든 요소의 개수를 반환
  • 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]";
    • 생성하면서 동시에 배열 요소를 초기화
      • $배열이름 = array(
           array(배열요소00, 배열요소01, ...),
           array(배열요소10, 배열요소11, ...),
           ...
        );
    • 루프를 이용한 2차원 배열로의 접근
      • for($row = 0; $row < 3; $row++) {
           for($column = 0; $column < count($arr[$row]); $column++){
               echo $arr[$row][$column].", ";
           }
        }
    • 3차원 배열
      • $배열이름 = 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 = array();        // 배열 생성
          $array["apple"] = 1000;  // 연관 배열 요소 추가
          $array["banana"] = 2000;
          $array["orange"] = 1500;
      • $배열이름 = 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>";
          }
      • each() 함수 사용
        • 배열 커서(array cursor)가 현재 가리키고 있는 배열 요소를 반환하고, 다음 배열 요소를 가리킴
        • $array = array("apple" => 1000, "banana" => 2000, "orange" => 1500);
          while($element = each($array)) {
             echo $element['key']." ".$element['value']."<br>";
          }

6. 함수

  • 23) 함수의 기초
    • 특징
      • 반복 회피
      • 모듈화로 인한가독성
    • 구조
      • 1. 함수 이름
        • function 키워드로 선언
      • 2. 괄호 안에 쉼표(,)로 구분되는 함수의 매개변수(parameter)
      • 3. 중괄호({})로 둘러싸인 PHP 수행 코드
    • 문법
      • function 함수이름(매개변수1, 매개변수2,...)
        {
           함수가 호출 되었을 때 실행될 코드;
        }
  • 24) 사용자 정의 함수
    • 함수의 호출
      • 모든 함수와 클래스는 전역 범위(global scope)
    • 함수의 값 반환
      • return 키워드를 사용하여 명시
    • 반환 타입
      • 객체를 포함한 PHP에서 사용할 수 있는 모든 타입 가능
      • 약한 강도
        • unction sum($x, $y) : float // 반환값의 타입을 float 타입으로 설정함.
          {
             return $x + $y;
          }
          ...
          var_dump(sum(3 + 4)); // 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
  • 25) 매개변수와 인수
    • 매개변수의 전달 방식
      • 1. 값 전달 방식
        • 변수를 함수에 매개변수로 사용한후, 함수 안에서 변경되어도 함수 밖 원본 데이터는 영향 없음
        • 함수 호출시의 매개변수와 함수 내부에서 사용되는 인수는 엄밀히 다른 값임
          • 인수는 매개변수의 복사본
      • 2. 참조 전달 방식
        • 함수 내부에서 함수 밖의 데이터를 조작하기 위해서는 해당 변수를 전역 변수로 선언 가능
        • 참조 전달(pass by reference)을 이용하여 원본 데이터를 그대로 참조
          • function increment(&$para) // 인수로 전달되는 값의 원본을 참조함.
            {
               $para++;
            }
            $value = 1;
            increment($value);
    • 디폴트 매개변수
      • 호출시 매개변수가 적으면 매개변수의 왼쪽부터 차례대로 대입
      • function sum($value1, $value2 = 0, $value3 = 0)
        • echo sum(1, 2, 3); // 6
          echo sum(1, 2);    // 3
          echo sum(1);       // 1
          //echo sum();      // 오류가 발생
      • function sum($value1 = 0, $value2, $value3 = 0)
        • ① echo sum(1, 2, 3); // 6
          ② echo sum(1, 2);    // 3
          ③ //echo sum(1);     // 오류가 발생함.
    • 가변 길이 인수 목록
      • 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;
          }
      • PHP 5.6 이상
        • '...' 토큰을 사용
          • $num 은 배열이 됨
        • function sum(...$num) // PHP 5.6 이상
          {
             $sum = 0;
             foreach($num as $n) {
                 $sum += $n;
             }
             return $sum;
          }
  • 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 factorial($num)
        {
           if($num > 1)                           // 1이 될 때까지
               return $num * factorial($num - 1); // 1씩 감소시킨 값을 전달하여 자기 자신을 계속 호출함.
           else
               return 1;
        }
        echo factorial(4);
      • 100번 이상의 재귀 호출은 스택의 한계에 도달하여 스크립트가 중단될 수 있음
    • 가변 함수
      • 변수를 사용하여 함수를 호출
        • 함수명을 변수에 대입
        function first()
        {
           echo "first() 함수<br><br>";
        }
        function second($para)
        {
           echo "second() 함수<br>";
           echo "함수 호출 시 전달받은 인수의 값은 {$para}";
        }
        $func = "first";
        $func();    // first() 함수를 호출함.
        $func = "second"
        $func(20);  // second() 함수를 호출함.

7. PHP 내장 함수

  • 27) 변수 관련 함수
    • 티입확인
      • gettype($x)
        • 타입을 반환
          • 실행 속도 느림
            • is_xxxxx() 함수 권장
    • 변수의 타입 변경
      • settype($x, "string")
        • 변수의 타입을 변경
          • 변경 성공/실패= true/false 리턴
    • 변수의 상태 변경
      • isset()
        • 변수가 선언되고 초기화되어 있는지 검사
      • empty()
        • 전달받은 변수가 비어있는지를 검사
          • !isset($var) | $var==false
        • - 정수 0
        • - 실수 0.0
        • - 문자열 "0"
        • - 빈 문자열 ""
        • - null
        • - false
        • - 빈 배열 array()
        • - 초기화되지 않은 변수
    • 특정 타입으로 변경
      • $x = "123.56789abc";
        echo intval($x);   // 123
        echo floatval($x); // 123.56789
        echo strval($x);   // 123.56789abc
        • intval()
        • floatval()
        • strval()
  • 28) 배열 관련 함수
    • 배열의 생성
      • $arr = array(1, 2, 3, 4, 5);
    • 배열 요소의 개수
      • count(), sizeof()
        • 요소의 개수
        array_count_values()
        • 해당 값이 몇 번 등장하는지
        $arr = array(1, 5, 7, 3, 3, 1, 2);
        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번
    • 배열의 탐색
      • 현재 선택된 배열 요소가 어느 요소인지를 가리키는 포인터가 별도로 존재
        • 배열 포인터
      • 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
    • 배열의 정렬
      • sort()
        • 배열을 정렬하여 새로운배열 반환
          • 두 번째 인수로는 배열 요소를 정렬할 기준
          $arr = array(15, 2, 1, 21, 121);
          //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
    • 연관 배열의 정렬
      • 오름차순
        • ksort()
          • 키를 기준으로 정렬
          asort()
          • 값을 기준으로 정렬
          $arr = array("apple" => 1000, "banana" => 2000, "orange" => 1500);
          asort($arr); // 요소의 값을 기준으로 배열 정렬 -> apple, orange, banana
          ksort($arr); // 키값을 기준으로 배열 정렬      -> apple, banana, orange
      • 내림차순
        • rsort(), krsort(), arsort()
      • 기타
        • array_multisort()
          • 여러 배열이나 다차원 배열의 배열 요소를 정렬함.
        • natcasesort()
          • 대소문자를 구분하지 않는 영문숫자 순(natural order)의 알고리즘으로 배열 요소를 정렬함.
        • natsort()
          • 영문숫자 순(natural order)의 알고리즘으로 배열 요소를 정렬함.
        • usort()
          • 사용자가 정의한 비교 함수를 사용하여, 배열 요소의 값을 기준으로 정렬함.
        • uksort()        사용자가 정의한 비교 함수를 사용하여, 배열 요소의 키를 기준으로 정렬함.
        • uasort()        사용자가 정의한 비교 함수를 사용하여, 인덱스 연관성을 유지한 채 배열 요소를 정렬함.
    • 배열 요소의 재배치
      • shuffle()
        • 섞은 뒤에 무작위로 재배치
      • array_reverse()
        • 역순으로 변경
          • 원본 배열에는 영향 X
  • 29) 문자열 관련 함수
    • 문자열의 길이
      • strlen()
        • 한글이 포함되면, 문자열의 길이가 아닌 문자열의 총 바이트(byte) 수를 반환
      • mb_strlen()
        • 한글이 포함된 문자열길이
          • 두 번째 인수로 인코딩 방식
            • 두번재 인수 없으면 내부 인코딩 방식을 사용
    • 문자열 비교
      • strcmp()
        • 앞쪽인수가 크면 양수, 작으면 음수, 같으면 0
          • 대소문자를 구분
        strcasecmp()
        • 대소문자를 구분 안함
        echo strcmp("abc", "ABC")."<br>"; // 양수  2105376
        echo strcasecmp("abc", "ABC")."<br><br>"; // 0
        echo strcmp("2", "10")."<br>"; // 양수   1
        echo strnatcmp("2", "10"); // 음수  -1
    • 특정 문자열 검색
      • strstr()
        • 일치하는 부분을 포함한 이후의 모든 문자를 같이 반환
        strchr()
        • 뒤에서 일치하는 부분
        echo strstr("ABCabcDEFabc", "abc");   // abcDEFabc
        echo strrchr("ABCabcDEFabc", "abc")"; // abc
        echo stristr("ABCabcDEFabc", "abc");  // ABCabcDEFabc
    • 특정 문자열 위치 찾기
      • strpos()
        • 일치하는 부분의 시작 인덱스를 반환
      • strrpos()
        • 뒤에서 일치하는 부분의 시작 인덱스를 반환
      • 인덱스는 언제나 0부터
    • 문자열 추출
      • substr()
        • echo substr($str, -3);    // 끝에서부터 세 글자 출력
          echo substr($str, 1, 5);  // 두 번째 문자부터 다섯 글자 출력
    • 문자열 대소문자 바꾸기
      • 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_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);  // 두 번째 문자 뒤에 '*'을 삽입함.
    • 문자열 다듬기
      • ltrim()
        • rtrim()
          • chop()
            • trim()
      • 제거하는 문자
        • - 띄어쓰기 " "
        • - 탭 문자 "\t"
        • - 줄 바꿈 문자 "\n", "\r"
        • - 널 문자 "\0"
        • - 수직 탭 문자 "\x0B"
  • 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에서 추가됨)
        • 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 동쪽은 항상 양수로 표현됨.
        • 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() 참조
      • echo date("Y/m/d h:i:s");
    • 타임스탬프
      • mktime()
        • echo mktime(0, 0, 0, 1, 1, 2000)."<br>";  // 2000년 1월 1일을 나타내는 타임스탬프
      • time()
    • 날짜와 시간 정보
      • getdate()
        • 타임스탬프에 해당하는 정보를 연관 배열의 형태로 반환
      • + - getdate() 연관 배열의 키
        • seconds
        • 해당 타임스탬프에 해당하는 초를 숫자로 저장함.
        • minutes
        • 해당 타임스탬프에 해당하는 분을 숫자로 저장함.
        • hours
        • 해당 타임스탬프에 해당하는 시간을 숫자로 저장함.
        • mday        해당 타임스탬프에 해당하는 일을 숫자로 저장함.
        • wday        해당 타임스탬프에 해당하는 요일을 숫자로 저장함.
        • mon        해당 타임스탬프에 해당하는 월을 숫자로 저장함.
        • year        해당 타임스탬프에 해당하는 연도를 네 자리의 숫자로 저장함.
        • yday        해당 타임스탬프에 해당하는 일자가 일 년 중 몇 번째 날인지를 숫자로 저장함.
        • weekday        해당 타임스탬프에 해당하는 요일을 완전한 문자열로 저장함.
        • month        해당 타임스탬프에 해당하는 월을 완전한 문자열로 저장함.
        • 0        타임스탬프값을 저장함.
    • 타임 존
      • 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");
      • date_default_timezone_get()
      • PHP 5.1.0부터
    • 날짜의 유효성 검사
      • checkdate()
        • 전달받은 날짜의 유효성을 검사
          • 유효하다면 true를 반환하고, 유효하지 않다면 false
  • 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 중 하나의 문자열
    • 양화사
      • 특수 문자로 수량을 나타내는 다양한 양화사를 사용
      • - '*'는 바로 앞의 문자가 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" } }
          $subject = "PHP is 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" } }
    • 위치 문자
      • 패턴을 검색할 단어의 위치까지 지정
      • - '^'는 단어의 맨 앞에 위치한 해당 패턴만을 검색
        • // 단어가 문자열 "abc"로 시작하는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함.
          $match_01 = preg_replace('/^abc/', 'ABC',$subject);
      • - '$'는 단어의 맨 뒤에 위치한 해당 패턴만을 검색
        • // 단어가 문자열 "abc"로 끝나는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함.
          $match_02 = preg_replace('/abc$/', 'ABC', $subject);
    • 선택 문자
      • 특수문자 '|'를 사용하여 여러 개의 검색 패턴을 사용
        • // 문자열 'abc' 또는 'def' 또는 'jkl'만을 검색함.
          // 즉, 위의 세 문자열 중 어느 하나에만 일치해도 검색됨.
          preg_match_all('/abc|def|jkl/', $subject, $match);
    • 문자 클래스
      • 범위에 해당하는 한 문자만을 선택
      • 꺾쇠 괄호[ ]를 사용
        • /[0-3]/        // 0부터 3까지의 숫자에 해당하는 한 문자
          /[a-z]/        // 영문 소문자에 해당하는 한 문자
          /[0-9a-zA-Z]/  // 숫자 또는 영문 대소문자에 해당하는 한 문자
        • // 문자열 "ap" 앞에 영문자 한 문자가 나타나는 경우를 검색함.
          preg_match('/[a-zA-Z]ap/', $subject, $match_02);
    • POSIX 문자 클래스
      • 종류
        • [:alnum:]
          • 영문자와 숫자에 포함되는지를 확인함.
        • [:alpha:]
          • 영문 대소문자에 포함되는지를 확인함.
        • [:lower:]
          • 영문 소문자에 포함되는지를 확인함.
        • [:upper:]        영문 대문자에 포함되는지를 확인함.
        • [:digit:]        십진법 숫자에 포함되는지를 확인함.
        • [:xdigit]        16진법 숫자나 문자에 포함되는지를 확인함.
        • [:punct:]        구두점에 포함되는지를 확인함.
        • [:blank:]        탭과 띄어쓰기에 포함되는지를 확인함.
        • [:space:]        공백 문자에 포함되는지를 확인함.
        • [:cntrl:]        제어 문자에 포함되는지를 확인함.
        • [:print:]        출력할 수 있는 문자에 포함되는지를 확인함.
        • [:graph:]        띄어쓰기를 제외한 모든 출력할 수 있는 문자에 포함되는지를 확인함.
        꺾쇠 괄호를 두 번 사용
        • POSIX 정규 표현식에서만 사용할 수 있는 문자 클래스
        /[[:alpha:]][[:digit:]]/ // 첫 번째 문자가 영문자이고, 두 번째 문자가 숫자인 길이가 2인 문자열
                                       // a1, a2, ..., b1, b2, ...
  • 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, ...
        • \- => - 로 인식
      • '\'문자 바로 뒤에 특수 문자가 나오면, 해당 문자는 일반 문자로 인식
    • 이메일 주소 확인
      • ① /([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개 이상 포함하는 이메일 주소 검색
        PHP에서는 filter_var() 함수를 제공
      • 설명
    • 한글 확인
      • ① /[가-힣]/                // 한글 소리 마디(초성 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);         // 해당 문자가 한글이면, 빈 문자열로 대체함.
      • 해당 문자열에서 한글만을 제거하는 예제
      • ①번 정규 표현식은 언어 설정이 한글이 아닌 시스템에서는 동작이 안 될 수도 있습니다.

9. 클래스

  • 35) 클래스의 기초
    • 프로퍼티(property)와 메소드(method)로 구현
    • 객체 지향 프로그래밍(OOP, Object-Oriented Programming)
      • 모든 데이터를 객체(object)로 취급하며, 객체가 바로 프로그래밍의 중심
      • 코드의 관리가 쉬워지고, 적은 노력으로도 손쉽게 코드를 변경, 유지 관리
  • 36) 클래스의 구조
    • class 클래스이름
      {
         클래스의 프로퍼티과 메소드의 정의;
      }
    • 생성자
      • 객체가 생성될 때마다 자동으로 호출
        • 생성자의 이름은 __construct()로 정해져 있음
      • class 클래스이름
        {
           function __construct(매개변수1, 매개변수2, ...)
           {
               생성자가 호출될 때 실행될 코드;
           }
        }
    • 소멸자
      • 삭제할 때 호출
        • 이름은 __desturct()
      • class 클래스이름
        {
           function __desturct()
           {
               소멸자가 호출될 때 실행될 코드;
           }
        }
  • 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(); // 호출 불가능

10. OOP

  • 38) 상속
    • extend 키워드를 사용
      • class B extends A
        {
           B 클래스만의 프로퍼티와 메소드;
        }
    • private 멤버를 제외한 모든 프로퍼티와 메소드를 상속
    • 오버라이딩
      • 이미 정의된 메소드를 같은 이름의 메소드로 다시 정의
      • 자식 클래스에서 상속받은 메소드를 오버라이딩
  • 39) 정적 멤버
    • static 키워드
      • 프로퍼티
        • 인스턴스를 생성하지 않아도 접근
          • 인스턴스화된 객체에서는 접근할 수 없음
      • 메소드
        • 인스턴스화된 객체에서도 접근 가능
      • $this 의사 변수를 사용할 수 없습니다.
      • ex
        • 클래스 StaticMember 선언

          echo StaticMember::showProperty();  // 호출 가능
          echo StaticMember::$staticProperty; // 접근 가능

          $var = new StaticMember();          // 인스턴스 생성
          echo $var->showProperty();          // 호출 가능
          //echo $var->$staticProperty;       // 접근 불가능
    • 범위 지정 연산자(::)
      • 클래스의 정의 내에서 프로퍼티나 메소드를 사용하고 싶을 때는 범위 지정 연산자(::)를 사용
      • 클래스의 상수, 정적(static) 멤버 또는 재정의된 멤버에 접근
        • echo OtherClassName::CONSTANT;
      • 클래스의 정의 내에서 특정 프로퍼티나 메소드에 접근
        • 1. self : 자기 자신에 접근할 때
          • echo self::$property;
        • 2. parent : 부모 클래스에 접근할 때
          • echo parent::CONSTANT;
  • 40) 인터페이스
    • 추상 메소드
      • 오버라이딩해야만 사용할 수 있는 메소드
      • 선언부만이 존재하며, 구현부는 작성 X
      • abstract 접근제어자 function 메소드이름();
    • 추상 클래스
      • 하나 이상의 추상 메소드를 포함하는 클래스
      • 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의 하도록 함
      • 인스턴스를 생성 X
        • 상속을 통해 자식 클래스 만들어 사용
    • 인터페이스
      • 인터페이스 클래스
        • 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할
          • 일종의 추상 클래스
        • 내부의 모든 추상 메소드는 public
        • 문법
          • 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()              // 메소드 구현
             {
                 ...
             }
          }
  • 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() 함수가 호출될 때 호출
      • + - 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() 메소드 호출
    • 메소드 오버로딩
      • 접근불가 메소드(inaccessible method)를 오버로딩 위해 매직 메소드 구현 필요
      • 매직 메소드
        • 1. public mixed __call(string $name, array $arguments)
          • 클래스 영역에서 접근 불가 메소드를 호출할 때 호출
        • 2. public static mixed __callStatic(string $name, array $arguments)
          • 정적(static) 영역에서 접근 불가 메소드를 호출할 때 호출
      • 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() 자동 호출
  • 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::

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."";
      HTTP 요청 방식
      • 1. GET 방식
        • 주소에 데이터(data)를 추가하여 전달
          • 보안상 취약점이 존재
        • 브라우저에 의해 캐시되어(cached) 저장
        • 쿼리 문자열(query string)에 포함되어 전송되므로, 길이의 제한
      • 2. POST 방식
        • 데이터(data)를 별도로 첨부하여 전달
        • 브라우저에 의해 캐시되지 않으므로, 브라우저 히스토리에도 남지 않음
        • 쿼리 문자열과는 별도로 전송
          • 길이 제한 없으며, GET 방식보다 보안성이 높음
      • 미리 선언된 전역 변수인 슈퍼 글로벌 배열($_GET, $_POST)을 사용하므로, 어디에서든 제약 없이 접근
        • PHP 4.1.0부터
  • 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 스크립트의 파일 이름을 반환
        • 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 요청에서만 동작
  • 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
      HTML의 required 속성을 이용해도 가능
  • 46) Form 입력 형식 검증
    • 이름 입력 형식 검증
      • preg_match() 함수를 사용하여 정규 표현식을 이용
    • 이메일과 URL 주소 입력 형식 검증
      • if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                   $emailMsg = "이메일을 정확히 입력해 주세요!";
        }
    • 검증 필터
      • 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 주소인지를 검증함.

12. 파일 처리

  • 47) 파일 읽기
    • 1. 파일 열기, 열리지 않으면 종료함.
      • fopen()
        • $fp = fopen("list.txt", 'a');
        • 인수1
          • 파일의 주소
        • 인수2
          • 접근 권한을 명시하는 파일 모드
          • + - 모드
            • r
              • 파일을 읽기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함.
            • r+
              • 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 시작 부분에 위치함.
            • w
              • 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함.
              • 만약 파일이 존재하면 덮어쓰고, 파일이 없다면 새로 생성함.
            • w+
              • 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 시작 부분에 위치함.
              • 만약 파일이 존재하면 덮어쓰고, 파일이 없다면 새로 생성함.
            • a
              • 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 끝부분에 위치함.
              • 만약 파일이 존재하면 이어 쓰고, 파일이 없다면 새로 생성함.
            • a+
              • 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 끝부분에 위치함.
              • 만약 파일이 존재하면 이어 쓰고, 파일이 없다면 새로 생성함.
            • x
              • 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함.
              • 만약 파일이 존재하면 false를 반환하고 오류를 발생시킴.
            • x+
              • 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 시작 부분에 위치함.
              • 만약 파일이 존재하면 false를 반환하고 오류를 발생시킴.
            • c
              • 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함.
              • 만약 파일이 없다면 새로 생성하고, 파일이 존재하면 파일을 덮어쓰지도 않고 오류를 발생시키지도 않음.
            • c+
              • 파일을 읽고 쓰기 위해 열고, 나머지는 'c'와 같음.
          • flag
            • t
              • 텍스트 모드
                • 줄 바꿈 문자('\n', '\r\n')를 해석
            • b
              • 바이너리 모드
                • 줄 바꿈 문자('\n', '\r\n')를 해석 X
            • PHP 버전 간의 이식성을 고려하여 항상 'b' 플래그를 추가하는 것이 좋습니다
    • 2. 파일에서 데이터 읽기
      • 1. fgets()
        • 한 줄씩
          • 파일 포인터가 파일의 끝에 도달하거나, 줄 바꿈 문자를 만날 때까지 계속
      • 2. fgetc()
        • 한 글자씩
      • 3. readfile()
        • 한 번에 모두 읽어 들임
          • 출력 버퍼(output buffer)에 저장
        • feof() 함수
          • 파일의 끝 확인
    • 3. 파일 닫기
      • fclose($fp);
  • 48) 파일 쓰기
    • 파일 쓰기
      • 1. 파일 열기, 파일이 존재하지 않으면 생성함.
        • fopen()
          • $fp = fopen("list.txt", 'w');
      • 2. 파일에 데이터 쓰기
        • 문자열을 저장
          • fwrite()
            • 바이너리 데이터를 안전하게 처리
          • fputs()
      • 3. 파일 닫기
        • fclose($fp);
  • 49) 기타 파일 관련 함수
    • 파일 존재 여부 확인
      • file_exists("list.txt")
    • 파일 크기 확인
      • echo filesize("list.txt");
        • 2GB보다 크게 되면 예상치 못한 결과를 반환
    • 파일 내부 탐색
      • 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])) { // 해당 쿠키가 존재하지 않을 때
    • 쿠키 삭제
      • unset() 함수나 setcookie()
        • setcookie($cookieName, $cookieValue, time()-60, "/"); // 쿠키를 삭제함. unset($_COOKIE["city"])와 같음.
  • 51) 세션
    • 브라우저를 닫아 서버와의 연결을 끝내는 시점까지
      • 여러 페이지에 걸쳐 사용되는 사용자 정보를 저장하는 방법
    • 서버 측에 데이터를 저장
      • 세션의 키값만을 클라이언트 측에 남겨둡니다
        • 보안에 취약한 쿠키를 보완
      • 키값을 이용하여 서버에 저장된 데이터를 사용
    • 세션 시작
      • session_start()
        • 세션 아이디가 이미 존재하는지를 확인하고, 존재하지 않으면 새로운 아이디를 만듭니다
        • 세션 아이디
          • 웹 서버에 의해 무작위로 만들어진 숫자
        • 쿠키와 마찬가지로 세션도 어떤 헤더<html>보다도 먼저 생성해야만 
      • 웹 서버
        • 클라이언트로부터 받아온 세션 아이디를 가지고, 해당 아이디에 대응되는 세션 변수에 접근
      • session_start();
      • 세션의 지속 시간
        • php.ini 파일에 설정
    • 세션 변수의 등록
      • $_SESSION 배열에 등록
        • 수퍼 글로벌
      • 세션 변수의 이름이 키값이 되며, 이 내용은 서버 측에 저장
        • $_SESSION["city"] = "부산"; // 세션 변수의 등록
          $_SESSION["gu"] = "해운대구";
          echo "세션 변수가 등록되었습니다!";
    • 세션 변수에 접근
      • $_SESSION["세션변수이름"]으로 접근
        • echo "제가 살고 있는 도시는 {$_SESSION['city']}<br>";
          echo "그 중에서도 {$_SESSION['gu']}에 살고 있습니다.<br>";
          print_r($_SESSION); // 모든 세션 변수의 정보를 연관 배열 형태로 보여줌.
    • 세션 변수의 등록 해지
      • unset()
      • session_unset()
        • 현재 등록된 모든 세션 변수를 해지
      • session_destroy()
        • 세션 아이디를 삭제

14. 예외 처리

  • 52) 예외 처리
    • 예외
      • 실행 중에 발생하는 런타임 오류
    • 예외 강제 발생
      • throw 예외객체;
        • 예외 객체는 반드시 Exception 클래스나 Exception 클래스를 상속받은 자식 클래스
    • 예외 처리
      • try / catch / finally 문
      • try{
           예외를 처리하길 원하는 실행 코드;
        }catch(예외객체 매개변수){
           예외가 발생할 경우에 실행될 코드;
        }finally{
           try 블록이 종료되면 무조건 실행될 코드;
        }
    • Exception 클래스
      • 모든 예외의 조상 클래스
      • PHP 7부터 Exception 클래스는 Throwable 인터페이스를 구현
      • 프로퍼티
        • $message
          • 예외 메시지
        • $code
          • 예외 코드
        • $file
          • 예외가 발생한 파일명
        • $line        예외가 발생한 라인
      • 메소드
        • __construct()
          • 생성자
        • getMessage()
          • 예외 메시지를 반환함.
        • getCode()
          • 예외 코드를 반환함.
        • getFile()
          • 예외가 발생한 파일의 경로를 반환함.
        • getLine()
          • 예외가 발생한 라인 번호를 반환함.
        • getTrace()
          • 발생한 예외에 대한 정보를 포함한 배열(Exception stack trace)을 반환함.
        • getTraceAsString()        getTrace()의 결과를 문자열로 반환함.
        • __toString()        발생한 예외에 대한 정보를 문자열로 반환함.
      • ex
        • try{
             throw new Exception("예외 메시지"); // 예외 객체 던짐.
          }catch(Exception $ex)                    // 예외 처리
          {
             echo $ex->getMessage()."<br>";
             echo "예외가 발생한 파일 경로 : ".$ex->getFile()."<br>";
             echo "예외가 발생한 라인 번호 : ".$ex->getLine();
          }
  • 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
           $connect= null;
        ?>
    • sql실행
      • $connect->exec($sql);
  • 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>";
             }
반응형