written: Jan 28 2002
last modified: Sep 20 2006
last modified: Sep 20 2006
템플릿 변수의 사용범위(scope)
템플릿 파일에 포함된 템플릿 변수는 그 사용범위가 모든 템플릿 파일에 미칩니다. 이로 인해 동일한 템플릿 변수가 서로 다른 템플릿 파일에 나타내려고 할 때는 주의해야겠지요.
예를 들어 아래와 같이 템플릿 파일 test1.htm, test2.htm이 아래와 같이 작성되었다고 하지요.
[code html;gutter:false]
<!-- test1.htm -->
<P>{VAR}</P>
<!-- test2.htm -->
<P>{VAR}</P>
[/code]
test1.htm의 {VAR}에는 '사과'라고 출력하려고 하며, test2.htm의 {VAR}에는 '바나나'라고 출력하려고 합니다.
이 때 이를 처리하기 위한 php 소스가 아래와 같다고 하지요.
[code php;gutter:false]
include_once('./class/template/class.hTemplate.php');
$tpl = new hTemplate();
$tpl->define(
array(
'test1' => 'test1.htm',
'test2' => 'test2.htm'
)
);
$tpl->assign(
array(
'VAR' => '사과',
'TEST1' => 'test1'
)
);
$tpl->assign(
array(
'VAR' => '바나나',
'TEST2' => 'test2'
)
);
$tpl->output(
array(
'TEST1',
'TEST2'
)
);
[/code]
이 스크립트를 실행하면 아래와 같이 출력되겠지요.
사과
바나나
바나나
그런데 만약 위의 php 소스에서 피치못할 이유로 인해 아래와 같이 assign으로 처리하는 순서를 바꾸어야 한다고 하지요.
[code php;gutter:false]
include_once('./class/template/class.hTemplate.php');
$tpl = new hTemplate();
$tpl->define(
array(
'test1' => 'test1.htm',
'test2' => 'test2.htm'
)
);
$tpl->assign(
array(
'VAR' => '사과'
)
);
.
.
.
$tpl->assign(
array(
'VAR' => '바나나'
)
);
$tpl->assign(
array(
'TEST1' => 'test1',
'TEST2' => 'test2'
)
);
$tpl->output(
array(
'TEST1',
'TEST2'
)
);[/code]
위 소스의 결과는 어떻게 될까요? 아래와 같이 우리가 원하지 않는 결과가 나타나게 되지요.
바나나
바나나
바나나
이것은 템플릿 'test1'과 'test2'를 어디서 처리하느냐에 따라 그 결과가 달라진다는 것이지요. 웹문서 구조가 단순하다면 문제를 해결하는 것이 그다지 복잡하지는 않겠지만 웹문서 구조가 조금만 복잡해 지면 템플릿 변수명을 구별하기가 쉽지는 않을 것입니다.
멤버 템플릿 변수
만약 클래스의 멤버변수처럼 현재 템플릿 파일에서만 유효한 템플릿 변수를 정의할 수 있다면 매우 유용할 것입니다. 그러면 여러개의 템플릿 파일이 존재하더라도 템플릿 변수명때문에 다른 템플릿 파일을 확인할 필요는 없겠지요.
객체지향언어에서 범위연산자 '::'를 이용하여 '클래스명::정적멤버변수'와 같이 특정 클래스에 정의된 정적멤버변수에 접근할 수 있듯이 '템플릿명::템플릿변수명'과 같이 특정 템플릿 파일 내에서 정의된 템플릿에 접근할 수 있습니다. 이와같이 특정 템플릿 파일 내에서 사용되는 템플릿 변수를 멤버 템플릿 변수라고 합니다.
현재 템플릿 파일 내에서 사용되는 템플릿 변수를 정의할 때는 아래와 같이 템플릿명없이 범위연산자(::)와 변수명으로 정의하여 줍니다.
[code php;gutter:false]
<!-- test1.htm -->
<P>{::VAR}</P>
<!-- test2.htm -->
<P>{::VAR}</P>[/code]
php 소스에서는 특정 템플릿의 멤버 템플릿 변수에 접근하기 위하여는 아래와 같이 범위연산자 앞에 템플릿명을 표시하여야 합니다.
[code php;gutter:false]
include_once('./class/template/class.hTemplate.php');
$tpl = new hTemplate();
$tpl->define(
array(
'test1' => 'test1.htm',
'test2' => 'test2.htm'
)
);
$tpl->assign(
array(
'test1::VAR' => '사과'
)
);
.
.
.
$tpl->assign(
array(
'test2::VAR' => '바나나'
)
);
$tpl->assign(
array(
'TEST1' => 'test1',
'TEST2' => 'test2'
)
);
$tpl->output(
array(
'TEST1',
'TEST2'
)
);
[/code]
assign() 함수에서 범위연산자 앞에 'test1'과 'test2'는 define함수에서 지정한 템플릿명을 의미합니다. 아래와 같이 멤버 템플릿 변수를 이용하면 'test1'과 'test2'를 처리하는 assign() 함수의 위치에 관계없이 우리가 원하는 결과를 얻을 수 있을 것입니다.
사과
바나나
바나나
멤버 템플릿 변수도 다른 템플릿 변수와 마찬가지로 아래와 같이 초기값 등을 지정할 수 있습니다.
{::변수명:범위:초기값} <<<--- 1.1.1 버전까지의 구문형식
{::변수명;범위;초기값} <<<--- 1.2.0 버전부터의 구문형식
{::변수명;범위;초기값} <<<--- 1.2.0 버전부터의 구문형식
'phpsource > 템플릿' 카테고리의 다른 글
{후키템플릿}7.3.논리 부정 연산자 (0) | 2006.09.20 |
---|---|
{후키템플릿}7.1.반복문 (0) | 2006.09.20 |
{후키템플릿}4.3.컴파일 환경 설정 (0) | 2006.09.20 |
{후키템플릿}4.2.캐시 환경 설정 (0) | 2006.09.20 |
{후키템플릿}3.6.FastPrint() (0) | 2006.09.20 |