바인딩
바인딩이 뭐지...
이름을 속성에 연관시키는 과정
속성과 개체 사이 or 연산과 기호 사이 같은 연관
바인딩이 일어나는 시간을 바인딩 시간이라고 부른다
바인딩 시간
이름에 속성이나 값이 연결되는 시점
여기서 정적 바인딩과 동적 바인딩이 분리됨
정적 바인딩 |
동적 바인딩 |
컴파일 시간에 결정 |
런타임에 결정 |
C언어 컴파일 시간에 변수의 데이터 타입 결정 |
Python 런타임에 값에 따라 변수의 데이터 타입 결정 |
컴파일 시간에 미리 다 해뒀으므로 실행 효율이 좋음 |
런타임 도중에 자유롭게 성격이 바뀌므로 적용성이 좋음 |
그리고 PHP에서 둘의 중간 정도 수준의 LSB를 제공함
늦은 정적 바인딩(Late static bindings)
<정적 바인딩의 예시>
class 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(); //
현재 클래스를 참조하는 self::와 상수 __CLASS__는 사용하는 메소드가 어디에 정의되어 있는가에 따라 값이 결정된다.
마지막 줄을 실행하면 A가 표시되는 이유는 printClass 메소드가 A에서 정의되었기 때문이다... ?
self:: 와 __CLASS__는 현재 메소드가 정의된 클래스에 따라 값이 결정된다
늦은 정적 바인딩을 사용하면 클래스 B에서 호출한 printClass() 메소드가 B를 참조하게 할 수 있다
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
Form 처리
HTML 폼 요소가 전송한 데이터를 처리한다.
<html>
<body>
<form action="request.php" method="post">
이름: <input type="text" name="name"><br>
이메일 : <input type="text" name="email"><br>
<input type="submit">
</form>
</body>
</html>
위의 html 문서에 이런 양식의 form을 넣어줬을 때
form의 action 값에는 서버의 php 스크립트 파일 주소를 명시한다.
위 요소에서 전송한 데이터를 php 스크립트로 처리한다.
$name = $_POST["name"];
$email = $_POST["email"];
echo $name."님의 이메일 주소는 ".$email."입니다.";
HTTP 요청 방식
브라우저(클라이언트)에서 서버로 HTTP 요청을 보낼 때는
1. GET 방식
2. POST 방식
두 방식 모두 입력받은 데이터를 연관 배열로 전송한다.
키값은 input 요소의 name 속성값이 되고, 값은 사용자가 입력한 데이터가 된다.
슈퍼 글로벌 배열($_GET , $_POST)을 사용해서 어디서든 제약없이 접근할 수 있다.
GET 방식
주소에 data를 추가하여 전달하는 방식
브라우저에 의해 캐시된다(cached)
쿼리 문자열(query stirng)에 포함되므로 길이의 제한이 있다.
보안상 취약점이 존재한다.
POST 방식
데이터를 별도로 첨부하여 전달하는 방식
브라우저 히스토리에 남지 않는다.
쿼리 문자열과 별도로 전송된다.
보안성이 높고 길이 제한도 없다.
Form 검증(validation)
input 별로 적합한 데이터를 입력받았는지 검증하는 규칙을 설정할 수 있다.
<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>
메소드 속성값으로 post를 사용해서 post 방식으로 http 요청을 보냈다.
action 속성값으로 사용한 $_SERVER는 슈퍼 글로벌로, 인덱스로 "PHP_SELF"를 사용하면 현재 실행중인 PHP 스크립트의 파일 이름을 반환한다.
htmlspecialchars() 함수는 인수로 전달받은 문자열에 포함된 특수 문자들을 HTML 엔티티로 변환해 HTML 코드가 있어도 작동하지 못하게 한다
if($_SERVER["REQUEST_METHOD"] == "POST"){
$name = $_POST["name"];
...
}
필수 입력 검증
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["name"];
}
}
empty() 함수는 !isset($var) || $var==false 와 같은 동작을 하므로 대체가 가능하다.
-검증 필터
검증 필터 | 설명 |
---|---|
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 주소인지를 검증함. |
검증 아래에
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
$emailMsg = "이메일을 정확히 입력해주세요!";
}
filter_var() 함수 -> 입력 형식 검증에 사용할 수 있는 함수.