---
title: "PHP Echo ve Print: Ekrana Yazdırmanın Doğru Yolu"
url: "https://cilginyazilim.com/blog/php-echo-ve-print-ekrana-yazdirma"
description: "PHP echo ile print farkı, kısa etiket, dizi yazdırırken çıkan uyarı ve kullanıcı verisini güvenle yazdırmak için kaçış: çalıştırılmış örneklerle."
published: "2026-09-29T16:38:50+03:00"
modified: "2026-09-29T16:43:50+03:00"
author: "Çılgın Yazılım"
category: "Yazılım Geliştirme"
tags: ["php", "codeigniter", "xss", "hata ayıklama", "temiz kod"]
site: "CılgınYazılım"
language: "tr"
---

# 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.

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.

```php
$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
// 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:

```php
$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](https://cilginyazilim.com/blog/hata-ayiklayiciyi-gercekten-kullanmak-debugger) 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:

```php
$yorum = '<script>alert(1)</script>';
echo htmlspecialchars($yorum, ENT_QUOTES, 'UTF-8');
// &lt;script&gt;alert(1)&lt;/script&gt;
```

CodeIgniter 4 şablonlarında aynı işi `<?= esc($yorum) ?>` yapar. Kaçışın neden ilk savunma hattı olduğunu [web uygulama güvenliği](https://cilginyazilim.com/blog/web-uygulama-guvenligi-en-sik-gorulen-aciklar) yazısında, ikinci hattı ise [içerik güvenlik politikası (CSP)](https://cilginyazilim.com/blog/icerik-guvenlik-politikasi-csp-kurulumu) 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']}`.

```php
$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 &lt;Rize&gt;</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:

```php
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,89
```

Dikkat: `%.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](https://cilginyazilim.com/blog/php-hatalari-ve-hizli-cozumleri) yazısına bakabilirsiniz.

Konunun derinlemesine anlatımı için: [PHP Kılavuzu — echo](https://www.php.net/manual/en/function.echo.php).

## Sıkça 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.

---

Kaynak: [PHP Echo ve Print: Ekrana Yazdırmanın Doğru Yolu](https://cilginyazilim.com/blog/php-echo-ve-print-ekrana-yazdirma)
