Record

목차

개념

-

동작원리

  • php파일의 확장자는 .php
  • 클라이언트가 브라우저를 통해 서버에게 php파일을 요청한다. 그러면 웹서버는 php파일을 뱉어낸다.
  • 이 때, 클라이언트는 php소스는 볼 수 없고, php파일은 html파일로 변환되어 브라우저에서 보여진다.
  • 웹 서버는 웹 페이지의 요청을 받아들여 php스크립트를 구동하고 html을 반환한다.

변수

  • PHP에서는 달러($) 기호를 사용하여 다음과 같이 변수를 선언합니다.
  • gettype() 함수는 인수로 전달받은 데이터의 타입을 출력하는 함수입니다.
  • 기본값으로 자동 초기화됩니다
  • 지역변수, 전역변수, 정적변수
    • 함수 밖에서 선언된 변수를 함수 내부에서 접근하고자 할 때는 global 키워드를 함께 사용해야 합니다.
        global $var; // 함수 내에서 사용할 전역 변수를 명시함
- PHP는 모든 전역 변수를 $GLOBALS 배열에 저장합니다.
        echo "함수 내부에서 호출한 전역 변수 var의 값은 {$var}입니다.<br>";
        echo "함수 내부에서 호출한 전역 변수 var의 값은 {$GLOBALS['var']}입니다.<br>";
- PHP 슈퍼 글로벌
    1. $GLOBALS
    2. $_SERVER
    3. $_GET
    4. $_POST
    5. $_FILES
    6. $_COOKIE
    7. $_SESSION
    8. $_REQUEST
    9. $_ENV

상수

    define("PHP", "PHP 수업에 잘 오셨습니다!<br>"); // 대소문자를 구분함.(기본 설정)
    define("PHP", "<br>PHP 수업에 잘 오셨습니다!", true); // 대소문자를 구분하지 않음.
  • 마법상수
__LINE__ 파일의 현재 줄 번호를 반환함.
__FILE__ 파일의 전체 경로와 이름을 반환함. include 내부에서 사용할 경우 include된 파일명을 반환함.
__DIR__	파일의 디렉터리를 반환함. 포함한 파일 안에서 사용할 경우 포함된 파일의 디렉터리를 반환함. dirname(__FILE__)과 같은 결과를 반환함.
__FUNCTION__ 함수의 이름을 반환함.
__CLASS__ 클래스의 이름을 반환함. 클래스 이름은 대소문자를 구분함.
__TRAIT__ 트레이트(trait)의 이름을 반환함. 트레이트의 이름은 트레이트를 선언한 네임스페이스를 포함함.
__METHOD__ 클래스의 메소드 이름을 반환함.
__NAMESPACE__ 현재 네임스페이스의 이름을 반환함.

타입

기본타입

    1. 불리언(boolean)
    1. 정수(integer)
    1. 실수(float)
    1. 문자열(string)
    1. 배열(array)
    1. 객체(object)
    1. 리소스(resource)
    1. NULL
      • NULL은 오직 한 가지 값(NULL 상수)만을 가질 수 있는 특별한 타입입니다.
      • NULL 타입의 변수란 아직 어떠한 값도 대입되지 않은 변수를 의미합니다.

타입변환

  • 자동 타입 변환
  • 강제 타입 변환
  • 가변 변수
echo $PHP;       // HTML
echo $$PHP;      // $HTML -> CSS
echo $$$PHP;     // $$HTML -> $CSS -> JavaScript

연산자

산술 연산자

대입 연산자

증감 연산자

비교 연산자

논리 연산자

비트 연산자

기타 연산자

- 문자열 연산자(string operator)
    - PHP에서 문자열 연산자(.)를 사용하여 문자열을 연결할 수 있습니다.
    - 또한, echo() 함수에서는 쉼표 연산자(,)를 이용하여 문자열을 연결할 수 있습니다.
- 배열 합집합 연산자(array union operator)
    - 배열 합집합 연산자(+)는 피연산자로 오는 두 배열의 합집합을 반환합니다.
- instanceof 연산자
    - 1. 해당 변수가 어떤 클래스(class)에서 생성된 객체(object)인지를 확인할 때
    - 2. 해당 변수가 부모 클래스(parent class)에서 상속받은 클래스인지를 확인할 때
    - 3. 해당 변수가 클래스의 인스턴스(instance)인지 아닌지를 확인할 때
    - 4. 해당 변수가 인터페이스(interface)로 구현한 클래스의 객체 인스턴스(object instance)인지 아닌지를 확인할 때

제어문

조건문

반복문

$arr = array(2, 4, 6, 8);
foreach ($arr as $value) {
    echo "변수 \$value의 현재값은 {$value}입니다.<br>";
}
unset($value);

* 위의 예제에서 변수 $value는 foreach 문 내에서만 사용하는 변수입니다.
따라서 foreach 문이 끝난 뒤에는 unset() 함수를 사용하여 해제해 주는 것이 좋습니다.

$arr = array(
    "둘" => 2,
    "넷" => 4,
    "여섯" => 6,
    "여덟" => 8,
);
foreach ($arr as $key => $value) {
    echo "배열 \$arr에서 키값 '{$key}'에 대한 값은 {$value}입니다.<br>";
}
unset($value);

기타 제어문

  • continue
    • switch 문에도 continue를 사용할 수 있어, switch 문을 반복문처럼 사용할 수 있습니다.
  • break
  • goto
    • 현재는 거의 사용하지 않습니다.
  • 제어문의 대체 문법
    • 대체 문법의 사용 방법은 우선 제어문의 여는 괄호({)를 콜론(:)으로 대체합니다. 그리고 닫는 괄호(})를 각각 endif;, endswitch;, endwhile;, endfor;, endforeach;로 대체하면 됩니다.
    <?php $var = 5; ?>
    <?php if ($var > 6): ?>
    변수의 값은 6보다 큽니다.   <!-- 이 부분은 HTML 구문임 -->
    <?php elseif ($var == 6): ?>
    변수의 값은 6입니다.        <!-- 이 부분은 HTML 구문임 -->
    <?php elseif ($var < 6): ?>
    변수의 값은 6보다 작습니다. <!-- 이 부분은 HTML 구문임 -->
    <?php endif; ?>

배열

배열 요소의 추가

  • 배열 요소의 인덱스를 생략할 수 있는데, 이 경우에는 인덱스가 0부터 시작하여 1씩 증가하며 순서대로 저장됩니다.
$arr[] = "apple";  // 배열 인덱스를 생략하여, 순서대로 배열에 추가됨.
$arr[] = "banana";
$arr[] = "orange";

배열의 홀(hole)

  • PHP에서는 배열의 특정 인덱스에만 배열 요소를 추가할 수 있습니다.
$arr = array();            // 배열의 생성
$arr[10] = "banana";       // 인덱스 10에만 배열 요소를 추가함.

var_dump($arr);
var_dump($arr[0]);         // NULL
var_dump(isset($arr[0]));  // false
var_dump(isset($arr[10])); // true
  • isset() 함수는 인수로 전달받은 변수가 초기화되어 있는지를 확인해 줍니다.

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

  • count() 함수는 배열의 모든 요소의 개수를 반환하는 함수입니다.
  • count() 함수는 배열 요소의 개수를 계산할 때 배열의 홀(hole)을 포함하지 않습니다. 홀을 가지는 배열에서는 정확한 배열의 길이를 구할 수 없습니다. 하지만 foreach 문을 사용하면 예제와 같이 홀이 아닌 배열 요소에만 정확히 접근할 수 있습니다.

연관 배열(associative array)

  • PHP에서는 숫자뿐만 아니라 문자열도 배열 요소의 인덱스로 사용할 수 있습니다.
$array = array();        // 배열 생성
$array["apple"] = 1000;  // 연관 배열 요소 추가
$array["banana"] = 2000;
$array["orange"] = 1500;

$array = array("apple" => 1000, "banana" => 2000, "orange" => 1500);
  • 만약 해당 배열이 존재하지 않으면, 해당 이름으로 새로운 배열을 만든 후에 배열 요소를 추가합니다.
$array["apple"] = 1000;  // 배열이 존재하지 않으므로, 먼저 배열을 생성한 후에 요소가 추가됨.
$array["banana"] = 2000;
$array["orange"] = 1500;
echo $array["apple"].", ".$array["banana"].", ".$array["orange"];
  • each() 함수는 배열 커서(array cursor)가 현재 가리키고 있는 배열 요소를 반환하고, 다음 배열 요소를 가리키도록 합니다. 이 함수는 가리키는 요소의 다음 요소가 배열의 마지막 요소라면 더는 동작하지 않습니다.
$array = array("apple" => 1000, "banana" => 2000, "orange" => 1500);

while($element = each($array)) {
    echo $element['key']." ".$element['value']."<br>";
}

함수

함수의 값 반환

  • PHP 7부터는 함수의 반환값을 원하는 타입으로 반환받을 수 있도록, 반환값의 타입을 직접 지정할 수 있습니다.
function sum($x, $y) : float // 반환값의 타입을 float 타입으로 설정함.
{
    return $x + $y;
}

...

var_dump(sum(3 + 4)); // float
  • strict 모드에서는 해당 위치에 나올 수 있는 적절한 타입 이외의 값이 나올 경우 타입 변환을 하지 않고 오류를 발생시킵니다.
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

매개변수의 전달 방식

  • 값 전달(passing by value)
function increment($para)
{
    $para++; // $value의 값을 복사하여 increment() 함수에 인수로 전달함.
}
$value = 1;
increment($value);
  • 참조 전달(passing by reference)
function increment(&$para) // 인수로 전달되는 값의 원본을 참조함.
{
    $para++;
}
$value = 1;
increment($value);

디폴트 매개변수(default parameter)

  • 디폴트 매개변수란 함수를 호출할 때 명시된 매개변수를 전달하지 않았을 경우에 사용하게 될 기본값을 의미합니다.
  • PHP에서 함수를 호출할 때 전달된 인수는 매개변수의 왼쪽부터 차례대로 대입됩니다.
function sum($value1, $value2 = 0, $value3 = 0)
{
    return $value1 + $value2 + $value3;
}

가변 길이 인수 목록(variable-length argument list)

  • PHP 5.6 이상부터는 위의 예제처럼 ‘…’ 토큰을 사용하여 함수가 호출될 때 전달받은 인수들을 배열 형태로 저장할 수 있습니다.
function sum(...$num) // PHP 5.6 이상
{
    $sum = 0;
    foreach($num as $n) {
        $sum += $n;
    }
    return $sum;
}

가변 함수(variable function)

  • PHP에서는 변수 이름에 괄호(())를 붙이면, 해당 변수의 값과 같은 이름을 가지는 함수를 호출합니다.
function first()
{
    echo "first() 함수입니다.<br><br>";
}
function second($para)
{
    echo "second() 함수입니다.<br>";

    echo "함수 호출 시 전달받은 인수의 값은 {$para}입니다.";
}
$func = "first";
$func();    // first() 함수를 호출함.
$func = "second"
$func(20);  // second() 함수를 호출함.

내장함수

변수의 타입 변경

  • is_array(), is_bool(), is_callable(), is_float(), is_double(), is_real(), is_int(), is_integer(), is_long(), is_null(), is_numeric(), is_object(), is_resource(),is_scalar(), is_string()

  • settype($x, “string”) 함수를 사용하면 전달받은 변수의 타입을 변경할 수 있습니다.

  • isset() 함수는 전달받은 변수가 선언되어 있는지를 검사

  • unset() 함수는 전달받은 변수를 제거합니다.

  • empty() 함수는 전달받은 변수가 비어있는지를 검사합니다.

    • PHP에서는 다음과 같은 값을 가지는 변수를 비어있다고 인식합니다.
      • 정수 0
      • 실수 0.0
      • 문자열 “0”
      • 빈 문자열 “”
      • null
      • false
      • 빈 배열 array()
      • 초기화되지 않은 변수
$var;
var_dump(isset($var)); // false
var_dump(empty($var)); // true

$var = 5;
var_dump(isset($var)); // true
var_dump(empty($var)); // false

$var = 0;
var_dump(isset($var)); // true
var_dump(empty($var)); // true

unset($var);
var_dump(isset($var)); // false
var_dump(empty($var)); // true
  • 특정 타입으로 변경 intval(), floatval(), strval()
$x = "123.56789abc";
echo intval($x);   // 123
echo floatval($x); // 123.56789
echo strval($x);   // 123.56789abc

배열 관련 함수

  • array()
  • count(), sizeof()
  • array_count_values() 함수는 전달받은 배열의 배열 요소 값을 모두 확인하여, 해당 값이 몇 번 등장하는지를 확인합니다.
$arr = array(1, 5, 7, 3, 3, 1, 2);
$acv = array_count_values($arr);                 // 1 : 2번, 5 : 1번, 7 : 1번, 3 : 2번, 2 : 1번
  • current() 함수와 pos() 함수는 배열 포인터가 현재 가리키고 있는 요소를 반환합니다.
  • next() 함수는 우선 배열 포인터를 앞으로 하나 이동시킨 후에, 해당 요소를 반환합니다.
  • prev() 함수는 next() 함수와는 반대로 우선 배열 포인터를 뒤로 하나 이동시킨 후에, 해당 요소를 반환합니다.
  • each() 함수는 배열 포인터가 현재 가리키고 있는 요소의 키와 값을 연관 배열로 반환하고, 배열 포인터를 앞으로 하나 이동시킵니다.
  • reset() 함수는 배열 포인터가 첫 번째 배열 요소를 가리키도록 한 뒤에, 해당 요소의 값을 반환합니다.
  • end() 함수는 reset() 함수와는 반대로 배열 포인터가 마지막 배열 요소를 가리키도록 한 뒤에, 해당 요소의 값을 반환합니다.
$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); // 이전 요소를 가리킨 후에 해당 요소를 반환함.
}

배열의 정렬

  • sort() 함수는 배열 요소들을 정렬 기준에 맞게 정렬합니다.
    • SORT_NUMERIC은 배열 요소를 숫자로 비교하며, SORT_STRING은 문자열로 비교하게 됩니다.
  • ksort() 함수는 각 요소의 키를 기준으로 정렬합니다.
  • asort() 함수는 각 요소의 값을 기준으로 정렬합니다.
  • array_multisort(), natcasesort(), natsort(), usort(), uksort(), uasort()

배열 요소의 재배치

  • shuffle() 함수는 배열 요소를 섞은 뒤에 무작위로 재배치합니다.
  • array_reverse() 함수는 전달받은 배열의 순서를 역순으로 변경한 새로운 배열을 반환합니다.

문자열 함수

  • strlen() : strlen() 함수에 영문자만이 아닌 한글이 포함된 문자열이 전달되면, 문자열의 길이가 아닌 문자열의 총 바이트(byte) 수를 반환합니다
  • mb_strlen() : 함수는 문자열뿐만 아니라 두 번째 인수로 인코딩 방식까지 전달받을 수 있습니다 // echo mb_strlen($str, “UTF-8”); // 7
  • strcmp() 함수는 전달받은 두 개의 문자열을 서로 비교합니다
  • strncasecmp()함수를 사용하면 대소문자를 구분하지 않고 두 개의 문자열을 비교할 수 있습니다.
  • strnatcmp() 함수와 strnatcasecmp() 함수는 영숫자 순(natural ordering)으로 문자열을 비교한다
    • strcmp() 함수는 “2”를 “10”보다 크다고 인식하지만, strnatcmp() 함수에서는 작다고 인식합니다.
  • strstr()함수와 strchr() 함수는 해당 문자열에서 전달받은 문자열과 처음으로 일치하는 부분을 찾습니다.
  • strrchr() 함수는 해당 문자열에서 전달받은 문자열과 마지막으로 일치하는 부분을 찾습니다.
  • stristr() 함수는 대소문자를 구분하지 않고 strstr() 함수와 같은 동작을 수행합니다.
  • strpos() 함수는 해당 문자열에서 전달받은 문자열과 처음으로 일치하는 부분의 시작 인덱스를 반환합니다.
  • strrpos() 함수는 해당 문자열에서 전달받은 문자열과 마지막으로 일치하는 부분의 시작 인덱스를 반환합니다.
  • substr() 함수는 해당 문자열에서 특정 인덱스부터 전달받은 길이만큼의 일부분을 추출하여 반환합니다.
  • strtolower() 함수는 전달받은 문자열의 모든 문자를 소문자로 바꿔줍니다.
  • strtoupper() 함수는 전달받은 문자열의 모든 문자를 대문자로 바꿔줍니다.
  • ucfirst 함수()는 전달받은 문자열의 첫 번째 문자만을 대문자로 바꿔줍니다.
  • ucwords() 함수는 전달받은 문자열에서 단어별로 첫 번째 문자만을 대문자로 바꿔줍니다.
  • explode() 함수는 특정 문자를 기준으로 전달받은 문자열을 나누어서 하나의 배열로 반환합니다.
  • implode() 함수와 join() 함수는 전달받은 배열의 각 요소를 특정 문자를 사용하여 하나로 합쳐친 문자열로 반환합니다.
  • strtok() 함수는 전달받은 문자열을 특정 문자를 기준으로 토큰화합니다.
$token = strtok($str2, '!');  // '!'를 기준으로 토큰화
echo $token;                  // hello
while($token != ""){          // 문자열이 끝날 때까지
    $token = strtok('!');     // '!'를 기준으로 토근화하고 출력함.
    echo $token;              // beautiful, world
}
  • str_replace() 함수는 해당 문자열에서 전달받은 문자열을 모두 찾은 후에, 찾은 문자열을 대체 문자열로 교체합니다.
  • substr_replace() 함수는 해당 문자열에서 특정 위치의 문자들을 대체 문자열로 교체합니다.
  • ltrim() 함수는 문자열 앞부분에 있는 공백을 제거하고, rtrim() 함수와 chop() 함수는 문자열 끝부분에 있는 공백을 제거합니다.
  • trim() 함수는 문자열의 처음과 끝부분에 있는 공백을 모두 제거합니다.
    • 띄어쓰기 “ “
    • 탭 문자 “\t”
    • 줄 바꿈 문자 “\n”, “\r”
    • 널 문자 “\0”
    • 수직 탭 문자 “\x0B”

날짜 함수

  • date() 함수는 전달받은 형식에 맞춰 날짜와 시간 정보를 문자열로 반환합니다.
  • mktime() 함수는 시, 분, 초, 월, 일, 연도를 인수로 전달받아서, 해당 날짜와 시간을 나타내는 타임스탬프(timestamp)를 반환합니다.
  • time() 함수는 인수를 전달받지 않고, 현재 날짜와 시간에 대한 타임스탬프를 반환합니다.
  • getdate() 함수는 인수로 전달받은 타임스탬프에 해당하는 정보를 연관 배열의 형태로 반환합니다.
  • date_default_timezone_set() 함수는 해당 스크립트에서 사용되는 날짜와 시간에 관련된 모든 함수에서 사용될 타임 존을 설정합니다.
  • checkdate() 함수는 전달받은 날짜의 유효성을 검사합니다.

수학 함수

  • max() 함수는 전달받은 수 중에서 가장 큰 수를 반환하며, min() 함수는 가장 작은 수를 반환합니다.
  • floor() 함수는 인수로 전달받은 값과 같거나 작은 수 중에서 가장 큰 정수를 반환합니다.
  • ceil() 함수는 반대로 인수로 전달받은 값과 같거나 큰 수 중에서 가장 작은 정수를 반환합니다.
  • round() 함수는 소수점에서의 반올림을 수행할 수 있습니다.
  • pow() 함수는 전달받은 수의 거듭제곱을 반환합니다.
  • exp() 함수는 인수로 지수를 전달받아, e의 거듭제곱을 계산하여 반환합니다.
  • log() 함수는 전달받은 수의 자연로그 값을 계산하여 반환합니다.
  • sin() 함수는 전달받은 수의 사인값을, cos() 함수는 코사인값을, tan() 함수는 탄젠트값을 반환합니다.
  • abs() 함수는 전달받은 수의 절댓값을 반환합니다.
  • rand() 함수는 0보다 크거나 같고 getrandmax() 함수의 반환값보다 작은 하나의 정수를 무작위로 생성하여 반환합니다.
    • getrandmax() 함수는 rand() 함수로 생성할 수 있는 정수의 최댓값을 나타냅니다.

정규식

  • 정규 표현식 리터럴
    • /검색패턴/플래그

preg_match()

if (preg_match('/공장/', $subject)) {
    echo "해당 문자열에서 '공장'을 발견했습니다.<br>";
} else {
    echo "해당 문자열에서 '공장'을 발견하지 못했습니다.<br>";
}

플래그(flags)

i	검색 패턴을 비교할 때 대소문자를 구분하지 않도록 설정함.
g	검색 패턴을 비교할 때 일치하는 모든 부분을 선택하도록 설정함.
m	검색 패턴을 비교할 때 여러 줄의 입력 문자열을 그 상태 그대로 여러 줄로 비교하도록 설정함.
y	대상 문자열의 현재 위치부터 비교를 시작하도록 설정함.
u	대상 문자열이 UTF-8로 인코딩된 것으로 설정함.
  • preg_match_all() 함수는 해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 모두 검색하여, 세 번째 인수로 전달되는 배열에 저장합니다.

특수 문자(special characters)

. 줄 바꿈 문자(\n)를 제외한 임의의 한 문자를 의미함.
? 해당 문자 패턴이 0번 또는 1번만 반복됨.
* 해당 문자 패턴이 0번 이상 반복됨.
+	해당 문자 패턴이 1번 이상 반복됨.
{...}	반복되는 횟수를 지정함.
^	문자열의 처음을 의미함.
$	문자열의 끝을 의미함.
\	특수문자를 무시함.
|	선택을 의미함. (OR)
(...)	그룹화의 시작과 끝을 의미함.
/.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 중 하나의 문자열

양화사(quantifier)

  • ’*‘는 바로 앞의 문자가 0번 이상 나타날 경우를 검색합니다. ({0, }와 같음)
  • ’+’는 바로 앞의 문자가 1번 이상 나타날 경우를 검색합니다. ({1, }과 같음)
  • ’?’는 바로 앞의 문자가 0번 또는 1번만 나타날 경우를 검색합니다. ({0,1}과 같음)
  • ‘{n,m}’은 바로 앞의 문자가 반복되는 횟수를 지정합니다. 바로 앞의 문자가 최소 n번이상 최대 m번이하로 나타날 경우를 검색합니다. (n과 m은 반드시 양의 정수이어야만 함)
   $subject = "PHP is cooooool!";

// 문자 'l' 바로 앞에 문자 'o'가 0 또는 1번 나타나는 경우를 검색함.
preg_match_all('/o?l/', $subject, $match_01);

// 문자 'l' 바로 앞에 문자 'o'가 0번 이상 나타나는 경우를 검색함.
preg_match_all('/o*l/', $subject, $match_02);

// 문자 'l' 바로 앞에 문자 'o'가 1번 이상 나타나는 경우를 검색함.
preg_match_all('/o+l/', $subject, $match_03)

// 영문 소문자가 1번 이상 나타나는 경우를 검색함.
// 즉, 영문 소문자만으로 이루어진 부분 문자열을 검색함.
preg_match_all('/[a-z]+/', $subject, $match_04);

위치 문자

  • ’^’는 단어의 맨 앞에 위치한 해당 패턴만을 검색합니다.
  • ’$’는 단어의 맨 뒤에 위치한 해당 패턴만을 검색합니다.
$subject = "abcdef defabc";

// 단어가 문자열 "abc"로 시작하는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함.
$match_01 = preg_replace('/^abc/', 'ABC',$subject);

// 단어가 문자열 "abc"로 끝나는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함.
$match_02 = preg_replace('/abc$/', 'ABC', $subject);
  • preg_replace() 함수는 해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 검색하여, 해당 부분을 두 번째 인수로 전달되는 문자열로 대체한 새로운 문자열을 반환합니다.

선택 문자

  • 특수문자 ‘|‘로 구분된 정규 표현식 중 어느 하나에만 일치해도 검색됩니다.

문자 클래스(character class)

  • 문자 클래스(character class)란 정규 표현식에서 명시된 범위에 해당하는 한 문자만을 선택하기 위해 사용되는 문자입니다. 이러한 문자 클래스는 꺾쇠 괄호([])를 사용하여 표현합니다.
/[0-3]/        // 0부터 3까지의 숫자에 해당하는 한 문자
/[a-z]/        // 영문 소문자에 해당하는 한 문자
/[0-9a-zA-Z]/  // 숫자 또는 영문 대소문자에 해당하는 한 문자

POSIX 문자 클래스

[:alnum:] 영문자와 숫자에 포함되는지를 확인함. [:alpha:] 영문 대소문자에 포함되는지를 확인함. [:lower:] 영문 소문자에 포함되는지를 확인함. [:upper:] 영문 대문자에 포함되는지를 확인함. [:digit:] 십진법 숫자에 포함되는지를 확인함. [:xdigit] 16진법 숫자나 문자에 포함되는지를 확인함. [:punct:] 구두점에 포함되는지를 확인함. [:blank:] 탭과 띄어쓰기에 포함되는지를 확인함. [:space:] 공백 문자에 포함되는지를 확인함. [:cntrl:] 제어 문자에 포함되는지를 확인함. [:print:] 출력할 수 있는 문자에 포함되는지를 확인함. [:graph:] 띄어쓰기를 제외한 모든 출력할 수 있는 문자에 포함되는지를 확인함.

한글 확인

① /[가-힣]/                // 한글 소리 마디
② /[\\x{ac00}-\\x{d7af}]/u // 한글 소리 마디의 유니코드 범위 목록값
  • ①번 정규 표현식은 언어 설정이 한글이 아닌 시스템에서는 동작이 안 될 수도 있습니다.
  • ②번 정규 표현식처럼 ‘u’플래그를 추가하여 해당 정규 표현식 문자열을 UTF-8로 인코딩된 것처럼 취급할 수 있습니다.
$kor = "홍길동";
$pattern = "/[가-힣]+/"; // 한글 소리 마디

if (preg_match($pattern, $kor, $matches_02)) {
    var_dump($matches_02);
} else {
    echo "{$eng}에는 한글이 포함되어 있지 않습니다.<br>";
}
  • 해당 문자열에서 한글만을 제거하는 예제입니다.
$text = "123가나abc다라";
$pattern = "/[\\x{ac00}-\\x{d7af}]+/u";         // 한글 소리 마디(UTF-8)

$arr = preg_match_all('/./u', $text, $matches); // 줄 바꿈 문자(\n)를 제외한 임의의 한 문자씩 검색함.
echo preg_replace($pattern, '', $text);         // 해당 문자가 한글이면, 빈 문자열로 대체함.

클래스

  • 프로그래밍에서 인스턴스(instance)란 메모리에 생성된 객체를 의미합니다.

늦은 정적 바인딩

  • self 키워드와 함께 범위 지정 연산자(::)를 사용하여 정적 바인딩 정적 메소드를 호출
  • static 키워드와 함께 범위 지정 연산자(::)를 사용하여 늦은 정적 바인딩 정적 메소드를 호출
lass A
{
    public static function className()
    {
        echo __CLASS__;
    }
    public static function printClass()
    {
        self::className();
    }
}

class B extends A
{
    public static function className()
    {
        echo __CLASS__;
    }
}

① B::printClass(); // A

class A
{
    public static function className()
    {
        echo __CLASS__;
    }
    public static function printClass()
    {
        static::className();
    }
}

class B extends A
{
    public static function className()
    {
        echo __CLASS__;
    }
}

① B::printClass(); // B

Form 처리

  • $_GET, $_POST
$name = $_POST["name"];
$email = $_POST["email"];

echo $name."님의 이메일 주소는 ".$email."입니다.";
  • filter_var()
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 주소인지를 검증함.

파일 처리

파일 읽기

$fp = fopen("list.txt", 'r');    // list.txt 파일을 읽기 전용으로 열고 반환된 파일 포인터를 $fp에 저장함.
while(!feof($fp)){               // 파일의 끝까지
    $member = fgets($fp);        // 한 줄씩 $member 변수에 저장하고
    echo $member."<br>";         // 출력함.
}

$fp = fopen("list.txt", 'r');    // list.txt 파일을 읽기 전용으로 열고 반환된 파일 포인터를 $fp에 저장함.
while(!feof($fp)){               // 파일의 끝까지
    $char = fgetc($fp);          // 한 글자씩 $char 변수에 저장하고
    if($char == "\n")            // 출력함.
        $char = "<br>";
    if(!feof($fp))
        echo $char;
}

echo readfile("list.txt"); //해당 파일에서 데이터를 한 번에 모두 읽어 들입니다.

fclose($fp); //파일은 fclose() 함수를 이용하여 닫을 수 있습니다.

파일 쓰기

$name = $_POST["name"];          // 전송받은 데이터 대입
$gender = $_POST["gender"];
$email = $_POST["email"];


echo "이름 : ".$name."<br/>";    // 데이터 출력
echo "성별 : ".$gender."<br/>";
echo "이메일 : ".$email;

$fp = fopen("list.txt", 'a');    // list.txt 파일을 쓰기 전용으로 열고 반환된 파일 포인터를 $fp에 저장.

$str = $name."\t".$gender."\t".$email."\n";
fwrite($fp, $str);               // list.txt 파일에 $str 변수를 저장함.

fclose($fp);                     // list.txt 파일 닫음.

echo "회원 등록 완료";
  • file_exists() : 파일 존재 여부 확인
  • filesize() : 파일 크기 확인
  • ftell() : 전달받은 파일 포인터가 현재 가리키고 있는 위치를 반환합니다.
  • rewind() : 전달받은 파일 포인터를 해당 파일의 맨 처음으로 이동시킵니다.
  • fseek() : 전달받은 파일 포인터를 특정 위치로 이동시킵니다.
    • SEEK_SET : 파일의 처음을 기준으로 함. (기본 설정)
    • SEEK_CUR : 파일 포인터의 현재 위치를 기준으로 함.
    • SEEK_END : 파일의 끝을 기준으로 함.
  • unlink() 함수는 전달받은 주소에 위치한 파일을 삭제합니다.

쿠키

  • PHP에서는 setcookie() 함수를 이용하여 쿠키를 생성할 수 있습니다.
  • 생성된 쿠키는 $_COOKIE[“쿠키이름”]을 통해 접근할 수 있습니다
<?php
    $cookieName = "city";
    $cookieValue = "서울";
    setcookie($cookieName, $cookieValue, time()+60, "/"); // 쿠키가 60초 간 지속됨.
?>

...

<?php
    if(!isset($_COOKIE[$cookieName])) { // 해당 쿠키가 존재하지 않을 때
        echo "{$cookieName}라는 이름의 쿠키는 아직 생성되지 않았습니다.";
    } else {                            // 해당 쿠키가 존재할 때
        echo "{$cookieName}라는 이름의 쿠키가 생성되었으며, 생성된 값은 '".$_COOKIE[$cookieName]."'입니다.";
    }
?>
<?php
    $cookieName = "city";
    $cookieValue = "서울";
    setcookie($cookieName, $cookieValue, time()-60, "/"); // 쿠키를 삭제함. unset($_COOKIE["city"])와 같음.
?>

...

- PHP에서 unset() 함수나 setcookie() 함수를 사용하면, 생성된 쿠키를 삭제할 수 있습니다.
<?php
    echo "{$cookieName}라는 이름의 쿠키가 삭제되었습니다.";
?>

세션

  • 세션 시작
session_start();
  • 세션 변수의 등록
$_SESSION["city"] = "부산"; // 세션 변수의 등록
$_SESSION["gu"] = "해운대구";

echo "세션 변수가 등록되었습니다!";
  • 세션 변수에 접근하기
echo "제가 살고 있는 도시는 {$_SESSION['city']}입니다.<br>";
echo "그 중에서도 {$_SESSION['gu']}에 살고 있습니다.<br>";

print_r($_SESSION); // 모든 세션 변수의 정보를 연관 배열 형태로 보여줌.
  • 세션 변수의 등록 해지
    • unset() 함수를 사용하면, 특정 이름의 세션 변수만을 해지할 수 있습니다.
    • 현재 등록된 모든 세션 변수를 해지하고자 할 때에는 session_unset() 함수를 사용하면 됩니다.
// 특정 세션 변수의 등록 해지

/* if(!isset($_SESSION["city"])) {
    echo "{$_SESSION['city']} 세션 변수가 삭제되었습니다.";
    unset($_SESSION["city"]);
} else {
    echo "해당 세션 변수가 등록되어 있지 않습니다.";
} */

session_unset();   // 모든 세션 변수의 등록 해지
session_destroy(); // 세션 아이디의 삭제
echo "모든 세션 변수가 등록 해지되었으며, 세션 아이디도 삭제되었습니다.";
  • isset() 함수를 사용하여, 그 값이 설정되어 있는지를 검사할 수 있습니다.

예외 처리

  • 자바와 같은 언어에서는 자동으로 예외를 던져 주지만, PHP는 예외를 수동으로만 던질 수 있습니다. PHP에서 throw 키워드를 사용하여 예외를 던질 수 있습니다.

  • 프로퍼티

    $message    예외 메시지
    $code       예외 코드
    $file       예외가 발생한 파일명
    $line	    예외가 발생한 라인
  • 메소드
    __construct() 생성자
    getMessage() 예외 메시지를 반환함.
    getCode() 예외 코드를 반환함.
    getFile() 예외가 발생한 파일의 경로를 반환함.
    getLine() 예외가 발생한 라인 번호를 반환함.
    getTrace() 발생한 예외에 대한 정보를 포함한 배열(Exception stack trace)을 반환함.
    getTraceAsString() getTrace()의 결과를 문자열로 반환함.
    __toString() 발생한 예외에 대한 정보를 문자열로 반환함.
try
{
    throw new Exception("예외 메시지"); // 예외 객체 던짐.
}
catch(Exception $ex)                    // 예외 처리
{
    echo $ex->getMessage()."<br>";
    echo "예외가 발생한 파일 경로 : ".$ex->getFile()."<br>";
    echo "예외가 발생한 라인 번호 : ".$ex->getLine();
}

사용자 정의 예외

  • Exception 클래스를 상속받은 자식 클래스는 Exception 클래스의 모든 프로퍼티와 메소드에 접근할 수 있습니다. Exception 클래스의 모든 메소드는 __tostring() 메소드를 제외하고는 오버라이딩할 수는 없습니다. 하지만 사용자 정의 예외 클래스에 사용자가 원하는 메소드를 추가할 수는 있습니다.
class CustomException extends Exception       // Exception 클래스를 상속 받아 예외 정의
{
    public function errorMessage()
    {
        $msg = $this->getMessage()."<br/>".

            "예외가 발생한 파일 경로 : ".$this->getFile()."<br/>".

            "예외가 발생한 라인 번호 : ".$this->getLine();
        return $msg;
    }
}

try
{
    throw new CustomException("예외 메시지"); // 예외 객체 던짐.
}
catch(CustomException $ex)                    // 예외 처리
{
    echo $ex->errorMessage();
}

xdebug

pecl install xdebug

php-fpm

  • PHP-fpm(PHP FastCGI Process Manager)는 보통의 CGI보다 빠른 버전입니다.
-- port 연결, 외부 연결
fastcgi_pass 127.0.0.1:9000;

-- 내부 소켓 연결
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

php-fpm xdebug

pecl install xdebug
(X) COPY ./conf/xdebug.ini /etc/php/7.2/cli/conf.d/
(O) COPY ./conf/xdebug.ini /etc/php/7.2/fpm/conf.d/

project/.vscode/launch.json
    {
        "name": "Listen for Xdebug",
        "type": "php",
        "request": "launch",
        "hostname":"localhost",
        // "hostname":"host.docker.internal",
        "port": 9003,
        "pathMappings": {
            "/var/www": "${workspaceFolder}"
        }
    },

xdebug.ini
    zend_extension="xdebug.so"
    xdebug.log="/var/www/path_to_log/xdebug.log"
    xdebug.mode=develop,debug
    xdebug.client_port=9003
    xdebug.start_with_request=yes
    xdebug.discover_client_host=0
    xdebug.client_host=host.docker.internal
    # xdebug.client_host=localhost
    xdebug.output_dir="/var/www/path_to_log/"
    xdebug.idekey=VSCODE

phpunit

brew install phpunit
./phpunit --version
<?php
use PHPUnit\Framework\TestCase;

class StackTest extends TestCase {
    public function testPushAndPop() {
        $stack = [];
        $this->assertEquals(0, count($stack));

        array_push($stack, 'foo');
        $this->assertEquals(1, count($stack));

        $this->assertEquals('foo', array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
}

$ phpunit StackTest.php
$ phpunit tests/Unit/StackTest.php

// $ phpunit --bootstrap vendor/autoload.php  tests/Unit/ExampleTest.php


<?php
class Money
{
    private $amount;

    public function __construct($amount)
    {
        $this->amount = $amount;
    }

    public function getAmount()
    {
        return $this->amount;
    }

    public function negate()
    {
        return new Money(-1 * $this->amount);
    }
     // ...
}

 <?php
use PHPUnit\Framework\TestCase;
use App\Money;

class MoneyTest extends TestCase
{
    // ...

    public function testCanBeNegated()
    {
        // Arrange
        $a = new Money(1);

        // Act
        $b = $a->negate();

        // Assert
        $this->assertEquals(-1, $b->getAmount());
    }

    // ...
}
$this->assertTrue(true);

HTTP Tests

Console Tests

Browser Tests

Database Testing

Mocking

code sniffer

composer require --dev "squizlabs/php_codesniffer"
composer global require "squizlabs/php_codesniffer=*"

./vendor/bin/phpcs app/Jobs/ProcessCalculateDistanceTime.php

php로드확인

php -m

<?php
phpinfo();

PHP버전전환

brew link –force –overwrite php@7.4

brew unlink php@7.4 brew link –force –overwrite php@8.3