PHP / HTML输出:echo vs return,输出缓冲和语法突出显示挑战

时间:2013-02-28 01:23:08

标签: php syntax-highlighting eclipse-pdt output-buffering

我更喜欢在php标签之外编写html,因此eclipse可以使用正确的语法高亮显示html。连接方法更难编写而不突出显示(参见下面的两个示例)。

我道歉了。这些示例非常简单,因此应该很容易阅读。

我不喜欢这个,太多'引号'和$ o's,没有语法突出显示!:

<?php

display($something){
    $o = '';
    $o .= '<div>';
    $o .=     $something;
    $o .= '</div>';
    return $o;
}

// I want to be able to do this:    
echo display(display('something'));

这使函数有机会完成结束<tag>或甚至之后添加其他html。 以上示例在功能上是我想要做的,但由于这些原因('引号',$ o和语法高亮)我还没有创建这样的系统。

以下示例是我更喜欢编写html的方法,但我无法嵌套输出,因为它不会返回!

<?php

function display($something){ ?>
    <div>
        <?=$something?>
    </div>
<?php }

// I'd like to do this, but I can't  
display(display('this doesn't return anything to the first function call...'));

这是输出缓冲的来源,我会在一秒钟内回到那里......

我想象的是什么:

我希望能够使用func_get_args()来完成这样的事情(注意,这将适用于OOP对象,只是在这里保持简单):

<?php

some_panel( title_style_1('Sample Header'),
            panel_content(you_tube($vid_id)),
            small_img_frame($img_src) );

您基本上可以使用任何这些输出函数并以您喜欢的方式嵌套它们。就像你可以将任何<div>置于任何<p>内,反之亦然。唯一的问题是,你必须确保你关闭标签......在这种情况下,你可以在最后或儿童之间添加任何标记。

这是输出缓冲的来源

<?php

function display($something){ 
    ob_start(); // <---- Start buffer ?>
    <div>
        <?=$something?>
    </div>
<?php return ob_end_clean(); // <------ Return output
}

// Now I can do this!!!
echo display(display('this should work!'));

请鼓声......问题:

如果我每次请求可能会反复缓冲数百次甚至数千次,这是否会受到性能影响?我读过由于以下内容而警告输出缓冲的帖子:

可靠性:如果在其他地方启动了一个缓冲区,从我读到的内容来看,它听起来就像这些嵌套并且可能会发生冲突。

可维护性:如果启动了缓冲区,则必须保证它将被停止。

对于我的系统,如果在同一个函数调用中启动并停止输出缓冲,这些事情似乎没问题。这是可能1000个项目的过度迭代,每个项目都为我担心的单个<li>启动/停止输出缓冲。

此外,如果有人知道任何框架或更好的方法来做我想做的事情,任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:0)

如何通过...输出嵌套输出?

<?php
function foo($itemName) {
?>
    <div class="item">
        <?php bar($itemName); ?>
    </div>
<?php
}

function bar($itemName) {
?>
    <h1><?= $itemName ?></h1>

    <p>Hello, world!</p>
<?php
}
?>

但要回答其余问题:基准吧!输出缓冲通常不是问题,但它很可能是任何人的瓶颈。这取决于。

如果您发现自己经常做这类事情,请考虑将其分解为多个文件或使用模板系统。 或不是PHP。

答案 1 :(得分:0)

输出缓冲可能是一种清洗,它甚至可以提高性能。在浪费较少的I / O时节省了CPU浪费的缓冲。套接字写入实际上是成千上万的指令。它可能成为问题的唯一时间是输出量会对内存使用产生负面影响。如果你正在缓冲许多兆字节的输出,你可能需要研究某种形式的流媒体。

以下是关于此主题PHP output buffering - sounds like a bad idea, is it?

的较旧帖子