如何将2个函数包装成一个调用

时间:2017-04-22 22:04:43

标签: php wordpress function

好的,所以我正在使用高级自定义字段和一点点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个函数。有没有办法把它包装成一个电话?

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.

一个缺点:您无法使用此方法嵌套函数。