PHP - echo echo veya değil?

7 Cevap php

Daha verimli nedir ve / veya ne HTML yankı ya da çok açık ve yakın php etiketleri var, daha iyi bir uygulamadır?

Açıkçası HTML büyük alanlar için php etiketleri açmak ve kapatmak için mantıklı. Ne XML oluşturma gibi bir şey ile uğraşırken hakkında? Açık ve her veri parçası için tek bir yankı ile php etiketleri kapatmak veya XML etiketleri ile tek bir yankı kullanmak alıntılar dahil gerekir?

7 Cevap

Küçük değişiklikler bile olmayan bir teknik kişi tarafından kolayca yapılabilir böylece bakım açısından bakıldığında, bir, IMO mümkün kodundan ayrı olarak HTML / XML olmalıdır.

Biçimlendirme temizleyici eseridir homojen bir blok daha.

Bunu yapmanın bir yolu, değişken mümkün olduğu kadar hazırlamak için kullanılması ve heredoc syntax,

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

Elbette daha mantıklı değişken adlarını kullanmak isteyeceksiniz.

Edit: bağlantı görüşleri @ stesch tarafından işaret kullanımına yönelik bazı iyi argümanlar sağlayan bir serializer XML üretirken, ve uzantısı yerine, yukarıda gösterildiği gibi dışarı baskı hatta HTML, . Ben özellikle şablonları so daha düzenlemek için kolay bir bakım açısından, bir sıralandırıcı every durumda gerekli olduğunu sanmıyorum, ama bağlantı okuma değer. HOWTO Avoid Being Called a Bozo When Producing XML

Mantık ve içerik arasındaki ayrılığın bir diğer büyük avantajı bir çiftleşmiş motoru geçiş, ya da önbelleğe tanıtımı gerekli bir gün olursa, bu mantık ve kod zaten ayrılmış, çünkü uygulamak neredeyse ağrısız olmasıdır.

PHP heredocs olarak bilinen bu sorunu çözer. Check it out please.

Örnek:

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

Note: heredoc belirteç (bu örnekte EOD) herhangi bir boşluk veya girinti olmamalıdır.

Size mantıklı hangisi. Performans farkı büyük bir yankı daha hızlı olsa da, marjinal olduğunu.

Ama büyük bir dize bir yankı okumak ve daha fazla <?php echo $this->that; ?> bir hikaye anlatmak zor :)

echo argüman isteği işleme zincirinde daha aşağı gönderir ve sonunda bu dize diyelim, ağ soketi üzerinden istemciye gönderilir. echo bazen komut may bunu müşteriye veri zorlayabilir daha hızlı çalıştırmak mümkün olacak, temel yazılım katmanları (örn. web sunucusu) ile birlikte nasıl çalıştığını bağlı. Verilerini çıktı ara bellek olmadan olmasıdır. Çıkış tamponlama ile, hız kazanmak için bellek ticaret - onlar bir bellek tamponunda birikir, çünkü echo s hızlıdır. Ama oluyor hiçbir implicit tamponlama var sadece. One'll nasıl Phps stdout veri tedavisi bulunmamış görmek için Apache kaynak kodu incelemek gerekir.

Bu daha fazla veri olmadan bir kerede uzun süre (istemci TCP yollardan, onu almak ve kabul etmek var!) Beklemek zorunda itmeye yana olduğunu söyledi, altında bir şey, sadece çıkış tamponlama etkin komut için geçerlidir.

O anda N echo çıkışını birleştirerek yapmak daha büyük bir dize göndermek için daha verimlidir. Benzer bir mantıkla, bir kez daha girmek PHP kod bloğunu (SGML / XML işaretleme PHP işlem yönergesi) girmek ve bunu birçok kez çıkmak için tercüman için daha verimlidir.

Bana gelince, ben echo ile benim biçimlendirme değil birleştirmek, ancak XML DOM API kullanarak. Bu yukarıda bağlantılı maddesine göre de. (Ben bağlantıyı yeniden yazdırın: http://hsivonen.iki.fi/producing-xml/) Bu da bir veya birçok PHP etiketlerini kullanmak isteyip soruyu cevaplar. Tüm script bir etiket kullanmak, o çıkan biçimlendirme araya ve müşteri göndermek sağlar.

Şahsen ben looks okunabilirliğe olarak iyi, çok önemli, özellikle bir takım ortamında ne tercih etme eğilimindedir. En iyi uygulama açısından ben ancak bu hız sorunları bazı üstlenmeden yapmak karşılaşırsanız eğer ilk ve sonra okunabilmesi için yazmak gerektiğini son anlam optimize etmek için genellikle en iyi uygulama emin değilim korkuyorum.

Eğer verimlilik ile herhangi sorunlar yankı yıllardan milyonlarca yapıyoruz sürece başka kodunuzda olması muhtemeldir.

Başka bir şey düşünmek koduna çok temiz bir yoludur tüm iş mantığını gelen "görüşlerini" ayırmak için MVC kullanılmasıdır. Böyle smarty gibi bir şablon çerçeve kullanarak daha epik galibiyetle lider bu bir adım atabilirsiniz.

Ne yaparsan yap, XML baskı yok!

Bkz HOWTO Avoid Being Called a Bozo When Producing XML

Ben uzun zaman önce kendimi aynı soru yapılmış ve aynı cevabı ile geldi, bu önemli bir fark değil. Bu test ile bu cevabı düşeriz:

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