我可以覆盖PHP内置函数echo()吗?

时间:2010-02-02 08:38:35

标签: php

我最近查看了我的源代码,这真是一团糟。

我的php来源:

echo '<h1>Rar<h1>';
echo '<span>Rar</span>';
echo '<p>Rar</p>';

当我查看呈现页面的浏览器源时:

<h1>Rar</h1><span>Rar</span><p>Rar</p>

有没有办法让我覆盖echo,这样每个输出都会以换行符结束,比如

function echo($string)
{
 echo $string . "\r\n";
}

6 个答案:

答案 0 :(得分:10)

echo不是函数,而是语言语句。它无法重新定义。如果您希望美化输出标记,请查看Tidy


> 这将在任何输出之前附加操作系统特定的换行符。请注意PHP_EOL之后的逗号,因为它很重要。

您可以使用echo输出多个值:

echo

因此无需在每一行上写echo PHP_EOL,

但是,我同意任何建议使用更专用的方法来分隔内容和布局的人,例如使用模板视图或HereDoc。

另外,拥有漂亮的标记几乎没有收获。如果您使用Firebug之类的工具来检查HTML,那么无论标记确实是多么混乱,您都将拥有格式正确的标记。此外,在拥有大量访问者的网站上,您经常会发现标记缩小,这与您尝试执行的操作相反,只是因为所有这些换行符和标签都会增加页面的重量,从而导致速度变慢页面加载和流量成本增加。

答案 1 :(得分:3)

您可以输出各种HTML。

您可以使用heredoc语法:

$html = <<<EOF
<h1>Rar<h1>
<span>Rar</span>
<p>Rar</p>
EOF
echo $hml;

或者(我认为哪种方式更好),将PHP与PHP分开。例如。将所有PHP逻辑放在文件的顶部,并在PHP块之后放置HTML:

<?php
   // all your PHP goes here
   $foo = 'bar'
?>
<!-- HTML comes here -->
<html>
  <body>
    <div>Hello <?php echo $foo; ?> </div>
  </body>
</html>

可以如上所示打印变量。但是这些变量包含HTML。

如果必须根据条件输出HTML,可以使用alternative syntax for control statements

<?php if($some_condition): ?>
    <h1>Rar<h1>
    <span>Rar</span>
    <p>Rar</p>
<?php endif ?>

这样,调试HTML也更容易,因为它不仅仅是一个PHP字符串。

答案 2 :(得分:2)

您可以设置并输出缓冲区,然后通过htmltidy运行缓冲区。整洁的扩展甚至有a specific function用于此目的。只需在开始输出html之前调用它:

ob_start('ob_tidyhandler');

答案 3 :(得分:1)

虽然此解决方案不会覆盖echo,但您可以使用换行符接近echo。添加:

function e() {
    return o::singleton();
}

class o {
    private static $instance;

    public static function singleton()
    {
        if (!isset(self::$instance)) {
            $className = __CLASS__;
            self::$instance = new $className;
        }
        return self::$instance;
    }

    public function __set($prop, $txt) {
        echo $txt . PHP_EOL;
    }
}

到您的文件,然后您可以使用:

e()->o = "Line which ends in newline";

而不是回声。

答案 4 :(得分:0)

您可以使用echo() magic method来间接超载__toString(),如下所示:

<?php
class CleanOutput
{
    public $content;

    public function __construct($c) {
        $this->content= $c;
    }

    public function __toString() {
        return $this->content . '\r\n';
    }
}

$text= new CleanOutput('Hello world!');
echo $text;
?>

上面会输出“Hello world!”最后附加换行符和回车符。有进一步封装的方法,但它们超出了我的答案范围。

修改
如上所述,上述解决方案缓慢/笨拙。这是使用output buffering

的更优雅的解决方案
<?
function clean_up($foo) {
   return $foo . '\r\n';
}
ob_start('clean_up');
ob_implicit_flush(true);
echo "Hello world!";
?>

这更快更干净(虽然它在技术上不会“覆盖”回声)。

答案 5 :(得分:0)

另一种解决方案是使用适当的模板引擎将代码与布局分开。