Yazılım Geliştirme kod örnekli
PHP Echo ve Print: Ekrana Yazdırmanın Doğru Yolu
echo ile print aynı işlem koduna derlenir; aralarında hız farkı yok. Asıl fark, ekrana neyi ve nasıl yazdırdığınızda.

İçindekiler
PHP echo, bir ya da daha fazla ifadeyi çıktıya yazan bir dil yapısıdır; print de aynı işi yapar ama tek değer alır ve 1 döndürür. İkisi arasında seçim, ekrana doğru yazdırmanın küçük kısmıdır. Asıl mesele iki yerde çıkar: metne dönüşmeyen değerler uyarı üretir, kullanıcıdan gelen veri kaçışsız yazdırılırsa XSS açığı olur.
Örneklerin hepsi PHP 8.2.12'de çalıştırıldı; yorumlardaki çıktılar tarayıcıda görünen hâliyle, kısaltılarak aktarıldı.
echo ve print: iki fark ve bir parantez tuzağı
echo virgülle ayrılmış birden fazla değer alır ve değer döndürmez; print tek değer alır ve her zaman 1 döndürür. PHP kılavuzu bunları başlıca farklar olarak sayar; ikincisinin sonucu, bir ifadenin içinde yalnız print'in kullanılabilmesidir. İkisi de fonksiyon değil dil yapısıdır, bu yüzden parantez gerekmez; parantez yazmak da yanıltabilir: print("merhaba") && print("dunya"); ekrana "dunya1" yazar, çünkü parantez print'in değil ifadenin parçasıdır.
$ad = 'Ayşe';
echo 'Merhaba ', $ad, "\n"; // Merhaba Ayşe
$sonuc = print "print de yazar\n"; // print de yazar
var_dump($sonuc); // int(1)print'in dönüş değeri her zaman 1 olduğu için bir koşulda bilgi taşımaz; kodda tutarlılık için birini seçip onunla devam etmek yeterlidir.
Hız farkı yok: ikisi aynı koda derlenir
"echo daha hızlıdır" bilgisi PHP 8.2'de geçerli değil: deyim olarak yazılan echo $x; ile print $x; derleyiciden aynı işlem koduyla çıkar. OPcache'in derleme dökümü bunu gösterir; print'in döndürdüğü 1 yalnız bir değişkene atandığında ayrı bir işleme dönüşür:
// php -d zend_extension=opcache -d opcache.enable_cli=1 -d opcache.opt_debug_level=0x10000 deneme.php
$x = 'a';
echo $x; // 0001 ECHO CV0($x)
print $x; // 0002 ECHO CV0($x)
$s = print $x; // 0003 ECHO CV0($x) 0004 ASSIGN CV1($s) int(1)Aynı işlem kodunu süre ölçerek kıyaslamak yalnız makinenin o anki gürültüsünü ölçer; ikisi arasındaki seçimi hız değil, okunabilirlik belirler.
Kısa etiket: <?= her zaman açık
echo'nun kısa yazımı olan <?= ... ?> etiketi, short_open_tag ayarı kapalı olsa da çalışır; bu yüzden şablon dosyalarında gönül rahatlığıyla kullanılır. Kılavuz bunu açıkça yazar; biz de php -d short_open_tag=0 ile denedik ve çıktı değişmedi. Kapalı olduğunda çalışmayan, yalnız <? ile açılan eski kısa etikettir.
Dizi yazdırınca neden "Array" görünür?
echo bir dizinin içeriğini yazamaz: PHP 8.2 diziyi metne çevirirken ekrana yalnız "Array" yazar ve "Array to string conversion" uyarısı üretir. İçeriği görmek için diziyi önce metne çevirin:
$liste = ['elma', 'armut'];
echo $liste; // Warning: Array to string conversion … → Array
echo implode(', ', $liste); // elma, armut
print_r($liste); // Array ( [0] => elma [1] => armut )
echo json_encode($liste); // ["elma","armut"]Aynı dönüşüm mantıksal değerlerde sessizce olur: true çıktıda "1" olarak görünür, false ve null ise hiçbir şey yazmaz. Bir değerin gerçekte ne olduğunu görmek için yazdırmak yerine var_dump() kullanın.
CodeIgniter 4'te hızlı bakış için echo yerine d($liste) kullanın: değeri türüyle ve iç içe yapısıyla gösterir; dd($liste) gösterip çalışmayı durdurur. İkisi de yalnız geliştirme ortamında (CI_DEBUG açıkken) çıktı verir. Değer birkaç fonksiyondan geçerek değişiyorsa satır satır yazdırmak yerine kesme noktası koyun; yöntemi hata ayıklayıcıyı gerçekten kullanmak yazısında anlattık.
Kullanıcı verisini yazdırırken kaçış
Yazdırılan metin çıktıya olduğu gibi gider; içinde HTML ya da JavaScript varsa tarayıcı onu çalıştırır. Kullanıcıdan gelen her değer yazdırılmadan önce kaçıştan geçmelidir:
$yorum = '<script>alert(1)</script>';
echo htmlspecialchars($yorum, ENT_QUOTES, 'UTF-8');
// <script>alert(1)</script>CodeIgniter 4 şablonlarında aynı işi <?= esc($yorum) ?> yapar. Kaçışın neden ilk savunma hattı olduğunu web uygulama güvenliği yazısında, ikinci hattı ise içerik güvenlik politikası (CSP) yazısında bulabilirsiniz.
Uzun HTML için şablon ya da heredoc
Birkaç satırlık HTML'i tırnaklar ve nokta birleştirmeleriyle tek bir yazdırma satırına sığdırmak hem okumayı hem kaçışı zorlaştırır: hangi değerin kaçıştan geçtiği satırın içinde kaybolur. İki temiz yol var. Birincisi PHP bloğunu kapatıp HTML'i düz yazmak ve değerleri kısa etiketle araya koymaktır; CodeIgniter 4 görünümleri bu biçimdedir. İkincisi heredoc sözdizimidir: çok satırlı metin tırnak kaçışı gerektirmeden yazılır, değişkenler çift tırnaktaki gibi yerine konur; dizi elemanı gibi ifadeler süslü parantez ister: {$urun['ad']}.
$urun = ['ad' => 'Çay <Rize>', 'fiyat' => 89.5];
$ad = htmlspecialchars($urun['ad'], ENT_QUOTES, 'UTF-8');
$fiyat = number_format($urun['fiyat'], 2, ',', '.');
echo <<<KART
<article class="urun">
<h3>{$ad}</h3>
<p>{$fiyat} TL</p>
</article>
KART;
// <h3>Çay <Rize></h3> <p>89,50 TL</p>Dikkat: heredoc değişkenleri olduğu gibi yerleştirir, kaçış yapmaz. Değerleri bloğa girmeden önce hazırlayın; örnekteki ürün adı bu yüzden önce htmlspecialchars ile kaçıştan geçiyor.
Biçimli çıktı: printf ve number_format
Metin ile sayıyı birleştirirken nokta ile uğraşmak yerine printf kalıbı daha okunur, number_format ise sayıyı Türkçe biçime getirir:
printf("%s sepette %d ürün var, toplam %.2f TL\n", 'Ayşe', 3, 149.9);
// Ayşe sepette 3 ürün var, toplam 149.90 TL
printf("%.2F\n", 149.9); // 149.90 (yerel ayardan bağımsız)
echo number_format(1234567.891, 2, ',', '.'); // 1.234.567,89Dikkat: %.2f yerel ayara bağlıdır; varsayılanda nokta basar, ama uygulama bir yerde setlocale() ile Türkçe yerel ayara geçmişse virgül basar (bu makinede 149,90). CSV, JSON ya da SQL'e giden sayılarda her zaman nokta için %.2F kullanın; ekranda Türkçe tutar için number_format tercih edin.
echo ile print arasındaki fark derlenmiş kodda bile yok; ekrana doğru yazdırmak, yazdırdığınız değerin türünü ve nereden geldiğini bilmektir. Kodda birini seçip tutarlı kullanın, dizileri implode, print_r ya da json_encode ile yazdırın, bir değerin gerçek hâlini var_dump ile görün, kullanıcıdan gelen her değeri htmlspecialchars ya da esc() ile kaçıştan geçirin ve makineye giden sayılarda %F kullanın. Diğer PHP uyarıları için PHP hata mesajları ve hızlı çözümleri yazısına bakabilirsiniz.
Konunun derinlemesine anlatımı için: PHP Kılavuzu — echo.
Sık sorulan sorular
PHP'de eco diye bir komut var mı?
Hayır, doğrusu echo. eco "Merhaba"; yazılırsa PHP 8.2 dosyayı hiç çalıştırmaz ve "Parse error: syntax error, unexpected double-quoted string" verir. eco("Merhaba"); ise o satıra kadar çalışır ve "Call to undefined function eco()" hatasıyla durur; iki hata da eco'nun satırını gösterir.
echo ile alt satıra nasıl geçilir?
Tarayıcıda <br> etiketiyle: echo "Satır 1<br>Satır 2"; yazılır. Komut satırında ve dosyaya yazarken çift tırnaklı "\n" ya da PHP_EOL kullanılır; tek tırnak içindeki \n olduğu gibi yazılır. Kullanıcı metnindeki satır sonlarını korumak için önce kaçış, sonra nl2br: nl2br(esc($metin)).
print_r ile var_dump arasındaki fark nedir?
print_r diziyi okunur biçimde gösterir. var_dump her değerin türünü ve uzunluğunu da yazar; boş metin ile null, "1" ile 1 gibi farkları görmek için var_dump gerekir.
echo ile HTML yazdırılabilir mi?
Evet, echo metni olduğu gibi yazar, HTML etiketleri de tarayıcıda işlenir. Kullanıcıdan gelen veriyi yazdırırken bu yüzden önce htmlspecialchars ya da CodeIgniter'da esc() ile kaçış yapılmalıdır.
Yazan
Çılgın Yazılım
Ben Evren Çılgın; yazılım geliştirme, web teknolojileri ve sistem tasarımı alanlarında uzmanlaşmış bir geliştiriciyim. Uzun yıllardır hem frontend hem de backend tarafında üretken, ölçeklenebilir ve kullanıcı dostu çözümler üretiyorum.
Bu konuda bir projeniz mi var?
İhtiyacınızı birkaç cümleyle anlatın; uygun yaklaşımı birlikte belirleyelim.
İlgili yazılar
Yorumlar
Henüz yorum yok. Sorunuzu ya da deneyiminizi ilk siz yazın.
Yorum yazın
Yorumunuz onaylandıktan sonra yayınlanır. Ekibimiz gerekirse konuyla ilgili bir yanıt da paylaşır.


