가희의자기개발블로그

php 매직 메소드 본문

프로그래밍 언어/php

php 매직 메소드

가희gahui 2020. 11. 21. 12:08
반응형

요즘 프랑스어를 공부할 시간이 없어서 최대한 document들을 불어로 찾아서 보려고 노력중이다. Closure에 대해 공부하던 중 Méthodes magiques 라는 단어가 나와서.. 당황했다.. 찾아보니 php에서 매직 메서드(방법?) 그리고 매직 상수라는 개념을 제공하는것 같다. 

 

1. Magic Methodes (매직 메서드) 란?

이 매직 메소드들은 php에서 특수한 기능을 위해 미리 정의해 놓은 메소드이다. 

이러한 매직 메소드는 메소드 이름과 매개변수, 반환 타입, 호출의 타이밍만이 정해져 있으며, 그 내용은 사용자가 직접 작성하여 사용할 수 있다.
PHP에서 모든 매직 메소드의 이름은 두 개의 언더스코어(__)로 시작한다.

2. Magic Methodes 종류 

__get (), __set (), __isset () 및 __unset () 등이 있다. 

 

하나씩 살펴보자 

2.1 __get()

해당 메서드는 접근불가 프로퍼티의 값을 읽을때 호출된다.

 

$animal = new Animal();
$height = $animal->height;

위와 같이 클래스에서 특정 필드를 검색하려고 할때마다 __get($name) 메서드를 호출한다. 이 경우 $name  "height" 와 같다. 

 

* 접근불가 프로퍼티(inaccessible property)란 현재 영역에서는 정의되어 있지 않거나, 접근 제어로 인해 보이지 않는 프로퍼티를 의미한다.

 

2.2 __set()

메소드는 접근 불가 프로퍼티의 값을 설정할 때 호출된다.

$animal->height = 10;

$name  "height" 이고 $value  10 마법 메서드 __set($name, $value) 호출된다.

 

 

2.3 __isset()

메소드는 접근 불가 프로퍼티에 대해 isset() 함수나 empty() 함수가 호출될 때 호출한다.

아래 메서드를 호출하면 __isset($name) 함수를 호출한다. 

isset($animal->height);

  

2.4 __unset($name)

unset($animal->height);

2.5 __construct(), __destruct()

__construct() 는 초기화 될 때 클래스를 설정하는 데 사용되므로 PHP에서 가장 일반적인 방법이다. __construct() 메서드의 반대는 __destruct() 메서드이다. 이 메서드는 작성한 객체에 대한 참조가 없거나 강제로 삭제할 때 호출된다. PHP의 가비지 컬렉션은 먼저 소멸자를 호출 한 다음 메모리에서 제거하여 객체를 정리한다.

 

2.6 __toString()

객체가 문자열로 처리 될 때마다 __toString() 메서드가 호출된다. 이 메소드는 클래스의 문자열 표현을 리턴해야한다. 

 

 

2.7 __invoke()

이 마법 메서드는 사용자가 객체를 함수로 호출하려고 할 때 호출된다. 가능한 유스 케이스에는 함수형 프로그래밍이나 콜백과 같은 접근법이 포함될 수 있다.

 

class Invokable
{
    
     /**
      * 아래 메서드는 해당 객체가 함수로서 실행될때 호출된다. 
      * $invokable();
      */
    public function __invoke($arg, $arg, ...)
    {
        print_r(func_get_args());
    }
}

// 예시:
$invokable = new Invokable();
$invokable([1, 2, 3]);

// optputs:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

2.8 __call(), _callStatic()

__call()  __callStatic() 은 객체 또는 정적 컨텍스트에서 존재하지 않는 객체 메서드를 호출 할 때 호출된다.

반응형

'프로그래밍 언어 > php' 카테고리의 다른 글

PHP Closure  (0) 2020.11.21
Comments