정상우
hELLO.
정상우
전체 방문자
428,194
오늘
409
어제
688
  • hELLO. (122)
    • 컴퓨터과학 (4)
      • 알고리즘 & 자료구조 (4)
    • 언어 & 프레임워크 (63)
      • Go (23)
      • PHP & Laravel (40)
    • 웹 (7)
    • 블록체인 (12)
      • 메인넷 (9)
      • 암호화폐 플랫폼 (3)
    • 포트폴리오 (10)
    • 칼럼 (21)
      • 에세이 (4)
      • 개발자스럽게 살기 (15)
      • 회고 (2)
    • 티스토리 (5)

블로그 메뉴

  • ⚡ 개발자 이력서
  • 🌟 깃허브
  • 💻 강의
  • ✨ 예제코드
  • ⭐ 브런치
  • 태그 클라우드
  • 방명록

공지사항

  • 2차 도메인을 설정했습니다 ✨

인기 글

  • JWT(JSON Web Token)의 개념부⋯
    2021.07.29
    JWT(JSON Web Token)의 개념부⋯
  • 'REST' 를 보다 'RESTful' 하게⋯
    2021.08.14
    'REST' 를 보다 'RESTful' 하게⋯
  • [Laravel] 라라벨 프레임워크⋯
    2021.06.10
    [Laravel] 라라벨 프레임워크⋯
  • 깃허브를 포트폴리오로 쓰려면⋯
    2021.12.25
    깃허브를 포트폴리오로 쓰려면⋯
  • 암호화폐 트레이딩 봇을 만들었⋯
    2021.05.12
    암호화폐 트레이딩 봇을 만들었⋯

태그

  • 블록체인
  • 라라벨
  • 개발
  • go
  • 프로그래머스
  • php
  • 포트폴리오
  • 개발 리뷰
  • 코딩테스트
  • Algorithm

최근 댓글

  • 헉 ㅋㅋㅋㅋㅋㅋ 대학에서 잠깐⋯
    정상우
  • 오히려 반대인 경우도 있더라고⋯
    비스카이비전
  • 아무래도 후자가 많은 것 같긴⋯
    정상우
  • 조금 다른 이야기이긴 한데 좋⋯
    비스카이비전
  • 너무나 이쁘고 멋진 스킨 갑사⋯
    TerianP

최근 글

  • 기술적 가스라이팅은 이제 멈춰⋯
    2022.08.08
    기술적 가스라이팅은 이제 멈춰⋯
  • 빠르게 성장하는 개발자의 세⋯
    2022.06.08
    빠르게 성장하는 개발자의 세⋯
  • 개발자와 엔지니어, 그 사이에서
    2022.05.10
    개발자와 엔지니어, 그 사이에서
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.03
    아임포트(Iamport)로 결제기능⋯
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.01
    아임포트(Iamport)로 결제기능⋯

티스토리

hELLO · Designed By 정상우.
정상우

hELLO.

언어 & 프레임워크/PHP & Laravel

PHP: 매직 메서드

2020. 4. 22. 22:07

매직 메서드

매직 메서드는 특수한 메서드로서 클래스에서 특별한 동작을 하게되는데, 그 중에는 PHP: 상속에서 이야기한 생성자와 소멸자도 포함하고 있습니다. 대체로 __ 로 시작하는 메서드 명이 그러하며 이는 사용자가 직접 호출하는 것이 아니고, 특정 행동을 취했을 경우 호출되는 콜백함수같은 것입니다. 따라서 인터페이스 규격이 정해져 있으며 그에 따라 정의해야 하고, 리턴 값또한 그러해야 합니다. 대부분 리턴값은 없는 경우가 많으나 일부 매직 메서드의 경우 존재합니다.

 

매직 매서드는 종류가 많은데, 전부 다 할 수는 없으니 임의로 몇 가지 토픽으로 나누어서 해보고자 합니다. 주제는 세 가지로, 각각 Method, Property, Serialize. 그 외에 __toString() 과 같은 것들도 있으나 생략하도록 할 것입니다.

Method

메서드와 관련된 매직 메서드는 __call(), __callStatic(), __invoke() 가 존재합니다.

__call(string, array)

클래스 내부에 정의되지 않은 메서드를 호출했을 경우 해당 매직 메서드를 호출하게 됩니다. 따라서 동적인 메서드를 호출하여 런타임 중에 새로운 메서드를 만들거나 할 경우에 유용합니다.

class A
{
    public function __call($name, $args)
    {
        var_dump(__METHOD__);
    }
}

$a = new A();
$a->foo();

__callStatic(string, array)

클래스 내부에 정의되지 않은 정적 메서드를 호출했을 경우 마찬가지로 해당 매직 메서드를 호출하게 됩니다. 활용하는 것은 __call() 과 비슷하며 차이점은 정적 메서드에 대응한다는 점입니다.

class A
{
    public static function __callStatic($name, $args)
    {
        var_dump(__METHOD__, $args);
    }
}

$a = new A();
A::foo();

__invoke(array)

인스턴스 자체를 호출할 경우에 호출되는 매직 메서드입니다. 다른 언어에서는 찾기 드문 특이한 기능 중에 하나입니다.

class A
{
    public function __invoke(...$args)
    {
        var_dump(__METHOD__, $args);
    }
}

$a = new A();
$a();

Property

프로퍼티와 관련된 매직 메서드는 __set(), __get(), __isset(), __unset() 이 있습니다. 대강 이름만 보더라도 감이 오시겠죠?

__set(string, mixed), __get(string)

프로퍼티의 값을 설정하고 얻을 때 호출되는 매직 메서드입니다. setter, getter 라고 부르기도 합니다. 하지만 값을 프로퍼티에 할당하는 행위는 매직 메서드 내부에서 해야합니다. 외부에서 할당하거나, 얻겠다고 해서 즉시 리턴되지는 않습니다.

class A
{
    // private $message = 'Hello, world';

    public function __set($name, $value)
    {
        $this->$name = $value;
    }

    public function __get($name)
    {
        $this->$name;
    }
}

$a = new A();

// -> __set
$a->message = 'Hello, world';
// -> __get
var_dump($a->message);

__isset(string): bool, __unset(string)

각각 객체를 대상으로 언어구조 isset(), unset() 을 호출했을 경우 호출되는 매직 메서드입니다. 마찬가지로 매직 메서드 내부에서 검사, 해제 로직을 별도로 구현해야 합니다.

class A
{
    private $message = 'Hello, world';

    public function __isset($name)
    {
        return isset($this->$name);
    }

    public function __unset($name)
    {
        unset($this->$name);
    }
}

$a = new A();

// -> __isset
isset($a->message);
// -> __unset
unset($a->message);

Serialize

직렬화와 관련된 매직 메서드로는 __sleep(), __wakeup() 이 있습니다. 각각 serizlie(), unserialize() 호출시 호출됩니다. 사실 직렬화는 매직 메서드, 그리고 Serializable 인터페이스를 구현, 이렇게 두 가지의 방법으로 할 수 있습니다. 둘 다 보여드리도록 하겠습니다.

__sleep(): array, __wakeup()

__sleep() 매직 메서드는 리턴 값이 정해져 있는데, 직렬화할 프로퍼티를 지정해줄 수 있습니다.

class A
{
    private $sayHello = 'Hello, world';

    public function __sleep()
    {
        return [ 'sayHello' ];
    }

    public function __wakeup()
    {
        var_dump(__METHOD__);
    }
}

Serializable

Serializable 인터페이스를 구현하여 직렬화를 처리할 수 있습니다. 해당 포스팅은 매직 메서드와 관련된 이야기를 하고 있지만, 직렬화를 이야기 하는겸 같이 언급하기로 했습니다.

class A implements Serializable
{
    private $sayHello = 'Hello, world';

    public function serialize()
    {
        return serialize($this->sayHello);
    }

    public function unserialize($serialized)
    {
        $this->sayHello = unserialize($serialized);
    }
}

$a = new A();
$serialized = serialize($a);

var_dump(unserialize($serialized));

더 읽을거리

PHP: 네임스페이스

https://www.inflearn.com/course/php7-reboot

https://www.inflearn.com/course/php7-oop

PHP 카테고리 목차 및 문서 정리

2020년, PHP 언어가 가지는 의미

https://www.php.net/manual/en/

    '언어 & 프레임워크/PHP & Laravel' 카테고리의 다른 글
    • PHP: 에러와 예외 (try, catch, finally)
    • PHP: 네임스페이스
    • PHP: 추상화 (추상 클래스, 인터페이스, 트레이트)
    • PHP: 상속 (생성자, 가시성, Final)
    php, 매직 메서드
    정상우
    정상우
    과거의 배움으로 현재를 바꾸고 미래를 만듭니다. #25+2살 #INFJ #개발자 #브런치작가
    댓글쓰기
    1. JOHN TV
      2020.04.22 22:45 신고
      포스팅 잘보고 가요
      좋은밤 보내세요~
      자주소통해요~^^
      수정/삭제댓글쓰기댓글보기
    다음 글
    PHP: 네임스페이스
    이전 글
    PHP: 추상화 (추상 클래스, 인터페이스, 트레이트)
    • 이전
    • 1
    • ···
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • ···
    • 122
    • 다음

    티스토리툴바