작은숲:위키노트/PHP 5.6/새로운 기능

큰숲백과, 나무를 보지 말고 큰 숲을 보라.

이 글은 http://php.net/manual/en/migration56.new-features.php의 내용을 번역한 것입니다.

원문의 저작권은 the PHP Documentation Group에게 있으며, 이 글의 라이선스는 원문의 라이선스(Creative Commons Attribution 3.0 License)를 따릅니다.

상수 표현식

상수, 속성 선언, 기본 함수 인자와 같이 이전 버전에서 정적인 값이 예상되던 곳에서 수치나 문자 리터럴 혹은 상수를 포함하는 스칼라 표현식을 사용하는 것이 가능해졌다.

<?php
const ONE = 1;
const TWO = ONE * 2;
class C {
    const THREE = TWO + 1;
    const ONE_THIRD = ONE / self::THREE;
    const SENTENCE = 'The value of THREE is '.self::THREE;
    public function f($a = ONE + self::THREE) {
        return $a;
    }
}echo (new C)->f()."\n";
echo C::SENTENCE;
?>

위 예의 출력값은 아래와 같다.

4The value of THREE is 3

또한 배열도 const 키워드를 사용해 상수로 정의할 수 있다.

<?php
const ARR = ['a', 'b'];
echo ARR[0];
?>

...를 사용하는 가변 인자 함수

func_get_args() 함수를 사용하지 않아도 ... 연산자를 사용해 가변 인자를 갖는 함수를 구현할 수 있다.

<?php
function f($req, $opt = null, ...$params) {
    // $params is an array containing the remaining arguments.
    printf('$req: %d; $opt: %d; number of params: %d'."\n",
           $req, $opt, count($params));
}f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>

위 예의 출력값은 아래와 같다.

$req: 1; $opt: 0; number of params: 0
$req: 1; $opt: 2; number of params: 0
$req: 1; $opt: 2; number of params: 1
$req: 1; $opt: 2; number of params: 2
$req: 1; $opt: 2; number of params: 3

... 연산자로 인자 풀기

배열이나 Traversable 객체를 인자 목록에 풀어내기 위해 함수를 호출할 때 ... 연산자를 쓸 수 있다. 이는 Ruby 등의 다른 언어에서는 splat 연산자라고 불린다.

<?php
function add($a, $b, $c) {
    return $a + $b + $c;
}$operators = [2, 3];
echo add(1, ...$operators);
?>

거듭 제곱 연산자 **

거듭 제곱을 계산하기 위해 오른쪽에서 결합되는 ** 연산자가 추가되었다. 그리고 단축 대입 연산자 **=도 추가되었다.

<?php
printf("2 ** 3 ==      %d\n", 2 ** 3);
printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);
$a = 2;
$a **= 3;
printf("a ==           %d\n", $a);
?>

위 코드는 아래와 같이 출력된다.

2 ** 3 ==      8
2 ** 3 ** 2 == 512
a ==           8

use function 키워드와 use const 키워드

use 연산자를 확장해 클래스뿐만 아니라 함수나 상수도 가져올 수 있게 되었다. 이를 위해 use functionuse const를 사용한다.

<?php
namespace Name\Space {
    const FOO = 42;
    function f() { echo __FUNCTION__."\n"; }
}namespace {
    use const Name\Space\FOO;
    use function Name\Space\f;
    echo FOO."\n";
    f();
}?>

위 코드는 아래와 같이 출력된다.

42
Name\Space\f

phpdbg

PHP 5.6에서는 SAPI 모듈로 구현된 phpdbg라는 대화형 디버거가 포함되었다. 자세한 내용은 phpdbg 문서를 참조하자.

기본 문자 인코딩

default_charset 지시자는 htmlentities() 함수와 html_entity_decode() 함수, htmlspecialchars() 함수의 기본 문자셋을 지정한다. 폐기 예정인 iconvmbstring에서는 인코딩이 설정된 경우 그 값이 default_charset 지시자보다 우선된다. default_charset 지시자의 기본값은 UTF-8이다.

php://input의 재활용

php://input이 필요하면 몇 번이라도 다시 열고 읽을 수 있게 되었다. 그래서 POST 데이터를 읽을 때 필요한 메모리가 많이 줄어들었다.

큰 파일의 업로드

2 기가바이트보다 큰 파일도 업로드 할 수 있게 되었다.

GMP에서 연산자 재정의 지원

GMP 객체들이 연산자의 재정의와 스칼라 형 변환을 지원한다. 이제 GMP를 사용할 때 더 쉬운 코드로 쓸 수 있다.

<?php
$a = gmp_init(42);
$b = gmp_init(17);
// Pre-5.6 code:
var_dump(gmp_add($a, $b));
var_dump(gmp_add($a, 17));
var_dump(gmp_add(42, $b));
// New code:
var_dump($a + $b);
var_dump($a + 17);
var_dump(42 + $b);
?>

타이밍 공격에 안전한 문자열 비교를 위한 hash_equals() 함수

hash_equals() 함수가 추가되었다. 이 함수는 일정한 시간에 두 개의 문자열을 비교한다. 타이밍 공격을 막기 위해 문자열을 비교할 때는 이 함수를 쓰는 것이 좋다. 예를 들어 crypt() 암호 해시를 검사할 때 사용할 수 있다. (타이밍 공격에 영향을 받지 않는 password_hash() 함수와 password_verify() 함수를 쓰지 못할 상황일 때)

<?php
$expected  = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$correct   = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$incorrect = crypt('1234',  '$2a$07$usesomesillystringforsalt$');
var_dump(hash_equals($expected, $correct));
var_dump(hash_equals($expected, $incorrect));
?>

위 코드는 아래와 같이 출력된다.

bool(true)
bool(false)

__debugInfo()

var_dump() 함수로 객체 정보를 출력할 때 속성이나 그 값의 표시 방법을 바꿀 수 있는 __debugInfo() 특수 메소드가 추가되었다.

<?php
class C {
    private $prop;
    public function __construct($val) {
        $this->prop = $val;
    }
    public function __debugInfo() {
        return [
            'propSquared' => $this->prop ** 2,
        ];
    }
}var_dump(new C(42));
?>

위 코드는 아래와 같이 출력된다.

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}

gost-crypto 해시 알고리즘

gost-crypto 해시 알고리즘이 추가되었다. 이것은 RFC 4357, section 11.2에 있는 CryptoPro S-box 테이블을 사용해 GOST 해시 함수를 구현한 것이다.

SSL/TLS의 개량

PHP 5.6에서는 SSL/TLS 지원을 많은 부분에서 개선했다. 자동적으로 피어 검증이 가능하도록 하고, 인증서 지문(fingerprint) 매칭을 지원하거나, TLS 재교섭 공격에 대응하는 등의 여러 새로운 SSL 콘텍스트 옵션을 도입했다. 그래서 암호화된 스트림을 사용할 때 프로토콜에 대한 보다 섬세한 제어와 검증에 대한 설정이 가능해졌다. 이러한 변경 내용은 PHP 5.6.x에서 OpenSSL 관련 변경 내용 문서에 자세히 나온다.

pgsql 비동기 지원

이제 pgsql 확장 기능에서 비동기 접속과 질의를 지원한다. 그래서 PostgreSQL 데이터베이스와 상호작용할 때 충돌 없는 동작이 가능해졌다. PGSQL_CONNECT_ASYNC 상수를 써서 비동기 접속을 하고, 새로운 pg_connect_poll() 함수와 pg_socket() 함수, pg_consume_input() 함수, pg_flush() 함수를 써서 비동기 접속이나 질의를 처리한다.

이 작은숲 문서의 출처는 위키노트의 위키노트/PHP 5.6/새로운 기능 문서입니다.