使用原生php作为平滑内联模板引擎的技术 目标:在完全相同的文件中重构复杂难看代码的最佳系统。

使用原生php作为平滑内联模板引擎的技术 目标:在完全相同的文件中重构复杂难看代码的最佳系统。,php,templates,coding-style,Php,Templates,Coding Style,我目前正在重构别人的坏代码。代码是混合的,程序化的php,我希望能够在脚本中创建模板。我不希望必须创建一个不同类型的外部文件来运行模板,我希望能够将脚本中发生的可怕的东西转换成脚本中的模板,然后在可怕的东西曾经出现的地方调用该模板。并且仍然能够看到模板在同一文件中输出的内容 我最近重新发现了php的替代语法,以简化本机模板() 范例系统 是否有其他技术可以真正简化使用本机php模板的模板过程?我通常更喜欢另一个模板引擎,因为它使php回显比使用php语法稍微简单,但特别是在重构其他人的代码时,有

我目前正在重构别人的坏代码。代码是混合的,程序化的php,我希望能够在脚本中创建模板。我不希望必须创建一个不同类型的外部文件来运行模板,我希望能够将脚本中发生的可怕的东西转换成脚本中的模板,然后在可怕的东西曾经出现的地方调用该模板。并且仍然能够看到模板在同一文件中输出的内容

我最近重新发现了php的替代语法,以简化本机模板()

范例系统 是否有其他技术可以真正简化使用本机php模板的模板过程?我通常更喜欢另一个模板引擎,因为它使php回显比使用php语法稍微简单,但特别是在重构其他人的代码时,有时模板引擎会带来大量开销,并强加许多规则,例如将模板放在一些“模板”文件夹中,与正在重构的脚本分开,这使得重构时很难放置

具体地说,我正试图着手一个项目,创建一个依赖于本机php的“模板”系统,其中的模板可以内联到源php脚本中。我这样做的原因是,我发现,至少在最初阶段,必须来回地从模板切换到调用脚本,这使得处理起来稍微困难一些,而且由于我正在重构非常复杂和难看的代码,我希望能够尽可能容易地看到正在发生的一切。所以我想做一些类似的事情

// Inclusion of the template library
require_once('lib_template.php');
// Initialization Logic
...lots of ugly non-display code and data-obtaining code here

// Decide what will be able to be output and put it into an array to pass to the template
$template_output_variables = array('name'=>'no name');

// Define the template function here, has html and such in native php here.
$contact_us = function page_contact_us($template_output_variables=null){
// Leave php in the template function.
?>
<body> Hello World
</body>

<?php
}

// call & display the template via delayed execution, display it within a pre-set head and footer.
display_page($template=$contact_us, $template_output_stuff=$template_output_variables, $options=array('title'=>'Contact Us'));
//包含模板库
需要一次_('lib_template.php');
//初始化逻辑
…这里有很多丑陋的非显示代码和数据获取代码
//确定能够输出的内容,并将其放入数组中以传递给模板
$template_output_variables=array('name'=>'no name');
//在这里定义模板函数,在本地php中有html等。
$contact\u us=函数页\u contact\u us($template\u output\u variables=null){
//将php保留在模板函数中。
?>
你好,世界

当缺少模板引擎时,输出缓冲是一个方便的工具

ob_start(); //start the buffer

echo "some stuff";
include ('sometemplatefile.php');
//etc etc

$body=ob_get_contents(); //get the junk out of the buffer
ob_end_clean(); //clear the buffer

//do search and replace on contents... 
//etc

include ('header.php');
echo $body;
include ('footer.php');
也许像heredoc语法这样的东西就是你想要的:

此外,如果您启用了短打开标记,这也会很方便:

Some HTML: 
<?=$data?> 
This is a shortcut for 
<? echo $data;?>
一些HTML:
这是一条捷径

我认为这在未来的版本中可能会被弃用(我似乎记得在什么地方读过)

'While'、'for'、'foreach'和'if'都有替代的控制结构,以使它们更友好地使用模板。真的,尽管用大括号括起来并不难

<?php } ?>


我知道这不能回答你的问题,但是有这么多好的诱人的引擎可供选择,我看不出有任何理由创建自己的引擎。开销真的很少。

你的问题对我来说太模糊了。
你想得到什么答案?关于什么问题?我不知道你要解决什么问题

所以,我只能对你的一些说法发表评论

另一个模板引擎使html/css更简单

这不是真的

我真的很想看看是否有人用php开发了一个非面向对象的模板系统,所以我可以用它来指导我自己的写作

我就是这样一个人。
但不幸的是,我不同意这种说法:

必须来回地从模板切换到调用脚本,这使得处理起来有点困难

我为每个页面使用单独的模板和一个主模板。
所以,在脚本的末尾,我只需要分配页面模板文件名并调用主模板

$page = 'news.tpl.php';
include 'main.tpl.php';
然后主模板将分别包含$page


无论如何,我认为你目前的方法没有什么大问题。只是在你的“内联”模板之前和之后包括通常的页眉和页脚。这就是全部

无lol。可能只是EOF,但不是真的它取决于你的“cleaner”版本是。您到底在寻找什么?如果您想要更像smarty的东西,请使用smarty。短打开标记将在将来某个时间删除。但是,“短打开回音”
将成为5的语言的一部分。4@KingCrunch太棒了!你知道你获取这些信息的网站吗?因为如果是这样的话,我会立即将所有内容切换到short open echo。这会让事情变得更干净。讨论:官方RFC:最后但并非最不重要的一点是提交:(值得一提的是:php5.4待办事项清单)啊,虽然短标签的问题很明显,因为它们可以接通和关断,如果它们消失了,你就可以向世界发出你的源代码了。这是令人信服的。不过,感谢StuttAGS信息,当然,我要考虑一些东西。@ T查尔瓦克没有。那就接受这个答案吧?呵呵,对了,那就是A。我现在把问题与现有模板引擎联系在一起的替代语法是:你必须在不同的位置创建模板,而在两个文件之间切换是我想要避免的事情。我正在重构非常混杂的东西,我希望能够在与源文件相同的文件中创建模板,multiple在某些情况下,这是一个合理的借口:)抱歉,这很难,让我澄清一下:我希望能够在不创建文件的情况下创建模板,因为它们可能是用于重构的非常临时的模板。最终,整个脚本可能是一个模板,但首先,只有部分是,但我希望能够在两者之间平滑过渡。一种方法是我可以要做到这一点,需要在原始文件中创建模板,并在该文件中调用它们。Eventuall