问题:
考虑到我有一系列混合的 HTML/PHP 代码,伪代码如下:
<html>
<section 1> ... </section 1>
<section 2> ... </section 2>
<section 3> ... </section 3>
</html>
请注意,部分只是 HTML/PHP 代码块,细节并不重要。
但是,出于对故事不重要的原因,我想先在第 3 节和第 2 节中呈现代码,然后在第 1 节中呈现代码。在传统的 PHP/HTML 中,我将通过使用匿名函数来实现:
<?php $buff = []; ?>
<?php $buff[] = function() { ?>
<html>
<?php }; ?>
<?php $buff[] = function() { ?>
<section 1> </section 1>
<?php }; ?>
<?php $buff[] = function() { ?>
<section 2> </section 2>
<?php }; ?>
<?php $buff[] = function() { ?>
<section 3> </section 3>
<?php }; ?>
<?php $buff[] = function() { ?>
</html>
<?php }; ?>
<?php
for ($i = count($buff)-1; $i >= 0; $i--) {
$buff[$i] = call_user_func($buff[$i]);
}
foreach($buff as $b) echo $b;
?>
所以你明白了,我会通过匿名函数控制渲染的顺序。请注意,所有部分都取决于前一部分的执行结果。
为了实现所述 -> 想法是使用 Twig 的 Node 访问者。当然,这些匿名函数会引用 $context 和 $blocks 变量:
function () use ($context, $blocks) {
...
}
这是相当双重的,现在,问题是:有没有更好的方法,是否有一些我遗漏的潜在危险?
注意
<?php
for ($i = 0; $i < count($buff); $i++) {
$buff[$i] = call_user_func($buff[$i]);
}
foreach($buff as $b) echo $b;
?>
应该产生与代码执行顺序相同的结果,即我们没有修改模板。
现在,仅当在模板上检测到特定标签时才会使用此功能,并且重新排序执行的目的是确保即使此标签位于模板顶部 -> 最后执行但显示在顶部。
没有其他解决方法 -> 它必须是这样,最后执行,显示在顶部。
谢谢