일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- access control
- War Game
- php file upload
- php To Do List
- BANDiT
- THM
- overthewire
- tryhackme
- OS Command Injection
- Cryptography
- active recon
- 파일 업로드 취약점
- php
- php login page
- php 파일 업로드하기
- file upload
- privilege escalation
- ssrf
- over the wire
- Authentication
- Reconnaissance
- php 로그인 페이지 만들기
- sql injection
- Cookie
- Leviathan
- Server Side Request Forgery
- active reconnaissance
- Recon
- FTZ
- SQLi
- Today
- Total
R's Hacking Daily Log
php 객체 지향 프로그램 (2) 본문
Step 1 :: 의사 변수 this
앞에서는 클래스가 무엇이고 객체가 무엇인지 훑어본 느낌이라면
지금부터 살펴볼 내용은 클래스나 객체와 관련된 개념들을 얹어가는 느낌이다.
첫 번째로 살펴볼 내용은 this이다.
의사 변수 this는 메서드 내에서만 사용할 수 있는 예약어이다.
다른 말로 하자면 클래스 안에 정의된 함수로 활용 영역이 제한된다.
this는 현재 자기 자신을 의미하는 데 쉽게 말해 클래스를 지칭한다.
<?php
class Fruit {
public $name;
public $color;
function set_fruit(string $name, string $color) {
$this->name = $name;
$this->color = $color;
}
}
$apple = new Fruit();
$apple->set_fruit("apple", "red");
echo $apple->name;
전체적인 코드 분석을 먼저 해보면
1) Fruit라는 클래스를 생성
2) Fruit는 name & color라는 멤버 변수와 set_fruit라는 멤버 함수를 가지고 있음
3) apple 객체를 생성
4) apple의 멤버 함수를 이용해 값을 설정
5) apple의 name 값을 출력
이때 주목할 점은 클래스의 멤버 변수에 값이 할당되어있지 않다는 것이다.
그 말은 처음 apple 객체를 생성한 시점에선 멤버 변수가 null 값을 갖고 있다는 의미가 된다.
그렇기 때문에 set_fruit 멤버 함수를 이용해 apple의 name & color 변수에 값을 할당해 줬다.
set_fruit 함수를 보면 매개변수로 name & color 값을 받아 그 값을 this->name & this->color에
각각 할당해 준다.
여기서 사용된 this가 바로 의사 변수 this이다.
this는 현재 자기 자신을 의미한다고 했는데 위의 경우에서 자기 자신이란 객체 apple이 된다.
클래스 Fruit로 객체 apple을 만들면 apple은 당연히 멤버 함수 set_fruit를 가지게 된다.
이 함수에 접근하기 위해 apple에서 화살표 지시자로 apple의 set_fruit 함수를 가리킨 것이다.
apple의 set_fruit 함수가 실행되는 시점에서 set_fruit 안의 this가 나타내는 값은 apple이기 때문에
객체 apple의 name & color 값을 설정할 수 있게 되는 흐름이다.
만약 banana라는 객체를 만들어서 banana->set_fruit("banana", "yellow")를 실행하면
이때 set_fruit 안의 this가 의미하는 바는 객체 banana가 된다.
Step 2 :: 접근 제어자 [ access modifiers ]
접근 제어자는 클래스 간 또는 패키지 간의 접근 권한을 지정하는 예약어이다.
접근 제어자는 public, protected, private, default, var로 총 5개다.
var의 경우,
php 구 버전에서 public, protected, private 대신 사용했던 접근 제어자로 접근 권한은 public과 동일하다.
default 경우는
접근 제어자를 사용하지 않은 경우 적용되는 접근 제어자로 접근 권한은 public과 동일하다.
1) public
public 접근 제어자로 선언된 멤버 변수와 메서드는
실행 중인 동일한 패키지 내부뿐만 아니라 외부 패키지에서도 접근이 가능하다.
2) protected
protected 접근 제어자로 선언된 경우에는 클래스 자기 자신과 상속받은 하위 클래스에서만 접근 가능하다.
3) private
private 접근 제어자로 선언된 경우에는 클래스 자기 자신의 메서드에서만 접근이 가능하다.
클래스를 상속받은 하위 클래스라고 하더라도 private로 선언된 멤버 변수나 메서드는 접근할 수 없다.
** 여기서 말하고 있는 상속이라는 개념은 후에 다룰 것이기 때문에 여기서는 그냥 그렇구나 하고 넘어가도록 하자.
Step 3 :: 생성자와 소멸자 [ Constructor & Destructor ]
생성자란 __construct()라는 이름의 메서드를 말한다.
생성자는 객체가 생성될 때 가장 먼저 자동 실행되는 함수로 꼭 정의해야 하는 것은 아니다.
멤버 변수에 초기값을 할당하거나 객체가 만들어졌을 때 실행시키고 싶은 내용이 있다면
생성자를 이용하면 된다.
다른 언어와 달리 php에서는 생성자의 이름이 고정되어 있다.
보통은 클래스명과 동일한 이름의 함수로 생성자를 만드는 데 php는 __construct라는 이름을 갖는다.
<?php
class Example {
protected $name;
public function __construct() {
$this->name = 'Hong';
echo $this->name;
}
}
$e = new Example();
생성자는 객체를 생성할 때 자동 실행되는 함수라고 앞에서 설명하였다.
그 말은 즉슨, 위의 코드에서 생성자가 실행되는 타이밍이 객체가 생성되는 마지막 줄이라는 뜻이다.
클래스 Example에서 멤버 변수 name을 선언해 두고 생성자에서 이 값을 Hong으로 할당 후 출력한다.
따라서 Example 클래스로 만든 객체는 모두 "Hong"을 초기 name으로 가지게 된다.
생성자가 동작했는지 확인하기 위해 결과를 확인해 보자!
new CLASS_NAME으로 객체를 생성할 때 생성자가 실행되기 때문에
클래스 안에 정의된 __construct() 내용대로 name에 할당되었어야 할 Hong이 출력되는 걸 확인할 수 있다.
이번엔 생성자와 상반되는 소멸자에 대해 알아보자.
소멸자란 __destruct()라는 이름의 메서드를 말한다.
이름대로 생성된 객체가 더 이상 참조되지 않을 때 해당 객체가 소멸되기 직전 실행되는 함수를 의미한다.
스크립트 실행이 종료되면 스크립트에서 사용된 객체들은 더 이상 사용되지 않는다.
이때 소멸자가 정의되어 있는 경우 객체가 메모리에서 제거되기 전에 소멸자가 호출된다.
생성자는 객체가 만들어진 후 맨 처음 실행되는 함수라면 소멸자는 맨 마지막에 실행되는 함수라고 할 수 있다.
또한 생성자와 달리 소멸자는 매개변수를 가질 수 없는 함수라는 걸 알고 넘어가자!
소멸자 __destruct() 예시 코드 ]
<?php
class Example {
function __construct() {
echo "construct";
}
public function show() {
echo "Hello world~";
}
function __destrecut() {
echo "destruct";
}
}
$e = new Example();
$e->show();
'PHP' 카테고리의 다른 글
php 객체 지향 프로그램 (4) (0) | 2023.07.16 |
---|---|
php 객체 지향 프로그램 (3) (0) | 2023.07.13 |
php 객체 지향 프로그램 (1) (0) | 2023.07.10 |
php 함수 (3) (0) | 2023.07.06 |
php 함수 (2) (0) | 2023.07.05 |