【问题标题】:PHP/HTML output: echo vs return, output buffering, and syntax highlighting challengesPHP/HTML 输出:回显与返回、输出缓冲和语法高亮挑战
【发布时间】:2013-02-28 01:23:08
【问题描述】:

我更喜欢在 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'));

这使函数有机会完成关闭 &lt;tag&gt; 甚至在之后添加额外的 html。 上面的例子在功能上是我想要做的,但是由于这些原因('引号'、$o's 和语法突出显示)我还没有创建这样的系统。

下面的例子是我比较喜欢的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) );

您基本上可以采用任何这些输出函数并以您喜欢的任何方式嵌套它们。就像您可以将任何&lt;div&gt; 放在任何&lt;p&gt; 中一样,反之亦然。唯一的问题是,您必须确保关闭标签...而且,在这种情况下,您可以在末尾或子项之间添加 any 标记。

这就是输出缓冲的用武之地

<?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 项项目的过度迭代,我担心的是单个 &lt;li&gt;

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

【问题讨论】:

  • 对不起,我真的无法回答。但是如果你做这样的事情,你有没有想过使用 smarty 或 twig?我喜欢你在那里的力量。如果你愿意,你仍然可以被“视图”驱动。
  • 我不熟悉这些带来了什么。我最初的印象(不久前)是它们不是必需的,或者并没有太大帮助。不过我会调查一下,谢谢!
  • 我建议使用树枝,但这只是一种意见。你可以在那里。并在任何部分生成和注入代码。你也可以有你准备的内容的“块”追加填充等。我真的很喜欢它。
  • 我同意 Twig 的建议,我使用 Symfony2,它使用 Twig 作为其默认模板语言,非常好。

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


【解决方案1】:

通过…输出嵌套输出怎么样?

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

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

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

但要回答剩下的问题:基准测试!输出缓冲通常不是问题,但它很可能成为任何人的瓶颈。视情况而定。

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

【讨论】:

  • 随着输出复杂性的增加,我需要能够通过 foo() 将一堆参数传递给任意数量的子输出函数。这会很棘手,我希望能够从顶层“配置”这个输出(与 foo() 的范围相同)......如果这是有道理的。 :-\
  • @MikeLewis:传递一个数组,也许吧? (PHP 的数组也是写时复制。)
【解决方案2】:

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

这是关于此主题的较早帖子PHP output buffering - sounds like a bad idea, is it?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多