 |
|
난이도 : 중급 John Mertic, Software Engineer, SugarCRM
원문 게재일 : 2009 년 2 월 24 일 번역 게재일 : 2009 년 5 월 26 일 이 "PHP
V5.3의 새로운 기능" 시리즈에서는 곧 발표될 예정인 PHP V5.3의 흥미롭고 새로운 기능에 대해 설명합니다. Part 1에서는
PHP V5.3의 오브젝트 지향 프로그래밍 및 오브젝트 처리와 관련된 변경 사항을 살펴보았으며, Part 2에서는
람다 함수와 클로저에 대해 살펴보았습니다. Part 3에서는
PHP V5.3에서 가장 큰 기대를 받으면서도 가장 큰 논란의 대상이기도 한 네임스페이스에 대해 설명했으며 Part 4에서는 PHP 내에서 사용할 수 있는 아카이브 형식인 Phar에 대해 자세히 살펴보았습니다. 이제 이 시리즈의
마지막 기사인 Part 5에서는 PHP V5.2에서 업그레이드할 때 고려할 사항에 대해 설명합니다. PHP V5.3에는
이전 버전과 호환되지 않는 변경 사항과 후속 버전에서 제거될 예정인 사용되지 않는 기능이 있습니다. PHP의
기존 기능에 대한 몇 가지 개선 사항에 대해서도 설명합니다.
소개
지금까지 이 시리즈에서는 네임스페이스, 클로저, 오브젝트 처리, 오브젝트 지향 프로그래밍,
Phar 등과 같은 PHP V5.3의 새로운 기능을 주로 살펴보았다. 이들 유용한 새 기능 외에도 PHP
V5.3에는 PHP의 전반적인 성능을 대폭 개선하기 위한 설계가 적용되었다. 많은 개발자가 사용하고
있는 안정적인 PHP V5.2를 기반으로 설계된 PHP V5.3은 강력한 성능을 제공한다. 이 기사에서는
PHP V5.2에서 업그레이드할 때 고려할 사항과 변경 사항에 대해 설명한다.
구문 변경 사항
네임스페이스 및 클로저 기능(Part 2
및 Part 3 참조)이 추가되면서
예약어도 추가되었다. PHP V5.3부터는 namespace를 더 이상 식별자로
사용할 수 없다. closure 클래스는 예약 클래스이지만 올바른 식별자로
계속 사용할 수 있다. Listing 1에서는 추가된 예약어로 인해 PHP V5.3에서 더 이상 작동하지 않는
명령문 예제를 보여 준다.
Listing 1. 올바르지 않은 PHP 명령문
// the function definition below will throw a fatal error in PHP 5.3, but is perfectly
// valid in 5.2
function namespace()
{
....
}
// same with this class definition
class Closure
{
....
}
|
goto 명령문에 대한 지원도 PHP V5.3에서 추가되었다. 이제
goto는 예약어이다. goto 명령문은
현대 언어에서 많이 사용되고 있지는 않지만(과거 BASIC에서 자주 사용됨) 아직까지도 가끔씩은
유용하게 사용할 수 있는 경우가 있다. Listing 2 예제에서는 이 명령문의 작동 방법을 보여 준다.
Listing 2. PHP의 goto 명령문
echo "This text will get outputted";
goto a;
echo "This text will get skipped";
a:
echo "This text will get outputted";
|
goto는 여러 번 중첩된 루프 및 if 명령문에서
빠져 나올 때 유용하게 사용할 수 있다. 이러한 경우에 goto 명령문을 사용하면 코드를 훨씬 쉽게 읽을 수 있다.
함수 및 메소드의 변경 사항
PHP V5.3에서는 함수와 메소드가 많이 변경되지는 않았지만 PHP의 당면 문제와 성능 향상을 위해
몇 가지 개선 사항이 적용되었다. 이 섹션에서는 몇 가지 주목할 만한 변경 사항에 대해 설명한다.
이전 버전의 PHP에서는 배열 함수 atsort, natcasesort, usort,
uasort, uksort, array_flip 및 array_unique에서
배열 대신 오브젝트를 매개변수로 전달한다. 그런 다음 이들 함수는 오브젝트의 특성을 배열 키 및 값으로 간주한다. PHP V5.3에서는
이 기능을 더 이상 사용할 수 없으므로 오브젝트를 배열로 먼저 변환해야 한다. Listing 3에서는 코드를 변경하는 방법을 보여 준다.
Listing 3. 특정 함수에 사용되는 오브젝트를 배열로 변환하기 위해 코드 변경하기
$obj = new stdClass;
$obj->a = '1';
$obj->b = '2';
$obj->c = '3';
print_r(array_flip($obj)); // will NOT work in PHP 5.3, but will in PHP 5.2
print_r(array_flip((array) $obj)); // will work in PHP 5.3 and 5.2
|
매직 클래스 메소드가 더욱 엄격하게 적용된다. 다음과 같은 메소드의 가시성은 public이어야 한다.
__get
__set
__isset
__unset
__call
정적 컨텍스트에서 __call을 사용했던 경우에는 새로운
__callStatic() 매직 메소드를 이 변경 사항에 대한 해결
방법으로 사용할 수 있다. 매개변수를 받지 않는 __isString()
매직 메소드를 제외한 나머지 매직 메소드에는 필수 인수가 반드시 있어야 하고 적용되어야
한다. Listing 4에서는 이러한 메소드 및 해당 필수 매개변수를 사용하는 방법을 보여 준다.
Listing 4. 매직 메소드 사용하기
class Foo
{
public function __get($key) {} // must be public and have one parameter
public function __set($key,$val) {} // must be public and have two parameters
public function __toString() {} must be public and have no parameters
}
|
이전 버전의 Windows용 PHP에서 지원되지 않았던 몇 가지 함수가 PHP V5.3에서 지원된다. 예를
들어 getopt() 함수는 명령행에서 PHP 스크립트를 호출하는 옵션을 구문
분석하기 위해 설계되었다. 인터넷 주소를 인코딩 및 디코딩하는 inet_ntop()
및 inet_pton() 함수가 이제 Windows®에서도 작동한다. asinh(),
acosh(), atanh(), log1p()
및 expm1() 등의 몇 가지 수학 함수도 Windows에서 지원된다.
확장 변경 사항
PHP의 새 확장은 주로 PECL(PHP Extension C Library)을 기반으로 하여 개발된다. 하나의 확장이
발전을 거듭하며 안정적인 상태에 도달하게 되면 이 확장은 자연스럽게 코어 배포판의 유용한 기능으로
인식되면서 주요 버전 변경 시에 추가되기도 한다. 이처럼 PHP V5.3에서도 다음과 같은 확장이 코어
PHP 배포판의 일부로 추가되었다.
- FileInfo
- 파일에 있는 특정 매직 바이트 문자 시퀀스를 검사하여 파일의 컨텐츠 유형 및 인코딩을 확인하는 데 사용할 수 있는 함수를 제공한다.
- intl
- ICU(International Components for Unicode) 라이브러리에 대한 랩퍼로 유니코드 및 세계화 지원을 위한 함수를 제공한다.
- Phar
- Part 4에서 설명한 PHP 아카이브 도구이다.
- mysqlnd
- MySQL 데이터베이스 액세스를 위한 원시 PHP 드라이버이며 libmysql 라이브러리를 활용했던 기존 MySQL 및 MySQLi 확장을 대체한다.
- SQLite3
- SQLite V3 데이터베이스를 사용하기 위한 라이브러리이다.
더 이상 적극적으로 관리되지 않거나 코어 PHP 배포판에 유지할 만한 가치가 없는
것으로 판단된 확장은 PECL로 옮겨진다. PHP V5.3의 확장을 조정하는 과정에서 다음과
같은 확장은 코어 PHP 배포판에서 제거하고 PECL의 일부로 유지하는 것으로 결정되었다.
- ncurses
- 명령행에서 그래픽 출력을 표시하는 데 사용되는 curse의 에뮬레이션이다.
- fpdf
- PDF 문서 내의 양식 및 양식 데이터를 빌드하고 사용하는 방법을 처리한다.
- dbase
- dbase 호환 파일을 읽고 쓰는 데 필요한 지원을 제공한다.
- fbsql
- Frontbase 데이터베이스 서버에 대한 데이터베이스 액세스를 지원한다.
- ming
- Flash 4 애니메이션을 만드는 데 사용되는 오픈 소스 라이브러리이다.
Sybase 확장은 완전히 제거되고 sybase_ct 확장으로 대체되었다. sybase_ct 확장은 이전
확장과 완전히 호환되며 임시 대체용으로 제공되는 확장이다. 새로운 함수는 사용자의 웹
서버에 설치해야 하는 Sybase client 라이브러리를 사용하게 된다.
빌드 변경 사항
PHP V5.3에서는 많은 노력을 들여서 빌드 프로세스를 개선하였으며 그 결과로서 모든 플랫폼에서
더욱 쉽게 PHP를 빌드할 수 있게 되었다. PHP 빌드 간의 일관성을 유지하고 보장된 PHP 구성 요소
세트를 제공하기 위해 더 이상 PCRE, Reflection 및 SPL 확장을 빌드에서 비활성화할 수 없게
되었다. 따라서 이러한 확장을 사용할 뿐 아니라 사용 가능성까지도 보장되는 배포 가능한 PHP
애플리케이션을 빌드할 수 있다.
지난 해에 새 팀에서 PHP Windows 빌드를 인수했다. 이 팀에서는 PHP V5.3부터 Windows 사용자를
위한 몇 가지 개선 사항을 제공할 것이다. 새 빌드는 586 아키텍처(Intel® Pentium® 이상)를
대상으로 하고 Windows 2000/XP 이후 버전만을 지원하며 Windows 98/NT 이전 버전은 지원하지 않는다. Microsoft®
Visual Studio® 2008을 사용하여 작성된 PHP 빌드와 x86-64 아키텍처를 대상으로 하는 빌드가
작성될 것이다. 이들 빌드는 Microsoft IIS 웹 서버의 FastCGI 또는 같은 컴파일러 및 아키텍처를
사용하여 빌드된 Apache와 함께 작동할 때 향상된 성능을 제공한다. Windows Installer 또한 PHP를
Microsoft IIS 웹 서버에 더욱 적합하게 구성할 수 있도록 향상되었다. 이 팀은 Windows용 PHP와
관련된 웹 사이트를 제공하고 있다(참고자료 참조).
.ini 변경 사항
PHP의 중요한 특징 중 하나는 .ini 파일을 사용하여 작동을 구성할 수 있다는 것이다. PHP V5.3에서는
이 파일에 사용되는 지시문 중 문제의 소지가 있는 몇 가지 지시문(예: zend.ze1_compatibility_mode 설정)이
제거되었다. 이제부터는 이 파일을 매우 유연하게 사용할 수 있다.
php.ini 파일에는 다음과 같은 두 가지 주요 개선 사항이 있다.
- php.ini 파일에서 변수를 사용할 수 있다. 변수를 사용하게 되면 파일 내에서
중복되는 항목을 쉽게 제거할 수 있고 변경이 필요할 때 파일을 쉽게 업데이트할 수 있다. Listing 5에서는 이에 대한 예제를 보여 준다.
Listing 5. php.ini 파일의 변수
foo = bar
[section]
newfoo = ${foo}
|
foo와 newfoo가 같은 값을 가지고 있다.
- Apache 구성 파일을 사용하여 동일한 설정을 적용할 때와 비슷하게 디렉토리별 및 사이트별
PHP ini 설정을 적용할 수 있다. 이 방법의 장점은 PHP를 실행할 수 있는 다양한 모든 SAPI에서
일관된 구문을 사용할 수 있다는 것이다. Listing 6에서는 이러한 설정이 작동하는 방법을 보여 준다.
Listing 6. 사이트별 및 디렉토리별 .ini 설정
[PATH=/var/www/site1]
; directives here only apply to PHP files in the /var/www/site1 directory
[HOST=www.example.com]
; directives here only apply to PHP files requested from the www.example.com site.
|
Apache HTTP 웹 서버에서 작동하는 .htaccess 파일처럼 이러한 .ini 지시문을 파일
시스템 자체에 있는 사용자 지정 .ini 파일로 작성할 수도 있다. 이 파일의 기본 이름은
user_ini.filename 지시문에서 지정한다. 이 지시문을 빈 값으로 설정하여 이 기능을 비활성화할
수 있다. 사이트별 및 디렉토리별 지시문은 사용자 지정 .ini 파일에서 재정의할 수 없다.
제거된 항목
PHP V5.3부터는 공식적으로 후속 버전의 PHP에서 더 이상 사용할 수 없는 오래된 함수가
제거된다. 이러한 함수를 사용하면 E_DEPRECATED 오류가 발생한다. PHP V5.3에서 제거된 함수는 다음과 같다.
declare() 블록 내에서 구문 분석기에 의해 n개의 명령문이
실행될 때마다 함수를 호출하기 위해 설계된 틱 함수(declare(ticks=N) 및
register_tick_function()). 이들 함수는 함수 내에 중단되는 부분이 너무 많고
기능 자체가 많이 사용되지 않기 제거되었다.
- 모든 syslog 관련 변수를 초기화하는
define_syslog_variables(). 이
함수에서 정의한 상수가 이미 전역으로 정의되어 있기 때문에 이 함수는 더 이상 필요하지 않다. 이 함수 호출은
제거하기만 하면 된다.
ereg 정규 표현식 함수. 이 함수 대신 다른 언어 및 애플리케이션에서 사용되는
정규 표현식과의 일관성이 높고 처리 속도가 빠른 PCRE 정규 표현식 함수를 사용하는 것이 좋다. ereg
함수는 PHP의 정규 표현식 엔진을 하나로 표준화하기 위해 제거되었다.
PHP V5.3에서는 이러한 함수를 사용하지 않는 것이 좋다. 향후 주요 PHP 릴리스에서는 위 항목들에 대한 지원이 제거될 것이다.
요약
PHP V5.3에서는 수많은 새 기능이 추가되었으며 여러 항목이 "정리"되었다. 이전 버전과의
호환성으로 인한 몇 가지 문제도 있다. 이 기사에서는 웹 애플리케이션을 PHP V5.3과 작동하도록
마이그레이션하는 데 유용한 몇 가지 지침을 제공한다. PHP V5.3과 관련된 최신 정보를 제공하는
PHP wiki에서 애플리케이션에 영향을 줄 수 있는 기타 변경 사항에 대한
설명도 볼 수 있다.
참고자료 교육
제품 및 기술 얻기
-
PHPMyAdmin은 Phar 아카이브를 얼마나 쉽게 사용할 수 있는지 보여 주기 위한 예로 사용하기 위해 Phar로
패키징된 잘 알려진 PHP 애플리케이션이다.
-
PHP V5.2.6을 다운로드하자.
-
DVD로 제공되거나 다운로드할 수 있는 IBM 시험판
소프트웨어를 사용하여 후속 오픈 소스 개발 프로젝트를 구현해 보자.
-
IBM 시험판 제품을
다운로드하여 DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의 애플리케이션 개발 도구 및
미들웨어 제품을 사용하자.
토론
필자소개  | |  | John Mertic은 Kent State University의 컴퓨터 과학과를 졸업했으며,
SugarCRM에서 소프트웨어 엔지니어로 근무하고 있다. 여러 오픈 소스 프로젝트에 참여했으며, 특히 PHP 프로젝트에 주력하고 있다. 또한 PHP
Windows Installer를 개발 및 유지보수를 수행한다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|