superruzafa / template
递归模板引擎
1.0.0
2014-11-12 21:11 UTC
Requires
- php: >=5.3
Requires (Dev)
- phpunit/phpunit: ~4.3
This package is not auto-updated.
Last update: 2024-09-24 01:00:33 UTC
README
这是一个递归模板引擎。
StringTemplate
最基本的模板是字符串模板。它将包含 {{ 变量 }}
的字符串替换为传递的替换值。
$replacements = array( 'variable' => 'replacement' ); $string = 'this string contains a {{ variable }}'; $template = new StringTemplate($string); echo $template->render($replacements); // 'this string contains a replacement'
ArrayTemplate
数组模板以与 StringTemplate
相同的方式渲染其值。
$replacements = array( 'vehicle' => 'car', 'color' => 'dark gray' ); $array = array( 'My {{ vehicle }} color is {{ color }}', 'Because {{ color }} is my favourite color', 'I also likes the {{ alternative-color }} color' ); $template = new ArrayTemplate($array); var_dump($template->render($replacements)); // array( // 'My car color is dark gray', // 'Because dark gray is my favourite color', // 'I also likes the color' // );
数组自渲染
非常简单,对吧?数组模板可以通过将其自身用作替换提供者来自渲染!
$array = array( 'vehicle' => 'bicycle', 'color' => 'blue', 'phrase' => 'My {{ vehicle }} color is {{ color }}', ); $template = new ArrayTemplate($array); var_dump($template->render()); // array( // 'vehicle' => 'bicycle', // 'color' => 'blue', // 'phrase' => 'My bicycle color is blue', // )
替换可以包括其他子替换
$array = array( 'title' => '{{ name }} {{ job }}', 'name' => '{{ firstName }} {{ surName }}', 'firstName' => 'Philip {{ middleName }}', 'middleName' => 'J.', 'surName' => 'Fry', 'job' => 'Slacker delivery boy' ); $template = new ArrayTemplate($array); var_dump($template->render()); // array( // 'title' => 'Philip J. Fry, Slacker delivery boy', // 'name' => 'Philip J. Fry', // 'firstName' => 'Philip J.', // 'middleName' => 'J.', // 'surName' => 'Fry' // );
循环引用
循环引用将被检测,替换为空字符串,并通过警告通知。
$love_triangle = array( 'me' => 'I like {{ you }}', 'you' => 'You like {{ she }}', 'she' => 'She likes {{ me }}' ); $template = new ArrayTemplate($love_triangle); var_dump($template->render()); // Warning: Cyclic recursion: you -> she -> me -> you in ... // Warning: Cyclic recursion: she -> me -> you -> she in ... // Warning: Cyclic recursion: me -> you -> she -> me in ... // array( // 'me' => 'I like You like She likes I like ', // 'you' => 'You like She likes I like You like ', // 'she' => 'She likes I like You like She likes ' // )
奇怪吧?该引擎在栈中存储正在被替换的变量。当找到这些变量的值正在被渲染时,就会检测到循环递归。例如,为了解决 "me" 条目,该引擎遵循以下步骤:
1) me = 'I like {{ you }}' <- Replace {{ you }} by 'You like {{ she }}'
2) me = 'I like You like {{ she }}' <- Replace {{ she }} by 'She likes {{ me }}'
3) me = 'I like You like She likes {{ me }}' <- Cyclic recursion detected, *me* is already being resolved