开发者

Can I override the PHP built-in function echo()?

开发者 https://www.devze.com 2022-12-18 14:57 出处:网络
I recently looked at my source code and it was a real mess. my php source: ech开发者_运维技巧o \'<h1>Rar<h1>\';

I recently looked at my source code and it was a real mess.

my php source:

ech开发者_运维技巧o '<h1>Rar<h1>';
echo '<span>Rar</span>';
echo '<p>Rar</p>';

and when I view the browser source for the page rendered:

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

is there a way for me to override echo so that every output would end with a newline, something like

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


echo is not a function, but a language statement. It cannot be redefined. If you are looking to prettify your output markup, have look at Tidy.


What you could do, is use your IDE's search/replace method and replace all echo statements with echo PHP_EOL,. This would append the OS specific newline char(s) before any output. Note the comma after PHP_EOL as it is important.

You can output several values with echo like this:

echo 'one', $foo, PHP_EOL,
     'two', $bar, PHP_EOL;

so there is no need to write echo on each line.

However, I agree with anyone who suggested using a more dedicated approach to separate content and layout e.g. using template views or HereDoc.

In additon, there is very little gain in having pretty markup. If you are using tools like Firebug to inspect the HTML, you will have properly formatted markup regardless of the mess the markup really is. Moreover, on sites with a lot of visitors, you'll often find the markup minified, which is the opposite of what you are trying to do, simply because all these newlines and tabs add to the weight of the page, which leads to slower page loads and increased traffic cost.


You have various possibilities to output HTML.

You can use the heredoc syntax:

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

Or (what is way better in my opinion), separate HTML from PHP. E.g. put all the PHP logic in the top of the file and the HTML after the PHP block:

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

Variables can be printed as shown above. But these variables don't contain HTML.

When you have to output HTML based on a condition, you can use the alternative syntax for control statements:

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

This way it is also easier to debug your HTML as it is not only a PHP string.


You can set up and output buffer and then run the buffer through htmltidy. The tidy extension even has a specific function for the purpose. Just call this before you start outputting your html:

ob_start('ob_tidyhandler');


Although this solution does not override echo, you can get something close to echo with a newline. Add:

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;
    }
}

to your file, and then you can use:

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

instead of echo.


Another solution would be to separate your code from your layouts by using a proper templating engine.


You can indirectly overload echo() by using the __toString() magic method like so:

<?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;
?>

The above would output "Hello world!" with a newline and carriage return appended at the end. There's ways to further encapsulate this, but they are outside the scope of my answer.

Edit:
As was noted, the above solution is slow/clumsy. Here's a more elegant solution using output buffering:

<?
function clean_up($foo) {
   return $foo . '\r\n';
}
ob_start('clean_up');
ob_implicit_flush(true);
echo "Hello world!";
?>

This is faster and cleaner (although it technically doesn't 'override' echo).

0

精彩评论

暂无评论...
验证码 换一张
取 消