인프런 커뮤니티 질문&답변

Henu님의 프로필 이미지
Henu

작성한 질문수

PHP 7+ 프로그래밍: 객체지향

33 - MVC(Model, View, Controller)

'routes/web.php'에서 '/' URL에 대한 라우트 설정 시 처리할 Handler 선언에 대한 질문입니다.

해결된 질문

작성

·

190

2

안녕하세요. '/' URL에 대한 라우트 선언 시 궁금한 점이 있어 질문드립니다.

 

강의 08:45 부분에서 '/' URL을 처리할 Handler로 '\App\Controllers\IndexController::index'와 같이 선언하는 것을 볼 수 있었습니다.

 

IndexController 클래스의 index() 메소드가 정적 메소드로 선언되어 있으므로 '::'를 사용하는 것은 이해가 되었는데요. '괄호()'를 생략했음에도 오류 없이 동작하는 이유에 대해 궁금합니다.

 

'\App\Controllers\IndexController::index()'와 같이 설정한 경우 오히려 에러가 출력되더라구요.

 

 

위 문법과 관련한 관련 자료도 있다면 공유 부탁드립니다.

 

감사합니다.

답변 1

1

정상우님의 프로필 이미지
정상우
지식공유자

Function Call by Name

안녕하세요. 혹시 자바스크립트를 해본적 있으신가요? 자바스크립트에서 이름이 지정된 함수를 넘겨주려면 아래와 같이 할 수 있죠?

function foo (message) { console.log(message); }

class A {
    static bar (cb) {
        cb('Hello, world');
    }
}

A.bar(foo); // Hello, world

PHP 에서 아래의 코드는 동작할까요?

function foo($message) { var_dump($message); }

class A
{
    public static function bar($cb)
    {
        $cb('Hello, world');
    }
}

A::bar(foo); // Hello, world

이 코드는 오류가나지는 않습니다. 그러나 A::bar() 에 넘겨준 값, foo 를 상수로 인식한다는 문제가 있어 경고를 던집니다.

PHP Notice:  Use of undefined constant foo - assumed 'foo' 

Variable Functions in PHP

위 호출 코드는 아래와 같이 바꿔볼 필요가 있습니다.

A::bar('foo'); // Hello, world

이렇게 처리할 수 있는 것은 무엇 때문일까요? 바로 PHP 언어의 기능 중 하나인 가변 함수(Variable Functions) 기능이 동작했기 때문입니다. 문자열 형태지만 함수의 이름을 넘겨주는 것으로 호출이 가능케 되었습니다.

이 점을 생각해보았을 때, 라우터에서 정의한 IndexController::index 는 단순 문자열처럼 보이지만 함수의 이름을 나타냅니다. 반면 IndexController::index() 로 사용하면 호출을 의미하므로 동작하지 않습니다. 애초에 함수의 이름으로 인지하지 않습니다. 이해가 되셨으면 좋겠군요 :)

Henu님의 프로필 이미지
Henu
질문자

처음 Javascript로 빗대어 표현해 주시니 한방에 이해가 갔습니다.

PHP에서도 정의된 함수를 특정 함수의 매개변수로 전달할 수 있다는 것을 처음 알게 되었네요.

Javascript와의 차이점은 문자열로 보내야 상수에 관련된 Warning이 안나는 점이네요. 

감사합니다.

Henu님의 프로필 이미지
Henu

작성한 질문수

질문하기