Могу ли я переопределить встроенную функцию PHP echo()?

Недавно я посмотрел на свой исходный код, и это был настоящий беспорядок.

my php source:

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

и когда я просматриваю источник браузера для отображаемой страницы:

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

есть ли способ переопределить эхо, чтобы каждый вывод заканчивался символом новой строки, что-то вроде

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

Ответы

Ответ 1

echo - не функция, а инструкция языка. Он не может быть переопределен. Если вы хотите улучшить свою разметку вывода, посмотрите Tidy.


Что вы можете сделать, это использовать метод поиска/замены IDE и заменить все операторы echo на echo PHP_EOL,. Это приведет к добавлению конкретной строки ОС char (s) перед любым выходом. Обратите внимание на запятую после PHP_EOL, поскольку это важно.

Вы можете вывести несколько значений с помощью echo следующим образом:

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

поэтому нет необходимости писать echo в каждой строке.

Однако, я согласен с тем, кто предложил использовать более специализированный подход к раздельному контенту и макету, например. используя шаблонные представления или HereDoc.

В дополнение, очень мало выигрыша в том, что у вас довольно разметка. Если вы используете такие инструменты, как Firebug для проверки HTML, у вас будет правильно отформатированная разметка, независимо от беспорядка, который действительно имеет разметка. Более того, на сайтах с большим количеством посетителей вы часто обнаружите, что разметка была уменьшена, что противоположно тому, что вы пытаетесь сделать, просто потому, что все эти новые строки и вкладки добавляют к весу страницы, что приводит к более медленному загрузки страниц и увеличения стоимости трафика.

Ответ 2

У вас есть различные возможности для вывода HTML.

Вы можете использовать синтаксис heredoc:

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

Или (что лучше, на мой взгляд), отдельный HTML из PHP. Например. поместите всю логику PHP в верхнюю часть файла и HTML после блока PHP:

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

Переменные можно распечатать, как показано выше. Но эти переменные не содержат HTML.

Когда вам нужно вывести HTML на основе условия, вы можете использовать альтернативный синтаксис для управляющих операторов:

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

Таким образом, также проще отлаживать ваш HTML, поскольку это не только строка PHP.

Ответ 3

Вы можете настроить и вывести буфер, а затем запустить буфер через htmltidy. Уверенное расширение даже имеет конкретную функцию для этой цели. Просто позвоните, прежде чем вы начнете выводить свой html:

ob_start('ob_tidyhandler');

Ответ 4

Хотя это решение не отменяет эхо, вы можете получить что-то близкое к эху с новой линией. Добавить:

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

вместо эха.

Ответ 5

Вы можете косвенно перегрузить echo() с помощью __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!". с добавлением новой строки и возврата каретки в конце. Там способы дальнейшего инкапсулировать это, но они не входят в сферу моего ответа.

Edit:
Как было отмечено, вышеупомянутое решение является медленным/неуклюжим. Здесь более элегантное решение, использующее выходную буферизацию:

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

Это быстрее и чище (хотя технически он не отменяет "эхо" ).

Ответ 6

Другим решением будет отделить ваш код от ваших макетов, используя подходящий механизм шаблонов.