PHP/HTML输出:echo vs return、输出缓冲和语法高亮挑战


PHP/HTML output: echo vs return, output buffering, and syntax highlighting challenges

我更喜欢在php标记之外编写html,这样eclipse就可以用适当的语法高亮显示html。串联方法更难编写,也不会高亮显示(参见下面的两个示例)。

很抱歉这么长。

我不喜欢这个,太多'引号'和' $o',没有语法高亮!:

<?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!'));

还有,请打鼓....一个问题:

如果我对每个请求重复缓存数百甚至数千次,这会影响性能吗?我读过一些关于警告输出缓冲的帖子,因为:

可靠性:如果在其他地方启动了一个缓冲区,从我读到的,听起来像这些嵌套,可能会有潜在的冲突。

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

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

另外,如果有人知道任何框架或更好的方法来做我正在尝试做的事情,任何建议将不胜感激!

如何通过…output嵌套输出?

<?php
function foo($itemName) {
?>
    <div class="item">
        <?php bar($itemName); ?>
    </div>
<?php
}
function bar($itemName) {
?>
    <h1><?= $itemName ?></h1>
    <p>Hello, world!</p>
<?php
}
?>

但是要回答剩下的问题:基准测试!输出缓冲通常不是问题,但它很可能成为任何人的瓶颈。这取决于.

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

输出缓冲可能是一种浪费,它甚至可以提高性能。减少I/O可以节省CPU浪费的缓冲。套接字写操作实际上包含数千条指令。只有当输出量会对内存使用产生不利影响时,它才会成为问题。如果您要缓冲许多兆字节的输出,则可能需要研究某种形式的流。

这是一个关于PHP输出缓冲的旧帖子-听起来像一个坏主意,是吗?