II. EFFICIENT (1)
5.  표현식
++ -- ?: , >>> 할당연산자 예약어연산자 등을 제외한 연산자를 사용하여 자바스크립트 문법을 따르는 표현식을 자유롭게 작성할 수 있습니다.
{ forum.listnum % 2 }
{ (some.var + 3) * test }
7.  이스케이프
명령어 설명
\ 템플릿코드를 그대로 출력.
템플릿코드의 형식이 올바르지 않을 경우 이스케이프명령어가 없어도 그대로 출력합니다.
예제 
index.tpl >>output  
{\@ abc} {@ abc}  
{ 2 + 2 } 4  
{\ 2 + 2 } { 2 + 2 }  
{\\ 2 + 2 } {\ 2 + 2 }  
{ 2 + (2 } { 2 + (2 } 형식이 바르지 않은 경우
{\ 2 + (2 } {\ 2 + (2 }  
{ orange + 2 } 와 같은 무의미한 자바스크립트블럭을 제외하면, 템플릿코드는 이스케이프하지 않아도 스타일시트나 자바스크립트와 충돌하지 않습니다.
8.  루프(2) - 예약변수
 index_ size_
예약변수 설명
index_ 0 부터 시작, 루프가 반복할 때 1 씩 증가
size_ 루프의 전체 반복 회수
index.php
<?php
...
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$result = mysql_query('select title from song');
$loop = array();
while ($data = mysql_fetch_assoc($result)) $loop[] = $data;
$tpl->assign('list',  $loop);
$tpl->assign('start', 10);
$tpl->print_('index');
?>
index.tpl
<div>num of list: { list.size_ }</div>
<!--{@ list}-->
<div>{ list.index_ + start }th. { list.title }</div>
<!--{/}-->
>>output
<div>num of list: 3</div>
<div>10th. I Wish..</div>
<div>11th. Love Revolution 21</div>
<div>12th. The Peace</div>
size_ 는 해당루프 밖에서도 사용할 수 있습니다. 해당루프 밖에서 사용할 때는 {.size_} 처럼 루프아이디를 생략할 수는 없습니다.
 key_ value_
예약변수 설명
key_ 루프로 할당된 배열의 키
value_ 루프로 할당된 배열의 값
index.php
<?php
include 'Template_.class.php';
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$loop = array('apple'=>'red', 'banana'=>'yellow', 30 =>'unknown');
$tpl->assign('fruit', $loop);
$tpl->print_('index');
?>
index.tpl
<!--{@ fruit}-->
<div>{fruit.index_} - {fruit.key_} - {fruit.value_}</div>
<!--{/}-->

<div>num of fruit: {fruit.size_}</div>
>>output
<div>0 - apple - red</div>
<div>1 - banana - yellow</div>
<div>2 - 30 - unknown</div>

<div>num of list: 3</div>
9.  분기(1) - if
명령어 의미 사용법
? if {? expression }
: elseif, else (옵션) {: expression }, {:}
/ endif {/}
문맥에 의해, ':' 은 분기의 else if, else 또는 루프의 else 로, '/' 은 루프나 분기의 종결문으로 해석됩니다.
분기 예제 
index.php
<?php
include 'Template_.class.php';
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$tpl->assign('fruit', 'banana');
$tpl->print_('index');
?>
index.tpl
<!--{? fruit=='apple' || person=='santa' }-->
<div> red </div>
<!--{: fruit=='banana' }-->
<div> yellow </div>
<!--{: fruit=='orange' }-->
<div> orange </div>
<!--{:}-->
<div> unknown </div>
<!--{/}-->
>> output
<div> yellow </div>
루프-분기 중첩 예제 
index.php
<?php
include 'Template_.class.php'
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$page_loop = array(
    1=>'page1.php',
    2=>'page2.php',
    3=>'page3.php',
);
$tpl->assign(array(
    'current'=>2,
    'page'   =>$page_loop,
));
$tpl->print_('index');
?>
index.tpl
<!--{@ page}-->
    <!--{? page.key_ == current }-->
        [ { page.key_ } ]
    <!--{:}-->
        <a href='{ page.value_ }'>[ { page.key_ } ]</a>
    <!--{/}-->
<!--{:}-->
    -- no page --
<!--{/}-->
>>output
        <a href='page1.php'>[ 1 ]</a>
        [ 2 ]
        <a href='page3.php'>[ 3 ]</a>
분기와 분기, 분기와 루프 역시 자유롭게 중첩하여 사용할 수 있습니다.
10.  배열
배열요소를 하나하나 할당하지 않고 배열자체를 하나의 템플릿 변수로 할당할 수 있습니다. 인덱스배열, 연관배열, 다중배열 모두 가능합니다.
배열 할당 예제 
index.php
<?php
include 'Template_.class.php'
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$user = array(
    'name'=>'julia',
    'hobby'=>array('swimming', 'singing'),
);
$tpl->assign('user', $user);
$tpl->print_('index');
?>
index.tpl
<div>{user.name} {user.hobby[0]} {user.hobby[1]}</div>
>>output
<div>julia swimming singing</div>
자바스크립트와 마찬가지로 {user.name}{user["name"]}, {user['name']} 은 모두 같으며, {user[name]} 처럼 따옴표가 없을 때의 name 은 템플릿 변수이고, 인덱스 배열의 경우, [] 를 사용하는 {style[23]} 의 형식만 가능합니다.
배열요소를 템플릿 표현식의 일부로 사용할 수 있으며, 배열을 루프변수로 할당할 수도 있습니다.
루프-배열 할당 
index.php
<?php
...
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$result = mysql_query('select num, name, date from table');
$loop = array();
while ($data = mysql_fetch_array($result)) $loop[]['data'] = $data;
$tpl->assign(array(
    'start'=>5,
    'list' =>$loop,
));
$tpl->print_('index');
?>
index.tpl
<!--{@ list}-->
<div>{list.data.num + start}. {list.data.name} ({.data.date})</div>

<!--{/}-->
>>output
<div>6. Julia (1993-05-06)</div>
<div>7. Maria (2002-02-22)</div>
<div>8. Mickey (2003-03-01)</div>
루프변수가 배열일 때도 {.data.num} 과 같이 루프아이디를 생략할 수 있습니다.
11.  템플릿변수 할당생략
템플릿 변수명이 언더바 '_' 로 시작하면 실행파일내 전역변수의 값을 가지며 이 때는 assign() 하지 않습니다.
전역변수 할당생략 
index.php
<?php
include 'Template_.class.php';
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$apple = 'global apple';
$melon = array('red'=>5, 'green'=>10);
$tpl->assign(array(
    '_apple' =>'this assignment has not effect.',
    'apple'  =>'apple by assignment',
    '_orange'=>'no effect',
    'orange' =>'orange by assignment',
));
$tpl->print_('index');
?>
index.tpl
<div>{_apple}</div>
<div>{apple}</div>
<div>{_melon.red + _melon.green + 100}</div>
<div>{_orange}</div>
>>output
<div>global apple</div>
<div>apple by assignment</div>
<div>115</div>
<div></div>
언더바 '_' 로 시작하는 템플릿 변수는 이 용도로만 사용되며, 배열의 키 또는 루프에 종속된 변수에는 이 규칙이 적용되지 않습니다.
또한 루프아이디의 첫글자로 언더바를 사용할 경우, 전역변수라면 할당을 생략할 수 있습니다.
index.php
<?php
include 'Template_.class.php';
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$num = array(1, 2, 3);               // $num = range(1, 3);
$tpl->print_('index');
?>
index.tpl
<!--{@ _num}-->
<div> { _num.index_ } - { _num.key_ } - { .value_ } </div>

<!--{/}-->
>>output
<div> 0 - 0 - 1 </div>
<div> 1 - 1 - 2 </div>
<div> 2 - 2 - 3 </div>
중첩루프의 경우, 안쪽 루프는 바깥쪽 루프의 배열요소이므로, 가장 바깥쪽 루프 아이디에만 이 규칙이 적용됩니다.
PHP의 자동전역(auto global)변수인 $_SERVER , $_ENV , $_COOKIE , $_GET , $_POST , $_FILES , $_REQUEST , $_SESSION 등도 assign() 에 의한 할당없이 사용할 수 있습니다.
자동전역변수 할당생략 
index.php?abc=2
<?php
include 'Template_.class.php';
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$tpl->assign('number', 2);
$tpl->print_('index');
?>
index.tpl
<div>{ _SERVER.PHP_SELF }</div>       // same as { _SERVER["PHP_SELF"] }
<div>{? !_COOKIE}Greetings{/}</div>
<div>{ _GET.abc + number }</div>
>>output
<div>/tutorial2/index.php</div>
<div>Greetings</div>
<div>4</div>
이 기능을 사용하면 assign() 하지 않은 만큼 코딩을 절약할 수 있고 성능상의 이득이 다소 있으나, 모듈화를 고려하여 적절히 사용하시기 바랍니다.
 
Since 2003-03-03 hosted on vultr.com