If you are coming from a background that is used to coding templates with Smarty, you will find the syntax is similar with UTL. 

Pros and Cons

Both Smarty and UTL are powerful template languages. Below are some of the pros and cons of each:


Language IndependentLarge Support Communtiy
Written in C - extremely fastCompiles to PHP (speed can be boosted via PHP Accelerator)
Crash Resistance (separated from host language)Well-Documented
Infinite Loop DetectionPage-Level Caching
More Secure (separated from host language)New hires may have previously used
Include External FilesInclude External Files
Filters with ChainingFilters with Chaining
JIT Module LoadingJIT Module Loading


Small Development Team (Closed Source)Easy target for security holes (most OSS)
Lacks internal caching mechanism (currently)Requires PHP (can't change to another language if desired)
Re-compiles template code each page load (currently)Must be patched to disable certain functions ({insert}, {php}, etc.)
Not many add-ons, no community currentlyAdd-ons are not guaranteed to scale nor are they certified in any way
Learning curve is above-averageLearning curve is above-average
 Special handling of Javascript and CSS required (conflicting delimiters)

Language Differences

Delimiters[% ... %]{ ... }
Comments[% /* ... */ %]{* ... *}
Variables[% some_string %]{$some_string}
Indexed Arrays[% some_array[4] %]{$some_array[4]}
Keyed Arrays using String[% some_array.key %]{$some_array.key}
Keyed Arrays using Variable[% some_array[key] %]{$some_array.$key}
Access Object Properties[% some_object.property %]{$some_object->property}
Calling Object Methods[% some_object.method %]{$some_object->method()}
Calling Functions[% some_function( 'param': some_string ) %]{some_function param=$some_string}
Including Files[% include 'some_file.inc' %]{include file="some_file.inc"}
Inline Assignment[% some_string = 'Hello World!' %]{assign var="some_string" value="Hello World!"}
Foreach Loop[% foreach some_array as item; item; end %]{foreach from=$some_array item=item} {$item} {/foreach}
If Statement[% if x == 1 %] x is 1 [% end %]{if $x == 1} x is 1 {/if}
Filters[% x | truncate(10, '...') %]{$x|truncate:10:...}