지난번에는 PHP5.6을 우분투에 설치하며 삽질했던 과정을 이야기 했었습니다. 혹시 PHP5.6을 설치부터 하셔야 한다면 “우분투에 PHP 5.6 alpha 설치하기.“를 읽어보시면 됩니다.

PHP는 잘못된 문법구조로 많이 까이기도 합니다. (관련글) 전부 부정하진 않습니다만, PHP를 쓰게 만드는 많은 장점들이 있습니다. 그 중 하나가 다른 언어에서 좋은 방식이 있다면 얼마 지나지 않아 추가되는 유연함인 것 같습니다. (또 다른 하나는 하위호환성.. 덜덜..)

이렇듯, PHP는 버전업이 될때마다 늘 새로운 문법구조를 도입하곤 하는데 이번 PHP5.6에서는 ...문법의 추가가 아주 눈에 띄었습니다. 다른 많은 부분도 변화가 있지만 본 글에서는 ...문법에 대해 큰 비중을 두고 다뤄보도록 하겠습니다.

새로운 기능

상수계산 지원

<?php
const ONE = 1;
const TWO = ONE * 2;
const SETENCE = "This is The Setence, One is ".ONE.", Two is ".TWO;

echo ONE, TWO, SETENCE;

// 출력
// 1 2 This is The Setence, One is 1, Two is 2

바로 직전버전까지만 해도 상수는 무조건 대입만 가능했습니다. 상수에서 계산을 해서 넣는다는건 불가능했습니다. 그치만 이제 새로운 PHP5.6에서는 상수 계산을 지원합니다.

use function, use const 구문 추가

<?php

namespace Foo\Bar {

	const MY_CONST = 30;

	function myMethod() {
		return __FUNCTION__;
	}

}

namespace {
	// use const \Foo\Bar\MY_CONST; 사용가능
	// use function \Foo\Bar\myMethod; 사용가능

	use const \Foo\Bar\MY_CONST as OTHERCONST;
	use function \Foo\Bar\myMethod as otherMethod;

	echo OTHERCONST, otherMethod();

}

// 출력
// 30 Foo\Bar\myMethod

기존의 use문의 경우 클래스에 한해서 사용가능했지만 이제는 함수와 상수에도 적용가능합니다. 이미 Python에서는 클래스뿐 아니라 함수, 상수등도 import해서 사용하는데, 여기서 영향을 받은 것이 아닐까 조심스럽게 생각해봅니다. 이를 통해 더 다양한 모듈을 만들 수 있을것 같습니다.

gost-crypto 해시함수 추가

<?php

// ex. sha1 hash
sha1("hello");
hash("sha1", "hello");


// new hash, gost-crypto
hash("gost-crypto", "hello");

별건 아닙니다. sha1('something')이란 함수를 hash('sha1', 'something');라고 사용할 수 있듯이 gost-crypto해시함수도 동일하게 사용가능합니다.

... 문법 추가

제가 제일 좋아하는 대목입니다. :) 사실 이부분은 아무래도 Python에서 영향을 받고 가져온 것 같으나 좀더 찾아보니 훨씬 이전에 C에서도 있었단 사실을 알게되었습니다. 이게 뭐지? 하고 의아해하실 분들이 많이 계신데 참 간단합니다. 바로 가변형 Prototype입니다. 가장 대표적인 함수로는 printf함수입니다. 처음 C를 배울 당시에 printf함수의 프로토타입이 무엇인지 애매했었습니다.

printf(char*, void, void, void, void, void, void);

설마 이런건 아니겠지. 아마 난 안될거야. 바로 답을 말하자면

printf(char*, ...);

이런 형태로 선언되어있습니다. 어느 PHP모임에서 이야기 하기를, “단언컨데 PHP는 C로 작성된 최고의 웹 라이브러리이다.” 캬 명언이다.

(혹시 C로 어떻게 구현하는지 궁금해 하시는 분이 계실까봐 조심스럽게 링크를 투척합니다.)

몇몇 PHP를 많이 사용하신 분이라면 이렇게 생각할겁니다. ‘그거 PHP에서 원래 됐는데요?’ 예, 맞습니다. PHP에서는 func_get_args()라는 함수를 통해 간접적으로 구현이 되었습니다.

<?php
function foo() {
	$args = func_get_args();
    /* Do Something */
}

사실 이녀석이 이렇게 변한다는 겁니다.

<?php
function foo( ...$args ) {
    /* Do Something */
}

그냥 한줄 줄여주는 효과입니다. 근데 이녀석이 진짜로 강력하게 사용되는건 전체가 가변형 인자(Parameter)가 하나가 아니라 고정된 인자가 있고 뒤에 옵션으로 가변형 인자가 붙을 때 입니다.

예를 들면 다음과 같습니다.

<?php
function foo( $x, $y, ...$args ) {
    /* Do Something */
}

이걸 그전에 구현하려고 했다면..

<?php
function foo( $x, $y ) {
    $args = func_get_args();
    array_shift( $args );
    array_shift( $args );
    /* Do Something */
}

뭐 사람들마다 사용방법은 다르겠지만 저는 아마 저렇게 했을 것 같아요. […] 그리고 훨씬 더 직관적으로 변한 것은 이의를 제기하실 분은 없을거라 생각합니다. 아름다움에는 이유가 없습니다.

사실 이러한 부분만 추가되었다면 C에서 영향을 받았으려니 생각했겠지만 더 강력한 건 바로 이 다음입니다. 이걸 보시면 왜 제가 Python에서 영향을 받았다고 생각하는지 느낄 수 있을 것 같습니다.

foo(1,2,3,4,5);
$arr = [1,2,3,4,5];

// 기존방식
 call_user_func_array('foo', $arr);

// php5.6 추가된 방식
foo(...$arr);

파이썬에서는 이런 소스를 전부터 사용해왔었으니까요.

arr = [1,2,3,4,5]
foo( *arr )

즉, 정리하자면 PHP에는 func_get_args()call_user_func_array()를 대체할 수 있는 강력한 문법인 ...이 추가되었다, 로 요약이 가능하겠습니다. :)

또한 성능도 낫게 측정됩니다. 그냥 단순 구문을 10,000번씩 동작 후 시간을 측정하였습니다.

php5.6 benchmark

약 20%정도의 성능개선이 이루어졌습니다. :) 뭐 어차피 10000번 비교해서 고작 0.002초 차이입니다. 사실 의미없습니다.

그외 추가된 사항

  • 2기가 넘는 파일이 업로드 가능합니다.
  • phpdbg, SAPI에서 지원하던 모듈이 기본 지원하게 되었습니다.
  • openssl_x509_fingerprint() 함수가 추가되었답니다. 지문인식 보안관련 함수인 것 같습니다. (잘 모르겠습니다..)

그 외의 경우 다음 링크에서 확인할 수 있습니다. :)

변경사항

잘 사용하지 않는 부분들이 변한 점이라서 링크로 대체하겠습니다. :)

결론

아직 alpha1이라서 앞으로도 어떻게 변할지 모릅니다. 5.5를 기준으로 생각해보면 빠르면 올여름쯤이면 정식버전을 만나볼지도 모릅니다. 현재로선 ...외 소소한 기능 몇가지가 추가된 것 같으나, 저것만으로도 엄청난 변화가 이루어질 것입니다. 저도 그동안 만들어온 쓰레기를 치워야할 것 같습니다.

변경사항이나 추가사항있을시 업데이트하도록 노력하겠습니다. 잘못설명된 부분이 있거나 추가할 수 있는 부분은 지적해주시면 감사히 듣도록 하겠습니다. :)

참고자료