본문 바로가기

프로그래밍 언어(must-have skills)/PHP

__call method

배경

PHP를 쓰다보면 __call메서드(매직메서드)를 자주 보게 된다. 

설명 

public function __call($method, $parameters)
    {
        $rule = Str::snake(substr($method, 8));

        if (isset($this->extensions[$rule])) {
            return $this->callExtension($rule, $parameters);
        }

        throw new BadMethodCallException(sprintf(
            'Method %s::%s does not exist.', static::class, $method
        ));
    }

이 코드는 라라벨 프레임워크의 Validator 클래스의 __call매직메서드입니다.

 

__call() 메소드는 호출된 메소드의 이름과 매개 변수를 받습니다. 이 메소드에서는 주어진 메소드 이름에서 "validate" 접두어를 제거한 다음 접두어를 무시하고 유효성 검사 규칙 이름을 추출합니다.

그리고 이 규칙 이름이 현재 Validator 클래스에 등록된 확장 유효성 검사 규칙 중 하나와 일치하는 경우, 해당 확장 규칙의 callExtension() 메소드를 호출하고 매개 변수를 전달합니다.

하지만, 등록되어 있지 않은 유효성 검사 규칙의 경우, BadMethodCallException 예외를 throw하여 "Method {클래스명}::{호출된 메소드명} does not exist."와 같은 메시지를 출력합니다.

즉, __call() 메소드를 사용하면 Validator 클래스에 없는 유효성 검사 규칙을 동적으로 처리하거나, 예외를 throw하여 오류 처리를 개선할 수 있습니다. 이는 Laravel에서 유연성과 동적인 코드 작성에 도움을 주는 유용한 기능 중 하나입니다.


자바와 비슷한 게?

자바로 따지자면 Reflection을 써서 정의되지 않은 함수를 동적으로 만들어서 통제하는 것과 같습니다.