하나의 특별한 목적의 작업을 수행하도록 설계된 독립적인 블록
반복적인 코드의 작성을 피하고 손쉽게 유지보수 가능
- 함수 이름
- 괄호 안에 쉼표(,)로 구분되는 함수의 매개변수(parameter)
- 중괄호({})로 둘러싸인 PHP 수행 코드

오버로딩을 지원하지 않으므로, 이미 선언된 함수를 다시 선언 불가능
해당 함수가 정의된 PHP 스크립트에서만 호출 가능
모든 함수와 클래스는 전역 범위(global scope)를 가짐
같은 스크립트 내에서는 함수가 내부에서 정의되어도 외부에서 호출 가능하며 외부에서 정의되었어도 내부에서 호출 가능

함수의 반환값을 원하는 타입으로 반환받을 수 있도록, 반환값의 타입을 직접 지정 가능

-> 강한 강도로 반환 타입을 설정하는 예제
-> declare문을 이용해 strict 모드 설정
=> strict 모드에서는 해당 위치에 나올 수 있는 적절한 타입 이외의 값이 나올 경우 타입 변환을 하지 않고 오류를 발생
매개변수(parameter)란 함수를 호출할 때 인수로 전달된 값을 함수 내부에서 사용할 수 있게 해주는 변수
기본적으로 함수의 인수는 값 전달(passing by value) 방식
-> 인수를 함수에 전달하면, 새롭게 생성된 매개변수에 전달받은 값이 복사되어 저장

인수로 전달받은 값을 복사하는 것이 아닌, 전달받은 원본 데이터에 대한 참조 변수를 매개변수에 전달
-> 함수 내부에서 값을 변경하면, 함수 밖의 원본 데이터도 바뀜

함수를 호출할 때 명시된 매개변수를 전달하지 않았을 경우에 사용하게 될 기본값
-> 함수 호출 시 전달할 인수의 수를 유연하게 설정

함수를 선언할 때 전달 받을 인수의 개수를 미리 정하지 않고, 호출할 때마다 유동적으로 인수를 넘기는 기능
func_get_args() 함수 예시)

…토큰 예시)

특정 조건을 만족할 때만 선언되는 함수
함수 안에 또 다른 함수를 선언
함수 내부에서 함수가 자기 자신을 또다시 호출하는 함수

변수를 사용하여 함수를 호출하는 것
-> 변수에 함수의 이름을 별도로 지정 가능

gettype(): 변수를 전달하면 타입에 따라 해당 타입의 이름을 문자열로 반환
settype(): 전달 받은 변수의 타입을 변경
| is_callable() | 변수의 내용을 함수처럼 호출할 수 있는지 확인 |
|---|---|
| is_resource() | 전달 받은 변수의 타입이 자원인지 확인 |
| is_scalar() | 전달 받은 변수가 스칼라 값인지 확인 |
isset(): 전달 받은 변수가 선언되어 있는지 검사
unset(): 전달 받은 변수 제거
empty(): 전달 받은 변수가 비어 있는지 검사
intval(): 전달 받은 변수에 해당하는 정수 반환
floatval(), doubleval(): 전달 받은 변수에 해당하는 실수 반환
strval(): 전달 받은 변수에 해당하는 문자열 반환
count(), sizeof(): 배열에 저장된 배열 요소의 개수 반환
array_count_values(): 전달 받은 배열의 배열 요소 값을 모두 확인해 해당 값이 몇 번 등장하는지 확인
current() , pos(): 배열 포인터가 현재 가리키고 있는 요소 반환
next(): 배열 포인터를 앞으로 하나 이동 시킨 후에, 해당 요소 반환
prev(): next()와 반대로 배열 포인터를 뒤로 하나 이동 시킨 후 해당 요소 반환
each(): 배열 포인터가 현재 가리키고 있는 요소의 키와 값을 연관 배열로 반환하고, 배열 포인터를 앞으로 하나 이동
reset(): 배열 포인터가 첫 번째 배열 요소를 가리키도록 한 뒤 해당 요소의 값 반환
end(): reset()와 반대로 배열 포인터가 마지막 배열 요소를 가리키도록 한 뒤 해당 요소의 값 반환

sort(): 배열 요소들을 정렬 기준에 맞게 정렬
SORT_NUMERIC: 배열 요소를 숫자로 비교
SORT_STRING: 배열 요소를 문자열로 비교
인덱스를 숫자가 아닌 문자열을 사용해 키와 요소의 값으로 따로 정렬
ksort(): 각 요소의 키를 기준으로 정렬
asort(): 각 요소의 값을 기준으로 정렬
shuffle(): 배열 요소를 섞은 뒤에 무작위로 재배치
array_reverse(): 전달 받은 배열의 순서를 역 순으로 변경한 새로운 배열을 반환
-> 원본 배열에 영향을 주지 않는 함수여서 원본 배열과 순서가 정반대인 새로운 배열을 생성해 반환
-> 한글이 포함된 문자열이 전달되면, 문자열의 길이가 아닌 문자열의 총 바이트(byte) 수 반환
첫 번째 인수의 문자열이 두 번째 인수의 문자열보다 크면 양수, 작으면 음수, 같으면 0 반환
대소문자 구분
strstr(), strchr(): 해당 문자열에서 전달 받은 문자열과 처음으로 일치하는 부분 찾아 true,false 반환
strrchr(): 해당 문자열에서 전달 받은 문자열과 마지막으로 일치하는 부분을 찾음
strpos(): 해당 문자열에서 전달 받은 문자열과 처음으로 일치하는 부분의 시작 인덱스 반환
strrpos(): 해당 문자열에서 전달 받은 문자열과 마지막으로 일치하는 부분의 시작 인덱스 반환
substr(): 해당 문자열에서 특정 인덱스부터 전달 받은 길이만큼 일부분을 추출하여 반환
strtolower(): 전달 받은 문자열의 모든 문자를 소문자
strtoupper(): 전달 받은 문자열의 모든 문자를 대문자
ucfirst(): 전달 받은 문자열의 첫 번째 문자만 대문자
ucwords(): 전달 받은 문자열에서 단어 별로 첫 번째 문자만 대문자
explode(): 특정 문자를 기준으로 전달 받은 문자열을 나누어서 하나의 배열로 반환
implode(), join(): 전달 받은 배열의 각 요소를 특정 문자를 사용하여 하나로 합쳐친 문자열로 반환
strtok(): 전달 받은 문자열을 특정 문자를 기준으로 토큰화
str_replace(): 해당 문자열에서 전달 받은 문자열을 모두 찾은 후 문자열을 대체 문자열로 교체
substr_replace() 함수는 해당 문자열에서 특정 위치의 문자들을 대체 문자열로 교체
ltrim(): 문자열 앞 부분에 있는 공백 제거
rtrim(), chop(): 문자열 끝 부분에 있는 공백 제거
trim(): 문자열의 처음과 끝 부분에 있는 공백 모두 제거
띄어쓰기 " "
탭 문자 "\t"
줄 바꿈 문자 "\n", "\r"
널 문자 "\0"
수직 탭 문자 "\x0B"
문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴
슬래시(/) 기호로 시작해 슬래시(/) 기호로 끝남
/검색패턴/플래그
해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 검색
preg_match($ pattern, $ subject [,$matches]);
-> 첫 번째 인수로 전달받은 정규 표현식에 해당하는 패턴을 두 번째 인수로 전달받은 문자열에서 검색
| 플래그(flag) | 설명 |
|---|---|
| i | 검색 패턴을 비교할 때 대소문자를 구분하지 않도록 설정 |
| g | 검색 패턴을 비교할 때 일치하는 모든 부분을 선택하도록 설정 |
| m | 검색 패턴을 비교할 때 여러 줄의 입력 문자열을 그대로 여러 줄로 비교하도록 설정 |
| y | 대상 문자열의 현재 위치부터 비교를 시작하도록 설정 |
| u | 대상 문자열이 UTF-8로 인코딩된 것으로 설정 |
| 특수 문자 | 설명 |
|---|---|
| . | 줄 바꿈 문자(\n)를 제외한 임의의 한 문자 의미 |
| ? | 해당 문자 패턴이 0번 또는 1번만 반복 |
| * | 해당 문자 패턴이 0번 이상 반복 |
| + | 해당 문자 패턴이 1번 이상 반복 |
| {...} | 반복되는 횟수를 지정 |
| ^ | 문자열의 처음을 의미 |
| $ | 문자열의 끝을 의미 |
| \ | 특수문자를 무시 |
| (...) | 그룹화의 시작과 끝을 의미 |
정규 표현식에서 명시된 범위에 해당하는 한 문자만을 선택하기 위해 사용되는 문자
꺾쇠 괄호([])를 사용
| 스 | 설명 |
|---|---|
| [:alnum:] | 영문자와 숫자에 포함되는지 확인 |
| [:alpha:] | 영문 대소문자에 포함되는지 확인 |
| [:lower:] | 영문 소문자에 포함되는지 확인 |
| [:upper:] | 영문 대문자에 포함되는지 확인 |
| [:digit:] | 십진법 숫자에 포함되는지 확인 |
| [:xdigit] | 16진법 숫자나 문자에 포함되는지 확인 |
| [:punct:] | 구두점에 포함되는지 확인 |
| [:blank:] | 탭과 띄어쓰기에 포함되는지 확인 |
| [:space:] | 공백 문자에 포함되는지 확인 |
| [:cntrl:] | 제어 문자에 포함되는지 확인 |
| [:print:] | 출력할 수 있는 문자에 포함되는지 확인 |
| [:graph:] | 띄어쓰기를 제외한 모든 출력할 수 있는 문자에 포함되는지 확인 |
1. /^[[:digit:]]{2}-[[:digit:]]{4}-[[:digit:]]{4}/ // 02-1234-5678, ...
2. /^[[:digit:]]{2,3}-[[:digit:]]{3,4}-[[:digit:]]{4}/ // 02-1234-5678, 031-123-5678, 010-1234-5678, ...

HTML form 요소가 전송한 데이터를 처리하기 위해서는 PHP와 같은 서버 사이드 스크립트 언어를 사용
사용자로부터 이름과 이메일 입력 받는 예시)

form 요소에서 전송한 데이터를 처리하는 PHP 스크립트 예제)

GET 방식
주소에 데이터를 추가하여 전달하는 방식
브라우저에 의해 캐시되어(cached) 저장 → 보안상 취약점이 존재
보통 쿼리 문자열(query string)에 포함되어 전송되므로, 길이 제한 있음
POST 방식
데이터를 별도로 첨부하여 전달하는 방식
브라우저에 의해 캐시 되지 않으므로 히스토리에도 남지 않음
데이터의 길이에 대한 제한도 없으며, GET 방식보다 보안성이 좋음
간단한 회원 가입 양식 예제)
<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>
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = $_POST["name"];
$gender = $_POST["gender"];
$email = $_POST["email"];
$website = $_POST["website"];
$favtopic = $_POST["favtopic"];
$comment = $_POST["comment"];
PHP 스크립트로 처리된 결과를 보여주는 코드)
echo "<h2>입력된 회원 정보</h2>";
echo "이름 : ".$name."<br>";
echo "성별 : ".$gender."<br>";
echo "이메일 : ".$email."<br>";
echo "홈페이지 : ".$website."<br>";
echo "관심 있는 분야 : ";
if (!empty($favtopic)) {
foreach ($favtopic as $value) {
echo $value." ";
}
}
echo "<br>기타 : ".$comment; ?>
사용자가 반드시 입력해야 하는 필수 input 요소에 데이터가 모두 입력 되었는지 검증
empty() 함수나 isset() 함수 사용
이름, 성별, 관심 있는 분야에 대해 필수 입력 검증
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"];
}
⇒
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
<p class="alert">* : 필수 입력 사항</p>
이름 : <input type="text" name="name"><span class="alert"> * <?php echo $nameMsg ?></span>
성별 :
<input type="radio" name="gender" value="female">여자
<input type="radio" name="gender" value="male">남자 <span class="alert"> * <?php echo $genderMsg ?></span>
이메일 : <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"> 코딩
<span class="alert"> * <?php echo $favtopicMsg ?></span>
기타 : <textarea name="comment"></textarea>
<input type="submit" value="전송">
</form>
사용자가 입력한 데이터가 이러한 형식에 맞는 유효한 데이터인가 검증
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameMsg = "이름을 입력해 주세요!";
} else {
$name = $_POST["name"];
// 이름의 입력 형식 검증
if (!preg_match("/^[a-zA-Z가-힣 ]*$/", $name)) {
$nameMsg = "영문자와 한글만 가능합니다!";
}
}
...
if (empty($_POST["email"])) {
$emailMsg = "";
} else {
$email = $_POST["email"];
// 이메일의 입력 형식 검증
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailMsg = "이메일을 정확히 입력해 주세요!";
}
}
if (empty($_POST["website"])) {
$websiteMsg = "";
} else {
$website = $_POST["website"];
// 홈페이지 URL 주소의 입력 형식 검증
if (!filter_var($email, FILTER_VALIDATE_URL)) {
$websiteMsg = "홈페이지의 주소를 정확히 입력해 주세요!";
}
}
...
}
이름
이메일과 URL 주소
| FILTER_VALIDATE_URL | 해당 변수가 유효한 URL 주소인지 검증 |
|---|---|
| FILTER_VALIDATE_EMAIL | 해당 변수가 유효한 이메일 주소인지 검증 |