PHP 5.5에서 달라진 부분들 중에서 중요하거나 관심 있는 부분만 정리 해본다.


사라진 기능들

PCRE 정규식 패턴의 /e 변경자 Deprecate

보안상 취약할 수 있는 이유로 deprecate 되었다. preg_replace 함수에서 'e ' 변경자를 사용하면 deprecate 메시지가 발생한다. preg_replace_callback 함수로 대체하는게 안전하고 속도도 더 빠르다

echo preg_replace('/b/e', 'strtoupper("$0")', 'abcd'); //=> aBcd
//=> Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in test.php on line 1
 
$replacer = function($str) {
	return strtoupper($str[0]);
};

echo preg_replace_callback('/b/', $replacer, 'abcd'); //=> aBcd

MySQL 익스텐션 Deprecate

MySQLi, PDO_MySQL 익스텐션으로 변경해야 하고 기존처럼 mysql_connect()mysql_pconnect() 등의 함수를 통해 MySQL 커넥션을 생성하면 deprecate 메시지가 발생한다.

Windows XP, 2003 지원 중단

윈도우즈 버전의 PHP는 앞으로 Vista 이상의 버전만 지원하게 된다.

PHP 로고 출력 기능 제거

PHP 로고를 출력하기 위한 GUID를 생성하는 아래의 함수들이 제거되었다.

php_logo_guid(), php_egg_logo_guid(), php_real_logo_guid()zend_logo_guid()

기본 문법 등 개선

foreach 문장에 list 사용 가능

$users = array(
	array('Foo', 'Bar'),
	array('Baz', 'Qux')
);

// Before
foreach ($users as $user) {
	list($firstName, $lastName) = $user;
	echo "First name: $firstName, last name: $lastName.\n";
}

// After
foreach ($users as list($firstName, $lastName)) {
	echo "First name: $firstName, last name: $lastName.\n";
}

변수 외의 임의의 표현식을 empty() 표현식에 사용 가능

function return_false() {
	return false;
}

var_dump(empty(return_false())); //=> bool(true)
var_dump(empty(false)); //=> bool(true)

상수 배열이나 문자열의 역참조 가능

var_dump([1, 2, 3][0]); //=> 1
var_dump('abcdefg'[0]); //=> a

::class 키워드로 클래스의 전체 이름 확인

namespace MyNameSpace;
class TestClass {}

echo TestClass::class; //=> MyNameSpace\TestClass

php.ini 파일에 임시 디렉토리 지정 가능

php.ini
system_tmp_dir = "/somewher/tmp"

기본 함수 등 개선

Generator, Coroutine 지원

반복 탐색을 쉽게 할 수 있는 Generator 문법이 추가되었다. Generators 페이지 참고

finally 지원

예외를 다루기 위한 문법이 trycatch 밖에 없었지만 이제 Java 처럼 finally도 사용할 수 있다

간단한 패스워드 해싱 함수 추가

$password = "foo";
$hash = password_hash($password, PASSWORD_DEFAULT);
// 패스워드의 해시 값을 저장한다

if (password_verify($password, $hash)) {
    // 패스워드가 맞음
}
else {
    // 패스워드가 틀림
}

password_get_info(), password_hash(), password_needs_rehash(), password_verify() 4개의 함수가 생겼다.

pack(), unpack() 함수 수정

기존의 a 코드(NUL-padded string)와 같게 동작하는 Z 코드가 추가되어 Perl과 비슷하게 동작하게 되었다. 대신 unpack()에서 a 코드는 뒤쪽의 NULL 바이트들을 유지하도록 변경되었고 A 코드는 뒤쪽의 화이트스페이스를 제거하도록 변경되었다. 따라서 a, A 코드를 사용할 때는 PHP 5.5.0 이전 버전인지 아닌지에 따라 결과가 다르게 나올 수 있으므로 사용시 PHP 버전 체크가 필요할 수 있다. 

// Old code:
$data = unpack('a5', $packed);

// New code:
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
  $data = unpack('Z5', $packed);
}
else {
  $data = unpack('a5', $packed);
}

self, parent, static 키워드 대소문자 구분 안함

class Test {
	private static $val;

	public static function run() {
		return (self::$val == SELF::$val);
	}
}

set_error_handler() 에러 핸들러 초기화

첫 번째 파라미터에 NULL 값을 넘겨서 설정된 에러 핸들러를 제거할 수 있고 이 때 함수는 이전 에러 핸들러 함수를 리턴한다. 비슷하게 set_exception_handler() 함수에 NULL 값을 넘겼을 때도 TRUE 값 대신 이전 예외 핸들러를 리턴해준다.

json_encode() 최대 깊이 지정

세 번째 파라미터로 depth 값을 지정할 수 있다. 기본 값은 512.

기타

  • array_column()boolval() 함수 추가
  • setcookie() 함수에 Max-Age 설정 가능
  • assert() 함수에 description 파라미터 추가

익스텐션 관련 변경

OPCache

Zend Optimizer+ 캐시가 OPCache 라는 이름의 익스텐션으로 기본 추가되었다. 

GD

  • 이미지를 뒤집는 imageflip() 함수 추가
  • 이미지를 자르는 imagecrop()imagecropauto() 함수 추가
  • WebP 이미지를 읽고 쓸 수 있는 imagecreatefromwebp()imagewebp() 함수 추가

Apache2 Handler SAPI

윈도우즈용 PHP에서 Apache 2.4 모듈 지원

참고