PHP

abstract

수업소개

abstract는 클래스의 메소드를 하위 클래스가 반드시 오버라이드 하도록 하는 것입니다. 이것을 통해서 부모 클래스의 일부 기능을 하위 클래스가 구현하도록 강제할 수 있습니다. 

이 수업에서는 디자인 패턴이 무엇인가를 설명합니다. 그 중에서 템플릿 메소드 패턴을 통해서 추상 클래스가 사용되는 구체적인 사례를 살펴봅니다. 

수업

소개

형식

 

<?php
abstract class ParentClass
{
    public function a()
    {
        echo 'a';
    }
    public abstract function b();
}
class ChildClass extends ParentClass
{
    public function b()
    {
        
    }
}

 

사례 : 템플릿 메소드 패턴

템플릿 메소드 패턴 구현

 

<?php
abstract class AbstractPageTemplate
{
    protected final function template()
    {
        $result = $this->header();
        $result .= $this->article();
        $result .= $this->footer();
        return $result;
    }
    protected abstract function header();
    protected abstract function article();
    protected abstract function footer();
    public function render()
    {
        return $this->template();
    }
}
class TextPage extends AbstractPageTemplate
{
    protected function header()
    {
        return "PHP\n";
    }
    protected function article()
    {
        return "PHP: Hypertext Preprocessor\n";
    }
    protected function footer()
    {
        return "website is php.net\n";
    }
}
class HtmlPage extends AbstractPageTemplate
{
    protected function header()
    {
        return "<header>PHP</header>\n";
    }
    protected function article()
    {
        return "<article>PHP: Hypertext Preprocessor</article>\n";
    }
    protected function footer()
    {
        return "<footer>website is php.net</footer>\n";
    }
    public function render()
    {
        $result = '<html>';
        $result .= $this->template();
        return $result.'</html>';
    }
}
echo '<h1>text</h1>';
$text = new TextPage();
echo $text->render();

echo '<h1>html</h1>';
$html = new HtmlPage();
echo $html->render();

 

댓글

댓글 본문
작성자
비밀번호
  1. 홍콩돼지
    6개월 전이라 이미 아시겠지만...

    interface는 실제 동작을 가지지 못하므로 abstract class 안에서 해당 class내에서 공통적인 부분을 만들어둘 수 있게 됩니다. (templete method)
    위의 예제에서 header, article, footer method를 abstract로 준 이유는 여기의 return값이 변화될 수 있기 때문입니다.

    각 class에서 abstract method들의 값들의 내용은 다르지만(html태그가 붙어서 출력됨) 사용되어질 규칙은 같으므로(string 값이고 이를 웹브라우저에 출력해 줄 것이다)
    묶어서 부모 abstract class를 만들어 주고 각각 상속받은 클래스의 abstract method에서 다른 값들을 return해 주는 것입니다.

    render method는 abstract와 관계엾이 override된 것입니다.
    대화보기
    • 웅이
      제가 abstract의 본질을 잘 모르겠어서 질문합니다 ㅠㅠ
      자식 클래스에서 override를 해서 method의 내용을 정의해야되는거라면,
      이름만 있고 내용은 없는 method를 abstract를 써서 반드시 구현하게 하는
      이유가 뭔가요?
    • 코코딩
      php 에서는

      var num = '';
      num += 123;

      += 연산자를

      $num = '';
      num .= 123;

      .= 이렇게 쓰는군요.

      밑에 이고잉님 설명도 있었는데
      한참 보고 뭔가.. 했네요 : )
    • orez
      감사합니다. 여러 번 다시 읽어보니 이해가 됩니다.
    • spacepublisher
      잘봤습니다-

      협업의 입장에서 바라본다면,
      인터페이스는 작업을 비슷한 수준의 개발자가 병렬적으로 찢어놓는데에 유리하다면,
      앱스트랙트는 작업을 사수-부사수처럼 책임과 실력이 비대칭인 상황에서 유리하겠네요.
    • dufuqsls
      잘봣습니다.
    • Frank
      고맙습니다~
    • egoing
      $result .= $this->template();

      $result = $result.$this->template();
      와 같은 의미입니다~
      대화보기
      • 이고잉님!실습하던 중 처음부터 막혀버렸습니다. 변수 result에 차례대로 값을 여러번 넣으면 결국 마지막 입력값만 출력하게되던데.. 원래 변수는 이렇게 나오는거 아닌가요? ㅠㅠ이고잉님껀 차례대로 합쳐져서 다 나오던데,, 대체 뭐가다른가요? ㅜㅜ하.. ㅠ
      버전 관리
      egoing
      현재 버전
      선택 버전
      graphittie 자세히 보기