Bu ob_get_contents () veya $ metin kullanmak daha iyidir = 'test'.;

5 Cevap php

I ob_get_clean() son sırasında bir çok gördük. Genellikle ben yaptım $test .= 'test'

Bir daha hızlı ve / veya diğerinden daha iyi olup olmadığını merak ediyorum.

İşte kullanarak kodu ob_get_clean():

ob_start();

foreach($items as $item) {
    echo '<div>' . $item . '</div>';
}

$test = ob_get_clean();

İşte kullanarak kodu $test .= 'test':

$test = '';

foreach($items as $item) {
    $test .= '<div>' . $item . '</div>';
}

Hangisi daha iyi?

5 Cevap

Çıktı tamponlar global değişkenler tüm tuzaklar var. Sen ob_get_clean() için ob_start() tüm yürütme yolları farkında olmak zorunda. Eğer oraya eminiz, ve arasında açılan herhangi bir tampon kapatılmış olacak? Kod istisnalar atabilirsiniz unutmayın. Yani izini sonraki adam için gerçekten eğlenceli bir hata olabilir.

Diğer taraftan - ve ben bile söz nefret - çıkış tamponlama büyük dizeleri bitiştirmek de biraz daha hızlı oldu bir anda, PHP iç nedenlerle. Hala doğru olup olmadığından emin değilim.

Sonuçlar aynıdır, ve ben performans farkı varsa ihmal hayal ediyorum. Temel olarak, kişisel tarz tercih meselesi. Ben değiştirgelidir kendim giderdim - birleştirme bir seçenek değil, sadece zaman çıktı tamponlama kullanıyorsanız.

Ayrıca, yerine ob_get_contents () ve ob_clean () çalışan sadece bir seferde hem gerçekleştirir () ob_get_clean çalıştırın.

Dize birleştirme yükü konusunda endişeleriniz varsa dikkat edilmesi gerektiğini bu:

.. echo '

' $ test '';

Bu daha yavaş ölçülebilir:

echo '

', $ test, '';

Ikinci aslında daha hızlı sadece üç yankıları, aşağı derler ise ilk bir yankı ardından iki dize concats aşağı derler.

Ben büyük dizeleri kullanırken çıktı tamponlama kullanarak küçük bir performans yararı olabileceğini düşünüyorum, ama bu kod muhtemelen başkaları tarafından anlaşılması daha kolay ve hata ayıklama olacak gibi ortak kullanım için bence değiştirgelidir iyidir.

Eğer çıktı tamponlama yaklaşımı kullanmak için gidiyoruz eğer küçük bir nokta, ama, siz de tam olarak kullanabilirsiniz:

ob_start();

foreach($items as $item) {
    echo '<div>';
    echo $item;
    echo '</div>';
}

$test = ob_get_clean();

Yukarıda belirtildiği gibi, çıkış tamponlama performans için daha iyidir. Büyük dizeleri için, performans farkı hiç önemsizdir değildir. Siz Java StringBuffer / StringBuilder için PHP çıktı tamponlama karşılaştırabilirsiniz; dize birleştirme için, bütün dize anısına her zaman kopyalanması gerekir. Çıkış tamponlama için, metin mantıklı incremements yetişen bir tampon gider, ve her bir çıkış için veri kopyalamak için gerek yoktur.

Ayrıca inline HTML (daha hızlı) kullanma hakkında düşünebilirsiniz. Inline HTML yararı IDE olasılıkla HTML PHP dizge içinde olduğu zaman olmayacak, hangi HTML vurgulayarak sözdizimi gerçekleştirebilirsiniz olmasıdır. Modifiye kodu (short_open_tags = gerekli On):

ob_start();
?>

<? foreach($items as $item) { ?>
    <div><?= $item ?></div>
<? } ?>

<?
$test = ob_get_clean();