hTemplate – 3.2.객체 생성 및 소멸

객체 생성 및 소멸

생성자(constructor)

객체 생성할 때 후키템플릿 클래스의 생성자로 전달하게 되는 정보로는 아래와 같이 템플릿 파일 기본 디렉토리, 캐시 정보, 컴파일 정보 및 필터 명령 정보가 있습니다. 이 중에 필터 명령 정보는 1.2.0 버전에서 추가되었습니다.

각 인수는 모두 생략할 수 있으며 생략하게 되면 각 인수마다 기본으로 지정된 기본값으로 동작하게 됩니다.

각 인수에 관한 상세한 내용은 ‘환경설정’ 메뉴를 살펴보시기 바랍니다.

객 체생성을 위한 new 연산자 앞에 있는 기호 &는 PHP 4.0.4부터 지원하는 참조(레퍼런스) 기능입니다. 참조(레퍼런스)에 대한 자세한 것은 상단메뉴의 “class & object >> 참조(reference)”를 참조하기 바랍니다.

zend 엔진 1.0에서는 객체를 참조가 아닌 값으로 취급하도록 설계되어 있어서 변수에 값을 할당하거나 함수에 인수를 전달하는 것과 같은 조작을 할 때 항상 객체 복사 과정이 따르게 됩니다. 이는 스크립트 동작에 다소 부담이 되고 있어 zend 엔진 2.0에서는 객체를 다룰 때 값이 아닌 참조로 다루도록 변경되었습니다. 따라서 zend 엔진 2.0이 탑재된 PHP 5.0.0 dev에서는 아래와 같이 참조연산자 &를 생략하더라도 $tpl은 생성된 객체에 대한 복사본이 아닌 참조로 설정됩니다.

 zend 엔진 2.0에 대한 자세한 것은 제 홈페이지 메뉴 “class & object >> Zend2 객체모델”를 참조하기 바랍니다.

shutdown 콜백함수 및 소멸자(destructor)

shutdown 콜백함수 또는 소멸자에서는 현재 문서에 대한 템플릿 정보를 캐시합니다.

0.0.4 이전 버전에서는 FastPrint() 함수가 처음 실행될 때 캐시핸들러의 write(), close() 함수가 동작하였지만 1.0.0 버전부터는 register_shutdown_function()로 지정된 콜백함수 내에서 캐시하도록 수정하였습니다. 물론 zend engine 2.0이 탑재된 PHP 5.0.0 dev 이상 버전에서는 콜백함수 대신에 소멸자를 이용합니다.1.2.0 버전에서는 PHP4,5에 관계없이 register_shutdown_function()로 지정된 콜백함수 내에서 캐시합니다.

후키템플릿 클래스의 객체가 여러 개 생성되었을 때는 처음 생성된 객체의 shutdown 콜백함수 또는 소멸자에서만 캐시핸들러가 동작합니다.

zend 엔진 1.0일 때 대부분의 경우에는 new 연산자를 통해 반환된 $tpl이 객체의 복사본이더라도 별 문제는 발생하지 않습니다. 그러나 소멸자를 흉내내기 위해 생성자 내에서 register_shutdown_function()을 이용하여 콜백함수로 설정된 클래스 멤버함수 내에서 $this 객체를 이용할 때는 매우 미묘한 문제(?)가 발생하게 되며 이로 인하여 정상적으로 객체를 다룰 수 없게 됩니다. 이러한 미묘한 문제를 만나지 않으려면 객체를 생성, 대입 등을 할 때 반드시 참조로 다루어야 합니다.

반면 zend 엔진 2.0에서는 객체가 참조로 다루어지므로 이러한 문제가 근본적으로 발생하지 않습니다.

객체 생성을 여러번 하는데 따른 문제점

1.0.0 버전부터는 한 문서에 몇개의 객체를 생성하든지 상관없이 한 객체를 가지고 처리하는 것과 동일하게 처리합니다. 이를 위하여 현재 템플릿 정보 리스트 및 템플릿 변수 리스트를 정적 멤버 변수(?)에 저장하도록 수정하였습니다.

앞에서 객체 생성할 때 후키템플릿 클래스의 생성자로 전달하게 되는 정보로는 템플릿 파일 기본 디렉토리, 캐시 정보, 컴파일 정보 및 필터 정보가 있다고 하였습니다.

한 문서에서 객체를 여러 번 생성할 때에는 처음 생성된 객체에서 지정한 캐시 정보, 컴파일 정보 및 필터 정보만 유효하며 두번째부터는 이 정보들을 무시합니다. 반면에 템플릿 파일 기본 디렉토리는 각 객체마다 독립적으로 지정할 수 있으며, 추가로 지정된 기본 디렉토리 정보는 기본 디렉토리 정보를 저장하고 있는 배열에 추가됩니다.

답글 남기기