好的,所以我正在使用高级自定义字段和一点点PHP来处理Wordpress项目(PHP)。我创建了两个函数,它们将围绕某些文本创建一个容器div:
<section>
<?php container_start(); ?>
Text goes here
<?php container_end(); ?>
</section>
这将生成以下代码:
<section>
<div class="container">
Text goes here
</div>
</section>
这很棒,因为它按预期工作。幕后的是这两个功能:
function container_start() {
$container = get_sub_field('container');
if ($container):
echo '<div class="container">';
endif;
}
function container_end() {
$container = get_sub_field('container');
if ($container):
echo '</div>';
endif;
}
问题是:有没有办法优化如何实现?我发现只需添加然后关闭div就可以调用2个函数。有没有办法把它包装成一个电话?
答案 0 :(得分:0)
嗯,你仍然需要使用两个功能,但也许你可以这样做:
function container_start() {
ob_start();
}
function container_end() {
$container = get_sub_field('container');
if ($container)
echo '<div class="container">';
echo ob_get_contents();
ob_end_clean();
if ($container)
echo '</div>';
}
那会怎么做: 当你调用container_start时,ob_start会告诉php保留所有打印的内容
然后,当你调用container_end时,你做容器的事情,然后你调用ob_get_contents,它返回php保存的所有内容(并且你回应它)和ob_end_clean,它告诉php停止保存所有打印的内容
这样,你仍然有两个函数,但get_sub_field('container')只会被调用一次
答案 1 :(得分:0)
当前设置的一个优点是标签是平衡的:有一个打开的“标签”和一个匹配的关闭“标签”。虽然这确实要求您管理标签的平衡,但我认为这比替代方案更清晰,并且与您在HTML中的工作方式相匹配。您在此基础上添加的任何额外魔法(如跟踪某些标记堆栈并具有通用end()
功能)会增加复杂性并可能影响可读性。 WordPress不会在PHP之上使用模板语言,所以你不会比现有的好得多。
也就是说,一个避免结束标记的选项是将多行字符串传递给您的函数。我对这种方法并不陌生,但它是可用的,可能是其他方法的起点。
<?php
$var = 'foo';
function wrapper_function($inner) {
echo '<div class="container">';
echo $inner;
echo '</div>';
}
?>
Something before.
<?php wrapper_function(<<<EOF
This text goes inside. I can put <html> in here, plus
any $var since I'm using HEREDOC rather than NOWDOC.
http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
EOF
); ?>
Something after.
输出:
Something before.
<div class="container"> This text goes inside. I can put <html> in here, plus
any foo since I'm using HEREDOC rather than NOWDOC.
http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc</div>
Something after.
一个缺点:您无法使用此方法嵌套函数。