Подтвердить что ты не робот

PHP - эхо или не эхо?

Что более эффективно и/или что лучше, чтобы эхо HTML или иметь много открытых и закрытых тегов php?

Очевидно, что для больших областей HTML разумно открывать и закрывать теги php. Как насчет того, чтобы иметь дело с чем-то вроде генерации XML? Следует ли открывать и закрывать теги php одним эхом для каждой части данных или использовать одно эхо с тегами XML, включенными в цитаты?

4b9b3361

Ответ 1

С точки зрения обслуживания, нужно иметь HTML/XML как отдельный от кода, насколько это возможно, IMO, так что незначительные изменения могут быть сделаны легко даже нетехническим человеком.

Чем более однородным является блок разметки, тем чище работа.

Один из способов добиться этого - подготовить как можно больше к переменным и использовать синтаксис heredoc:

// Preparation

$var1 = get_value("yxyz");
$var2 = get_url ("abc");
$var3 = ($count = 0 ? "Count is zero" : "Count is not zero");
$var4 = htmlentities(get_value("def"));

// Output  

echo <<<EOT

 <fieldset title="$var4">
   <ul class="$var1">
     <li>
       $var2
     </li>
   </ul>
  </fieldset>

EOT;

Конечно, вы захотите использовать более разумные имена переменных.

Изменить: Ссылка, отмеченная @stesch в комментариях, дает некоторые хорошие аргументы в пользу использования serializer при создании XML и, кроме того, даже HTML, вместо распечатывая его, как показано выше. Я не думаю, что сериализатор необходим в каждой ситуации, особенно с точки зрения обслуживания, где шаблоны гораздо проще редактировать, но ссылка хорошо стоит прочитать. HOWTO Избегайте быть названным Bozo при создании XML

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

Ответ 2

PHP решает эту проблему так называемым heredocs. Проверьте это.

Пример:

  echo <<<EOD
  <td class="itemname">{$k}s</td>
  <td class="price">{$v}/kg</td>
EOD;

Примечание. Идентификатор heredoc (EOD в этом примере) не должен содержать пробелов или отступов.

Ответ 3

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

Но эхо большой строки трудно читать, а больше <?php echo $this->that; ?> рассказывать историю:)

Ответ 4

echo отправляет свой аргумент дальше по цепочке обработки запроса, и, в конце концов, эта строка отправляется клиенту через скачок сетевого сокета. В зависимости от того, как echo работает в сочетании с базовыми слоями программного обеспечения (например, веб-сервер), иногда ваш script может работать быстрее, чем может передавать данные клиенту. Без буферизации вывода, то есть. С буферизацией вывода вы торгуете памятью, чтобы получить скорость - вы echo быстрее, потому что они накапливаются в буфере памяти. Но только при отсутствии буферизации неявной. Нужно проверить исходный код Apache, чтобы посмотреть, как он обрабатывает данные PHP stdout.

Тем не менее, все, что приведено ниже, верно только для сценариев с включенной буферизацией, поскольку без него больше данных вы пытаетесь сразу нажать, чем дольше вы должны ждать (клиент должен получить и подтвердить его, используя TCP!).

Эффективнее посылать большую строку одновременно, чем N echo, конкатенацию вывода. По аналогичной логике, для интерпретатора более эффективно вводить блок кода PHP (инструкцию по обработке PHP в разметке SGML/XML) один раз, чем вводить и выходить из него много раз.

Что касается меня, я собираю свою разметку не с помощью echo, а с использованием XML DOM API. Это также соответствует статье, приведенной выше. (Я перепечатываю ссылку: http://hsivonen.iki.fi/producing-xml/) Это также отвечает на вопрос, следует ли использовать один или несколько тегов PHP. Используйте один тег, который является вашим целым script, пусть он соберет полученную разметку и отправит ее клиенту.

Ответ 5

Лично я предпочитаю то, что выглядит лучше, поскольку читаемость кода очень важна, особенно в командной среде. Что касается лучшей практики, я боюсь, что я не уверен, но обычно лучше всего оптимизировать последнее значение, чтобы сначала написать его для читаемости, а затем, если вы столкнулись с проблемами скорости, выполните некоторые рефакторинг.

Любые проблемы, которые у вас есть с эффективностью, скорее всего, будут в другом месте вашего кода, если вы не делаете миллионы эхо-сигналов.

Еще одна вещь, которую следует учитывать, - использование MVC, чтобы отделить ваши "взгляды" от всей вашей бизнес-логики, что очень чисто способ кодирования. Использование шаблона, такого как smarty, может сделать этот шаг еще одним шагом вперед к эпической победе.

Ответ 7

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

<?
    header('content-type:text/plain');
    for ($i=0; $i<10; $i++) {
        $r = benchmark_functions(
               array('output_embeed','output_single_quote','output_double_quote'),
               10000);
        var_dump($r);
    }

    function output_embeed($i) {
        ?>test <?php echo $i; ?> :)<?
    }

    function output_single_quote($i) {
        echo 'test '.$i.' :)';
    }

    function output_double_quote($i) {
        echo "test $i :)";
    }

    function benchmark_functions($functions, $amount=1000) {
        if (!is_array($functions)||!$functions)
            return(false);
        $result = array();
        foreach ($functions as $function)
            if (!function_exists($function))
                return(false);
        ob_start();
        foreach ($functions as $idx=>$function) {
            $start = microtime(true);
            for ($i=0;$i<$amount;$i++) {
                $function($idx);
            }
            $time = microtime(true) - $start;
            $result[$idx.'_'.$function] = $time;
        }
        ob_end_clean();
        return($result);
    }
?>