해결된 질문
작성
·
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() 로 사용하면 호출을 의미하므로 동작하지 않습니다. 애초에 함수의 이름으로 인지하지 않습니다. 이해가 되셨으면 좋겠군요 :)
처음 Javascript로 빗대어 표현해 주시니 한방에 이해가 갔습니다.
PHP에서도 정의된 함수를 특정 함수의 매개변수로 전달할 수 있다는 것을 처음 알게 되었네요.
Javascript와의 차이점은 문자열로 보내야 상수에 관련된 Warning이 안나는 점이네요.
감사합니다.