IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  오픈 소스  >

PHP V5.3의 새로운 기능, Part 1: 오브젝트 인터페이스의 변경 사항

developerWorks
문서 옵션

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

영어원문

영어원문


제안 및 의견
피드백

난이도 : 중급

John Mertic, Software Engineer, SugarCRM

원문 게재일 : 2008 년 11 월 11 일
번역 게재일 : 2009 년 4 월 07 일

PHP V5.3이 곧 릴리스될 예정입니다. 이 릴리스에는 수 년 동안 계획되어 온 여러 가지 새 기능이 포함됩니다. 원래 "네이티브 유니코드를 지원하지 않는 PHP V6"으로 제공될 예정이었던 PHP V5.3은 PHP V5 제품군의 기능을 업그레이드한 제품으로 개발되었습니다. 이 버전은 여러 가지 새 기능이 추가되고, 기능 조정을 통해 기존 기능을 정리하고, 플랫폼별 문제를 해결하고, PHP의 후속 버전에서 사용되지 않을 오래된 기능을 제거한 PHP V6이 릴리스되기 전에 개발자들에게 새 버전에 적응할 기회를 주기 위해 개발되었습니다. 이 PHP V5.3의 새로운 기능" 시리즈에서는 새로운 V5.3 기능을 살펴본 후 기능의 사용 방법과 웹 애플리케이션에서 사용하는 방법에 대해 설명합니다.

PHP V5와 오브젝트 지향 프로그래밍

2004년에 릴리스된 PHP V5는 오브젝트 지향 프로그래밍(OOP) 및 설계 면에 있어서 PHP V4에 비해 상당히 발전된 제품이다. 클래스 가시성, 적합한 생성자 및 소멸자, 유형 힌트 및 클래스 리플렉션 API와 같은 여러 가지 필요한 기능이 추가된 V5는 진보된 PHP의 오브젝트 지향 프로그래밍을 제공한다. 이를 통해 우리는 향상된 설계 클래스 및 API를 사용하여 많은 설계 패턴을 더욱 쉽게 구현할 수 있게 되었다.

PHP V5.3에서는 OOP 향상을 위해 그동안 개발된 여러 가지 기능이 추가되었다. 특히 구문 부분에 여러 기능이 추가되었으며 성능 또한 크게 향상되었다. 먼저, 정적 메소드 및 멤버와 함께 사용할 수 있는 새로운 기능부터 살펴보자.




위로


향상된 정적 메소드 및 멤버 처리 방법

PHP V5에서 추가된 유용한 기능 중 하나는 클래스의 메소드 또는 멤버를 정적 항목으로 지정하는 기능이었다. (PHP V4에서도 클래스의 메소드 및 멤버에 대한 정적 액세스가 지원되기는 했지만 이러한 메소드나 멤버를 정적 액세스를 위한 항목으로 지정할 수는 없었다.) 정적 액세스는 클래스의 인스턴스가 단 하나만 존재하는 싱글톤 설계 패턴을 구현할 때 특히 유용하다.

PHP V5.3에서는 클래스 내의 정적 멤버 및 메소드에 대한 지원을 개선하는 여러 가지 기능이 추가되었다. 새로 추가된 기능 중 매직 메소드인 __callStatic()부터 살펴보자.

_callStatic() 매직 메소드

PHP V5에는 클래스 내에서 사용하기 위해 특별히 정의된 여러 가지 매직 메소드가 있다. 클래스에서 정의된 경우, 이러한 메소드는 특별한 기능을 제공하며 오버로드(메소드가 다양한 유형의 매개변수를 채택할 수 있도록 지원하는 기능) 및 다형성(다양한 데이터 유형이 동일한 인터페이스를 사용할 수 있도록 지원하는 기능)을 지원한다. 또한 다양한 유형의 OOP 프로그래밍 메소드 및 설계 패턴을 PHP에서 간편하게 사용할 수 있는 방법도 제공한다.

PHP V5.3에서는 __callStatic()이라는 새 매직 메소드가 추가되었다. 클래스에 정의되어 있지 않거나 클래스에서 볼 수 없는 메소드에 대한 호출을 처리하는 __call() 매직 메소드와 유사하게 작동하는 __callStatic()은 정적 메소드 호출을 처리하는 데 사용된다. 이 매직 메소드를 사용하면 메소드 오버로드를 효율적으로 설계할 수 있다. 다음은 이 메소드의 사용 방법을 보여 주는 예제이다.


Listing 1. __callStatic()__call()의 사용 방법을 비교하는 예제
 
class Foo 
{ 
    public static function __callStatic( 
        $name, 
        $args 
        ) 
    { 
        echo "Called method $name statically"; 
    } 

    public function __call( 
        $name, 
        $args 
        ) 
    { 
        echo "Called method $name"; 
    } 
} 

Foo::dog();       // outputs "Called method dog statically" 
$foo = new Foo; 
$foo->dog();      // outputs "Called method dog" 

PHP에서 __callStatic() 메소드를 사용할 때 한 가지 주의할 점은 이 메소드를 public으로 정의하고 static으로 선언해야 한다는 것이다. __call() 매직 메소드도 다른 모든 매직 메소드와 마찬가지로 public으로 정의되어야 한다.




위로


동적인 정적 호출

PHP의 좋은 기능 중 하나는 가변 변수 기능이다. 가변 변수가 지원되면 변수의 문자열 값을 사용하여 다른 변수의 이름을 지정할 수 있다. 다음 예제를 보면 쉽게 이해할 수 있다.


Listing 2. 가변 변수

    $x = 'y';
    $$x = 'z';
    echo $x;  // outputs 'y'
    echo $y;  // outputs 'z'
    echo $$x; // outputs 'z'

다음과 같이 함수와 클래스 메소드에도 동일한 개념이 적용된다.


Listing 3. 가변 함수 및 클래스 메소드 이름
 
class Dog 
{ 
    public function bark() 
    { 
        echo "Woof!"; 
    } 
} 

$class = 'Dog' 
$action = 'bark'; 
$x = new $class(); // instantiates the class 'Dog' 
$x->$action();     // outputs "Woof!" 

PHP V5.3에서는 정적 호출을 할 경우 클래스의 이름을 지정하면 이 이름은 변수가 된다. 이는 V5.3의 새 기능으로 다음과 같은 새로운 가능성을 제공한다.


Listing 4. 가변 클래스 이름 지정
 
class Dog 
{ 
    public static function bark() 
    { 
         echo "Woof!"; 
    } 
} 

$class = 'Dog'; 
$action = 'bark'; 
$class::$action();  //outputs "Woof!" 

PHP의 가변 변수 기능을 완성시켜 주는 이 추가 기능은 모든 PHP 작업에서 활용할 수 있다.

마지막 정적 요소 바인딩 또한 정적 메소드 및 멤버의 사용과 관련하여 향상된 기능 중 하나이다.




위로


마지막 정적 요소 바인딩

PHP V5.3 이전에는 정적 메소드 및 멤버를 처리하기가 쉽지 않았다. 지금까지도 self 또는 __CLASS__를 사용하여 만든 정적 참조는 함수가 정의된 클래스 범위에서 확인된다. 이 경우 문제점은 클래스를 확장하여 새로운 하위 클래스에서 호출이 발생했을 때 참조가 올바르지 않을 수 있다는 것이다. PHP V5.3에 추가된 마지막 정적 요소 바인딩 기능은 이러한 문제를 해결한다. 쉽게 이해할 수 있도록 다음과 같이 정적 메소드가 포함된 클래스를 만들어 보자.


Listing 5. 정적 메소드 test()가 포함된 클래스 Foo
     
class Foo 
{ 
    protected static $name = 'Foo'; 

    public static function test() 
    { 
        return self::$name; 
    } 
} 

이제 이 클래스를 확장하여 하위 클래스에서 $name이라는 멤버를 다시 정의한다.


Listing 6. 상위 클래스 Foo를 확장한 하위 클래스 Bar
     
    class Bar extends Foo
    {
       protected static $name = 'Bar';
    }

Listing 7에서는 정적 메소드를 호출한다.


Listing 7. 정적 메소드 호출 test()
 
echo Bar::test(); 

호출하면 Foo라는 문자열이 출력된다. 이러한 결과가 발생하는 이유는 test() 메소드에 있는 self::$name 참조가 Foo 클래스에서 수행되기 때문이다. 즉, 함수가 정의되어 있는 위치에서 바인딩이 발생하는 것이다.

PHP V5.3에서는 현재 클래스를 참조하기 위해 static이라는 키워드가 추가되었다. Listing 8에서는 위에서 설명한 Foo 클래스를 변경하여 이 키워드를 사용하는 방법을 보여 주고 있으며 출력이 Bar로 바뀌었음을 알 수 있다.


Listing 8. static 키워드 사용
 
class Foo 
{ 
    protected static $name = 'Foo'; 

    public static function test() 
    { 
        return static::$name; 
    } 
} 

class Bar 
{ 
    protected static $name = 'Bar'; 
} 

echo Bar::test(); // outputs 'Bar'

static 키워드와 관련하여 한 가지 주의할 점은 정적 컨텍스트와 그외의 컨텍스트에서 이 키워드가 다르게 작동한다는 것이다. 즉, 일반적인 상속 규칙이 정적 호출에 적용되지 않는다. static 키워드는 함수가 정의되어 있는 클래스가 아닌 현재 클래스에 있는 호출을 확인한다. 이 특징을 잘 알고 있어야 한다.

지금까지 정적 메소드 및 멤버와 관련하여 향상된 기능을 살펴보았다. 이제 PHP V5의 매우 유용한 부분인 Standard PHP Library에 새롭게 추가된 클래스에 대해 알아 보자.




위로


SPL(Standard PHP Library)

SPL(Standard PHP Library)은 일반적인 문제점을 해결하기 위해 PHP V5에 추가된 인터페이스 및 클래스의 콜렉션이다. 여기에는 오브젝트가 반복 가능하게 되거나 배열과 같이 작동하거나 연결된 목록이 구현되는 등의 문제가 있다. 이러한 클래스와 메소드는 PHP에서 기본으로 제공되기 때문에 이오브젝트를 PHP로 구현했을 때보다 더 빠르게 실행된다는 장점을 가지고 있다. 또한 Iterator 인터페이스에서 foreach 구문을 사용하여 오브젝트를 반복할 수 있는 것처럼 PHP의 여러 내부 함수에서 이러한 오브젝트를 직접 사용할 수 있다.

PHP V5.3에서는 SPL에 일부 클래스가 추가되었다. 앞에서 SPL 클래스 SplDoublyLinkedList에 있는 양방향 연결 목록의 구현을 참조했다. 이 클래스는 스택을 구현한 SplStack과 큐를 구현한 SplQueue라는 새로운 두 SPL 클래스에서 사용된다.

이제 SplStack 클래스를 사용하여 스택을 구현하는 방법을 살펴보자.


Listing 9. SplStack 사용

$stack = new SplStack(); 

// push a few new items on the stack 
$stack->push('a'); 
$stack->push('b'); 
$stack->push('c'); 

// see how many items are on the stack 
echo count($stack); // returns 3 

// iterate over the items in the stack 
foreach ( $stack as $item ) 
    echo "[$item],";   
// the above outputs: [c],[b],[a]

// pop an item off the stack 
echo $stack->pop(); // returns 'c' 

// now see how many items are on the stack 
echo count($stack); // returns 2

SqlQueue도 비슷한 방식으로 작동하지만, 나중에 들어온 항목이 먼저 나가는 스택 방식이 아닌 먼저 들어온 항목이 먼저 나가는 큐 방식으로 작동한다. 이와 더불어 힙 구현(SplHeap)과 특정 상황을 위한 특정 큐 및 힙 구현(SplMinHeap, SplMaxHeapSplPriorityQueue)도 있다.

SplFixedArray 클래스도 새롭게 추가된 유용한 기능으로는 이름에서 알 수 있듯이 고정 크기 배열 구현을 들 수 있다. 그렇지만 이 클래스는 처리 속도가 매우 빠르며 벤치마크 결과 PHP의 내장 배열 구현보다도 10 - 30% 정도 빠른 것으로 밝혀졌다. 속도가 빨라진 이유는 이 배열이 기본 PHP 배열과 같은 가변 크기 배열이 아닌 고정 크기 배열이면서 비수치 인덱스가 허용되지 않기 때문이다. Listing 10에서는 이 배열의 사용 방법을 보여 준다.


Listing 10. SplFixedArray

$array = new SplFixedArray(3); 
$array[0] = 'dog'; 
$array[1] = 'cat'; 
$array[2] = 'bird'; 
$a->setSize(4); // increase the size on the fly 
$array[3] = 'mouse'; 
foreach ( $array as $value ) 
    echo "[$value],";

Output: 
[dog],[cat],[bird],[mouse] 

반복자 클래스인 FilesystemIteratorGlobIterator도 새롭게 추가되었다. 이들 클래스는 PHP의 다른 반복자 클래스와 동일하게 작동하지만 특정 상황을 위해 특별히 설계되었다.

PHP V5.3에서부터는 SPL이 항상 사용된다는 것 또한 새롭게 변경된 부분이다. PHP V5의 이전 버전에서는 컴파일 시간에 SPL을 비활성화할 수 있었지만 PHP V5.3부터는 더 이상 비활성화할 수 없다.

이처럼 SPL에 새롭게 추가된 기능으로 유용하면서도 사용하기 쉬운 기능이 PHP에 추가되었으며, 양방향 연결 목록, 스택, 힙, 및 큐와 같은 데이터 구조의 구현도 추가되었다. 속도를 향상시키고 다양한 PHP 함수 및 구문과 효과적으로 통합할 수 있는 이들 클래스를 사용하여 사용자 공간 구현을 대체할 수 있다.

지금까지 SPL에 추가된 새 기능을 살펴보았다. 이제 PHP V5.3의 OOP에서 새롭게 추가된 순환 가비지 콜렉션을 통해 얻을 수 있는 성능 및 메모리 효율 향상에 대해 살펴보자.




위로


순환 가비지 콜렉션

PHP 개발자가 성능 관점에서 겪게 되는 문제점 중 하나는 가비지 콜렉션이다. PHP에서는 기본적으로 더 이상 범위에 포함되지 않는 오브젝트에 대해 가비지 콜렉션을 수행하는 매우 간단한 가비지 콜렉터를 사용한다. 이 작업은 내부적으로 참조 카운터를 사용하여 수행되기 때문에 카운터가 0에 도달하면(즉, 해당 오브젝트에 대한 참조가 하나도 없으면) 오브젝트에 대한 가비지 콜렉션이 수행되면서 메모리가 삭제된다.

이 기능은 문제없이 작동하지만 상위-하위 관계에서 한 오브젝트가 다른 오브젝트를 참조하는 경우에 문제가 발생할 수 있다. 이 경우에는 해당 오브젝트에 대한 참조 카운터가 수집되지 않기 때문에 오브젝트에 사용되는 메모리가 참조되지 않은 메모리로 유지되며, 결과적으로 요청이 끝날 때까지 할당 해제되지 않는다. 이 문제가 발생하는 예는 다음과 같다.


Listing 11. 가비지 콜렉션이 적절하게 수행되지 않는 PHP V5.2 이전의 상위-하위 클래스 관계

class Parent 
{ 
    public function __construct() 
    { 
        $this->child = new Child($this); 
    } 
} 

class Child 
{ 
    public function __construct( 
        Parent $parent 
        ) 
    { 
        $this->parent = $parent; 
    } 
} 

이 예제에서는 Parent 클래스의 인스턴스 만든 다음 인스턴스가 범위를 벗어날 때마다, 메모리가 해제되지 않기 때문에 스크립트에 사용되는 메모리 용량이 지속적으로 늘어난다. 이 문제를 해결하기 위한 사용자 공간 솔루션 중 하나는 상위 클래스의 소멸자를 생성하여 하위 오브젝트를 직접 해제하는 것이다. 상위 클래스 참조를 설정 해제하기 전에 명시적으로 이 소멸자를 호출해야 한다. 이 모든 작업을 수행하게 되면 코드가 복잡해진다.

PHP V5.3에서는 가비지 콜렉터가 이러한 순환 참조를 감지하며 순환 참조에 사용된 메모리가 사용 가능하기 때문에 스크립트를 실행하는 동안 PHP 메모리 사용량이 일정하게 유지된다. Parent 클래스에 대한 각 참조가 제거되면 Parent 클래스 내의 Child 클래스에 대해서도 가비지 콜렉션이 수행된다.




위로


요약

오랜 기간 동안 오브젝트 지향 프로그래밍을 지원해 온 PHP는 OOP를 간단하게 지원하던 PHP V4에서 부터 괄목할 만한 성장을 보여 준 PHP V5와 조정이 이루어진 후속 버전을 거쳐 향상된 기능을 제공하는 PHP V5.3에 이르렀다. 이 버전에서는 __callStatic() 매직 메소드, 동적인 정적 호출, 마지막 정적 요소 바인딩, 정적 메소드 및 멤버 지원 등의 구문 관련 기능이 향상되었고 양방향 연결 목록, 스택, 힙 및 큐의 구현이 SPL에 새롭게 추가되어 자주 사용되는 데이터 구조를 언제라도 쉽게 사용할 수 있게 되었다. 순환 인스턴스에 대한 메모리를 해제하도록 하는 크게 향상된 가비지 콜렉터를 구현하여, 자체 참조 클래스로 인해 오랫동안 해결되지 못했던 순환 가비지 콜렉터의 메모리 및 성능 문제를 해결했다. 이렇게 모든 기능을 갖춘 PHP V5.3은 오브젝트 지향 프로그래밍 언어로서의 입지를 더욱 견고하게 다지게 될 것이다.



참고자료

교육
  • "PHP V5.3의 새로운 기능, Part 2, Part 3Part 4도 계속해서 읽어보자.

  • Zend Developer Zone에서 메모리 관리 함수에 대한 설명을 볼 수 있다.

  • PHP V4에서 개발한 코드를 V5로 마이그레이션하는 방법에 대한 자세한 설명은 "A PHP V5 migration guide"에서 볼 수 있다.

  • "Connecting PHP Applications to Apache Derby"에서는 PHP를 Windows®에 설치하고 구성하는 방법에 대해 설명한다(일부 단계는 Linux®에 해당됨).

  • PHP.net은 PHP 개발자들이 주로 이용하는 웹 사이트이다.

  • "Recommended PHP reading list"를 확인하자.

  • developerWorks에 있는 PHP 컨텐츠를 모두 찾아보자.

  • IBM developerWorks의 PHP project resources를 활용하여 PHP 기술을 향상시키자.

  • developerWorks 포드캐스트에서 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 들어보자.

  • PHP를 통해 데이터베이스를 사용하고 있다면 Zend Core for IBM을 살펴보자. 이 환경은 IBM DB2 V9가 지원되는 설치가 간편하고 바로 사용할 수 있는 안정적인 PHP 개발 및 프로덕션 환경이다.

  • developerWorks 기술 행사 및 웹 캐스트를 통해 최신 정보를 얻을 수 있다.

  • IBM 오픈 소스 개발자에게 유익한 컨퍼런스, 기술 박람회, 웹 캐스트 및 기타 행사를 확인하고 참여하자.

  • developerWorks 오픈 소스 영역에서 오픈 소스 기술을 활용하여 개발 작업을 수행하고 이러한 기술을 IBM 제품과 함께 사용하는 데 도움이 되는 사용법 정보, 도구 및 프로젝트 업데이트를 확인할 수 있다.

  • 무료로 제공되는 developerWorks On demand demos를 통해 IBM 및 오픈 소스 기술에 대해 배우고 제품 기능을 익히자.


제품 및 기술 얻기
  • DVD로 제공되거나 다운로드할 수 있는 IBM 시험판 소프트웨어를 사용하여 후속 오픈 소스 개발 프로젝트를 구현해 보자.

  • IBM 평가판 제품을 다운로드하여 DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용하자.


토론


필자소개

John Mertic은 Kent State University의 컴퓨터 과학과를 졸업했으며, SugarCRM에서 소프트웨어 엔지니어로 근무하고 있다. 여러 오픈 소스 프로젝트에 참여했으며, 특히 PHP 프로젝트에 주력하고 있다. 또한 PHP Windows Installer를 개발 및 유지보수를 수행한다.




기사에 대한 평가


보다 나은 서비스를 제공하기 위함이오니 잠시 짬을 내어 이 양식을 제출하여 주십시오.



 


 


 


이 문서 북마킹 하기

mar.gar.in mar.gar.in naver naver eolin eolin del.icio.us del.icio.us





위로


developerWorks 콘텐트를 다른 사이트에 전재하기:
developerWorks 콘텐트에 대한 저작권은 IBM에 있습니다. IBM의 서면 허가나 원본 저자의 허락이 없이는 전재를 금합니다. 저희 콘텐트를 전재하시려면 IBM developerWorks 담당자 에게 문의하십시오.
    IBM 소개 개인정보 보호정책 문의