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

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

мой php-источник:

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

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


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

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

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

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

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

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

У вас есть различные возможности для вывода 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.

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

 ob_start('ob_tidyhandler'); 

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

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

вместо эха.

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

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

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

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

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