일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- php
- BANDiT
- FTZ
- file upload
- War Game
- access control
- overthewire
- Recon
- OS Command Injection
- 파일 업로드 취약점
- Authentication
- Leviathan
- active recon
- over the wire
- THM
- Server Side Request Forgery
- sql injection
- php file upload
- php To Do List
- privilege escalation
- ssrf
- Cookie
- Cryptography
- php login page
- tryhackme
- php 로그인 페이지 만들기
- Reconnaissance
- php 파일 업로드하기
- SQLi
- active reconnaissance
- Today
- Total
R's Hacking Daily Log
php 객체 지향 프로그램 (5) 본문
Step :: Trait
Trait이라는 기능은 앞에서 배운 클래스와 인터페이스 그 사이 어딘가...!
추상 클래스인 듯 아닌 듯 한 애매한 기능이다.
다중 상속의 문제점을 줄이고 공통적으로 사용하는 메서드 & 멤버 변수를 재사용하기 위해
설계된 기능이다 보니 "클래스, 인터페이스와 뭐가 다르지?"라는 애매모호함을 느낄 것이다.
인터페이스와는 달리 함수의 내용을 정의 & 구현을 할 수 있지만
인터페이스처럼 함수를 정의만 해둘 수도 있다.
추상 클래스처럼 비추상 메서드 & 추상 메서드를 포함할 수도 있고 추상 메서드만 정의할 수도 있다.
말 그대로 이 기능 저 기능을 가져다가 입맛대로 쓸 수 있는 기능이라 보면 된다.
어떻게 활용할 수 있을 지 이해를 돕기 위해 코드를 살펴보도록 하자.
<?php
trait Sound {
abstract public function sound();
public function introduce() {
echo "{$this->type} {$this->name} 출발합니다.<br/>";
}
}
클래스와 동일하게 trait keyword를 사용하면 trait를 생성할 수 있다.
trait Sound는 추상 메서드인 sound() & 비추상메서드인 introduce()를 포함하고 있다.
이처럼 trait는 추상클래스가 아님에도 불구하고 추상 메서드를 포함하는 게 가능하다.
class Train {
public string $type;
public string $name;
use Sound;
public function sound() {
echo "뿌-뿌-<br/>";
}
}
class Bus {
public string $type;
public string $name;
use Sound;
public function sound() {
echo "빵빵~<br/>";
}
}
다음으로 클래스 Train & Bus를 생성한다.
각 클래스는 멤버 변수 type & name을 갖고 있으며 trait를 선언했기 때문에 sound()를 구현할 수 있다.
trait는 공통적으로 사용되는 부분을 정의 OR 구현해놓고 클래스에서 가져다 쓰는 느낌으로 활용된다.
trait를 사용하고 싶을 때는 [ use keyword + Trait_NAME ] 형식으로 작성하면 끝!
trait에서 함수 sound를 추상 메서드로 정의해놨기 때문에 각 클래스에서 trait를 선언 후
클래스에 알맞게 함수 내용을 구현하고 있는 걸 볼 수 있다.
$train = new Train();
$train->type = "train";
$train->name = "H11";
$train->sound();
$train->introduce();
$bus = new Bus();
$bus->type = "bus";
$bus->name = "8301";
$bus->sound();
$bus->introduce();
Train & Bus class의 객체를 만들어주고 멤버 변수 값을 할당한다.
객체 train & bus의 sound 함수를 호출하면 위에서 구현한 대로 경적 소리가 출력될 것이다.
introduce 함수 같은 경우는 this를 활용해 객체의 type & name을 반영한 문구가 출력되는 데
trait를 가져와서 사용했기 때문에 클래스 내에서 작성하지 않아도 문제없이 실행된다.
상속받은 경우 부모 클래스의 함수를 자유롭게 호출할 수 있는 원리와 같다고 볼 수 있다.
결과를 보면 train 객체의 문구가 출력되고 bus 객체의 문구가 출력된 걸 볼 수 있다.
살펴본 바와 같이 trait는
이미 구현된 함수를 상속받듯이, 인터페이스에 정의해 둔 함수를 작성하듯이,
추상 클래스가 가질 만한 추상 메서드를 정의하듯이 이리저리 사용할 수 있는 기능이라 할 수 있다!
'PHP' 카테고리의 다른 글
php 예외 처리 (0) | 2023.07.19 |
---|---|
php 객체 지향 프로그램 (6) (0) | 2023.07.18 |
php 객체 지향 프로그램 (4) (0) | 2023.07.16 |
php 객체 지향 프로그램 (3) (0) | 2023.07.13 |
php 객체 지향 프로그램 (2) (0) | 2023.07.12 |