구버전 PHP에서는 변수 표현식에 일관성 문제가 존재했습니다. 예를 들어 ${$first['name']}과 같은 구문은 개발자에게 혼란을 줄 수 있었고, 문법 자체가 일관성이 없다는 평가를 받았습니다. 이러한 비일관성 문제를 해결하기 위해 PHP 7에는 새로운 문법인 "균일 변수 구문(Uniform Variable Syntax)"이 도입되었습니다.
균일 변수 구문의 기본 개념
균일 변수 구문은 변수를 왼쪽에서 오른쪽 방향으로 순차적으로 평가합니다. 이 구문을 사용하려면 중괄호({})를 추가해야 합니다.
echo ${$first['name']};
균일 변수 구문은 다양한 연산자 조합을 허용하지만, 기존 평가 방식에 의존하던 일부 표현식에서는 하위 호환성(backward compatibility)이 깨질 수 있다는 점에 유의해야 합니다.
즉시 실행 함수 표현식 예제
<?php
$x = (function() {
return 20 - 10;
})
();
echo "$x\n";
?>
실행 결과
10
참고: 위 프로그램은 함수 표현식을 정의와 동시에 즉시 실행(immediate invocation)합니다.
새로운 문법 조합
균일 변수 구문은 기존 문법 요소들을 새롭게 조합하여 사용할 수 있습니다.
$foo['bar']();
또한 함수가 반환한 문자열 내부의 특정 문자도 역참조(dereference)할 수 있습니다.
[$obj, $obj1][0]->pro;
그리고 일부 경우에는 PHP 7에서 중첩된 스코프 해석 연산자(더블 콜론, ::)도 지원합니다.
$foo['bar']::$baz;
중첩 메서드/함수 호출
중첩된 메서드와 함수 호출 또는 임의의 콜러블(callable)을 사용할 때 괄호를 연속으로 겹쳐서 호출 체인을 만들 수 있습니다.
foo()(); // 함수 콜러블이 반환한 값 호출
$foo->bar()(); // 인스턴스 메서드가 반환한 값 호출
Foo::bar()(); // 정적(static) 메서드 호출
$foo()(); // 다른 콜러블이 반환한 값 호출
임의 표현식 역참조(Arbitrary Expression Dereferencing)
이제 PHP에서는 괄호로 묶인 모든 유효한 표현식을 역참조할 수 있습니다.
(exp)['foo']; // 배열 키에 접근
(exp)->foo; // 프로퍼티에 접근
(exp)->foo(); // 메서드 호출 등
종합 예제
<?php
function emp() {
echo "This is emp() \n";
};
function dept() {
echo "This is dept() \n";
return emp;
};
function sub() {
echo "This is sub()\n";
return dept;
};
sub();
echo "----------------\n";
sub()();
echo "----------------\n";
sub()()();
?>
실행 결과
This is sub()
-------------
This is sub()
This is dept()
-------------
This is sub()
This is dept()
This is emp()
위 실행 결과에서 확인할 수 있듯이, sub()는 dept 함수를 반환하고, dept는 다시 emp 함수를 반환합니다. 따라서 sub()()는 dept()까지 실행되며, sub()()()는 emp()까지 연쇄적으로 호출됩니다. 이처럼 PHP 7의 균일 변수 구문은 이전 버전보다 훨씬 유연하고 직관적인 호출 체인 작성을 가능하게 해줍니다.