ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PHP - 상속 1,2,3(소개, 사례, 상속의 형식)
    카테고리 없음 2022. 6. 3. 11:02

     

    소개

    Inheritancne

    객체를 수정하고 싶을 때 메소드를 추가 시킨다거나 메소드를 빼는 작업들을 할 수있다. 그런 과정 중에 객체를 직접 수정해도 되겠지만, 직접 수정할 수 없는 경우가 있다.

     

    예) 해당 객체를  직접 만든 것이 아니라 php가 제공하는 SPL라이브러리에서 만들어 진 것이라면,  직접 만든 것이 아니므로 코드를 마음대로 바꿀 수가 없다. 그런데 해당 객체에다가 메소드를 추가하고 싶다면 => 상속

     

     

    사례

    • File Handling
      • SplFileInfo - The SplFileInfo class
      • SplFileObject -The SplFileObject class
      • SplTempFileObject - The SplTempFileObject class

     

    File을 핸들링 하는 객체 3가지가 있는데, 이 3가지의 객체가 다 상속 관계로 이루어진 객체이다. 기본이 되는 부모 객체는 SplFileInfo이고 SplFileInfo기능을 상속 받아서 더 많은 기능을 추가 한 자식 객체가 SplFileObject이다. 그 자식객체에 더 많은 기능을 추가해 만든 자식객체가 SplTempFileObject이다.

     

    상속의 형식

    왜 두번째 호출에는 data를 읽어 올 수 없을 까?

    <?php
    
    $file = new SplFileObject('data.txt');
    var_dump($file->fread($file->getSize()));
    var_dump($file->fread($file->getSize()));
    ?>

     

    data라고 하는 것을 data.txt의 내용이라고 생각해 보자 fread와 같은 메소드를 호출을 할 때, 1)인자로 얼만큼 data를 가져올 것인지, 가져오고자 하는 data의 size를 정한다. 그 2)size를 정하고 fread()메소드를 호출하면, 3)내부적으로 cursor라는 것이 있어서, 가져오겠다고 지정한 크기만큼 이동을 하고 이동한 만큼의 data를 반환하는 것이다.

     

     

     

    이상태에서 다시 fread()를 하게 되면, cursor는 현재 서있는 위치를 기준으로 해서, fread()메소드에 들어온 인자 만큼 움직이고, 움직인 만큼의 data를 반환하고 다시 대기한다.

     

    그렇기 때문에 data 전부를 호출을 하고, 다시 호출을 하면 더 이상 가져올 data가 없는 것이다. 왜냐하면 cursor가 제일 끝에 가있는 상태이기 때문이다.

     

     

    <?php
    
    $file = new SplFileObject('data.txt');
    var_dump($file->fread($file->getSize()));
    $file->rewind();
    var_dump($file->fread($file->getSize()));
    ?>

    cursor의 위치를 다시 맨 처음으로 옮겨야 다시 data를 읽어 올 수 있다.

     

    원래 SplFileObject 사용

    <?php
    $file = new SplFileObject('data.txt');
     var_dump($file->fread($file->getSize()));
     $file->rewind();
     var_dump($file->fread($file->getSize()));
     ?>

     

    상속받아 재정의한 MyFileObject

    <?php
    
    class MyFileObject extends SplFileObject{
        function getContents(){
            $content = $this->fread($this->getSize());
            $this->rewind();
            return $content;
        }
    
    }
    
    $file = new MyFileObject('data.txt');
    var_dump($file->getContents());
    var_dump($file->getContents());
    
    ?>

     

     

     

    [출처 - https://youtu.be/DAsTfs-XC1U]

    댓글

Designed by Tistory.