written: Jan 28 2002
last modified: Sep 20 2006
last modified: Sep 20 2006
객체 생성 및 소멸
생성자(constructor)
객체 생성할 때 후키템플릿 클래스의 생성자로 전달하게 되는 정보로는 아래와 같이 템플릿 파일 기본 디렉토리, 캐시 정보, 컴파일 정보 및 필터 명령 정보가 있습니다. 이 중에 필터 명령 정보는 1.2.0 버전에서 추가되었습니다.
$tpl = new hTemplate(
템플릿 파일 기본 디렉토리,
캐시정보,
컴파일정보,
필터정보
);
각 인수는 모두 생략할 수 있으며 생략하게 되면 각 인수마다 기본으로 지정된 기본값으로 동작하게 됩니다.
각 인수에 관한 상세한 내용은 '환경설정' 메뉴를 살펴보시기 바랍니다.
[code php;gutter:false]
$tpl = &new hTemplate;
[/code]
객 체생성을 위한 new 연산자 앞에 있는 기호 &는 PHP 4.0.4부터 지원하는 참조(레퍼런스) 기능입니다. 참조(레퍼런스)에 대한 자세한 것은 상단메뉴의 "class & object >> 참조(reference)"를 참조하기 바랍니다.
zend 엔진 1.0에서는 객체를 참조가 아닌 값으로 취급하도록 설계되어 있어서 변수에 값을 할당하거나 함수에 인수를 전달하는 것과 같은 조작을 할 때 항상 객체 복사 과정이 따르게 됩니다. 이는 스크립트 동작에 다소 부담이 되고 있어 zend 엔진 2.0에서는 객체를 다룰 때 값이 아닌 참조로 다루도록 변경되었습니다. 따라서 zend 엔진 2.0이 탑재된 PHP 5.0.0 dev에서는 아래와 같이 참조연산자 &를 생략하더라도 $tpl은 생성된 객체에 대한 복사본이 아닌 참조로 설정됩니다.
[code php;gutter:false]
$tpl = new hTemplate;[/code]
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 버전부터는 한 문서에 몇개의 객체를 생성하든지 상관없이 한 객체를 가지고 처리하는 것과 동일하게 처리합니다. 이를 위하여 현재 템플릿 정보 리스트 및 템플릿 변수 리스트를 정적 멤버 변수(?)에 저장하도록 수정하였습니다.
앞에서 객체 생성할 때 후키템플릿 클래스의 생성자로 전달하게 되는 정보로는 템플릿 파일 기본 디렉토리, 캐시 정보, 컴파일 정보 및 필터 정보가 있다고 하였습니다.
한 문서에서 객체를 여러 번 생성할 때에는 처음 생성된 객체에서 지정한 캐시 정보, 컴파일 정보 및 필터 정보만 유효하며 두번째부터는 이 정보들을 무시합니다. 반면에 템플릿 파일 기본 디렉토리는 각 객체마다 독립적으로 지정할 수 있으며, 추가로 지정된 기본 디렉토리 정보는 기본 디렉토리 정보를 저장하고 있는 배열에 추가됩니다.
'phpsource > 템플릿' 카테고리의 다른 글
{후키템플릿}3.4.assign() (0) | 2006.09.20 |
---|---|
{후키템플릿}3.3.define() (0) | 2006.09.20 |
{후키템플릿}3.1.제공 함수 목록 (0) | 2006.09.20 |
{후키템플릿}2.4.템플릿 캐시 정보 (0) | 2006.09.20 |
{후키템플릿}2.3.템플릿 구조 정보 (0) | 2006.09.20 |