[PHP] 인터페이스와 추상 클래스, 클래스 상속, parent, this


Study/PHP  2019. 9. 9. 22:02

안녕하세요. 명월입니다.


이 글은 PHP에서 인터페이스와 추상 클래스, 클래스 상속, parent, this에 대한 설명입니다.


이전에 PHP에서 class를 선언해서 사용하는 방법에 대해 설명했었습니다.

링크 - [PHP]function과 class 사용법, 그리고 접근제한자


PHP에 클래스가 있기 때문에 인터페이스(Interface)와 추상클래스(abstract class)가 존재합니다.

개인적인 생각으로 PHP에서는 데이터 타입 지시자가 없기 때문에 인터페이스의 역할이 컴파일 언어(Java나 C#)보다 활용성이 적지 않을까 싶습니다. 실제로 저는 PHP에서 Interface를 쓴 적이 없네요.

그러나 추상 클래스는 자주 사용합니다.

<?php
  $title = "title";
  // 인터페이스
  interface ITest{
  function run();
  }
  // 추상클래스 (인터페이스 ITest를 상속받았다.)
  abstract class AbstractTest implements ITest{
  // ITest 인터페이스를 상속 받았기 때문에 run을 반드시 선언해야 한다.
  public function run(){
    return $this->print();
  }
  // 추상 메소드
  protected abstract function print();
  }
  // 추상클래스를 
  class Test extends AbstractTest{
  // AbstractTest 추상클래스를 상속 받았기 때문에 print을 반드시 선언해야 한다.
  protected function print(){
    return "Hello world";
  }
  }
  $obj = new Test;
?>
<!DOCTYPE html>
<html>
<head>
  <title>
  <?=$title?>
  </title>
</head>
<body>
  <?=$obj->run()?>
</body>
</html>

위 예제를 보면 ITest 인터페이스와 AbstractTest 추상클래스와 Test 클래스가 있습니다.

종속 계층은 ITest -> AbstractTest -> Test로 되어있습니다. 그래서 Test를 선언해서 run를 실행하면 AbstractTest의 run 메소드가 실행되고 run 메소드 안에서는 파생클래스의 print()함수를 호출하여 결과는 Helloworld라는 결과를 내보냅니다.


여기서 이제 parent와 this의 개념입니다.

<?php
  $title = "title";
  interface ITest{
    function run();
  }
  abstract class AbstractTest implements ITest{
    private $data;
    public function run(){
      // $this는 실행되고 있는 클래스의 맴버 타입, 즉 print()함수가 호출하는 것
      return $this->print();
    }
    protected function setData($data){
      // $this->data는 맴버변수 data이고 $data는 파라미터 data이다.
      $this->data = $data;
    }
    protected function getData(){
      return $this->data;
    }
    protected abstract function print();
  }
  class Test extends AbstractTest{
    protected function print(){
      // 상위 클래스의 setData를 호출한다.
      // 참고로 setData는 protected 타입이기 때문에 파생클래스에서만 참조가 가능하고 외부에서는 참조가 불가능.
      parent::setData("Hello world");
      return parent::getData();
    }
  }
  $obj = new Test;
?>
<!DOCTYPE html>
<html>
<head>
  <title>
    <?=$title?>
  </title>
</head>
<body>
  <?=$obj->run()?>
</body>
</html>

$this의 경우는 실행되고 있는 클래스의 맴버를 가르킵니다. 즉, 맴버 변수던가 함수를 가르킵니다. $this의 경우는 C++의 포인터의 모습으로 화살표로 지시(->)를 합니다.

그러나 parent의 경우는 parent::의 형태로 가르킵니다. $parent-> 의 형식은 에러가 발생합니다. 참... 문법이 특이합니다.


위 예제는 obj->run을 통해 AbstractTest의 run이 호출되고 run 함수에서는 추상 메소드 print가 호출됩니다

추상 메소드 print가 호출되었기 때문에 Test클래스의 print가 호출되고 print함수에서는 부모클래스인 setData에 데이터를 넣고 getData로 데이터를 가져와서 반환하는 형태입니다.


제가 데이터를 "Hello world"를 넣었기 때문에 결과는 Hello world가 나오곘네요...


여기까지 PHP에서 인터페이스와 추상 클래스, 클래스 상속, parent, this에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.