Bodyguardd 1
Bodyguardd
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Jack.Wrestler 1
Jack.Wrestler
mavzermete 1
mavzermete
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Agora Metin2 1
Agora Metin2
TuZaKK 1
TuZaKK
Reklam vermek için turkmmo@gmail.com

Altın Konu PHP'de Koşullu İfadeler: if, elseif ve else Kullanımı

image.jpeg


PHP'de `if (condition) { ... }` yapısı, belirtilen şart sağlandığında (true olduğunda) çalışır. Farklı senaryolar eklemek için `elseif (other condition) { ... }`, geri kalan tüm durumlar içinse `else { ... }` kullanılır. PHP, bu kontrolleri yukarıdan aşağıya doğru yapar ve ilk eşleşen bloğu çalıştırdıktan sonra diğerlerini atlar.

PHP:
<?php
$temperature = 24;

if ($temperature >= 30) {
    echo "Hot";
} elseif ($temperature >= 20) {
    echo "Warm";
} elseif ($temperature >= 10) {
    echo "Cool";
} else {
    echo "Cold";
}

`$temperature` değerini değiştirerek kodu çalıştırdığınızda, kontrol sırasının önemini göreceksiniz. Örneğin değer `24` olduğunda, ikinci koşul sağlandığı için işlem orada durur; bu nedenle `>= 10` gibi daha genel bir koşula asla sıra gelmez. Bu yüzden koşullarınızı her zaman en özelden en genele doğru sıralamalısınız.

elseif ve else if arasındaki fark

Süslü parantezler kullanıldığında `elseif` ile `else if` aynı şekilde çalışır. Teknik olarak `else if`, gövdesinde yeni bir `if` barındıran bir `else` bloğudur, ancak sonuç değişmez.

PHP:
<?php
$n = 0;

if ($n > 0) {
    echo "positive\n";
} elseif ($n < 0) {
    echo "negative\n";
} else {
    echo "zero\n";
}

if ($n > 0) {
    echo "positive\n";
} else if ($n < 0) {
    echo "negative\n";
} else {
    echo "zero\n";
}

Aradaki fark, ileride göreceğimiz iki nokta (:) sözdiziminde ortaya çıkar. Bu yapıda `else if` kullanımı hata oluşmasına neden olur:

PHP:
<?php $score = 72; ?>
<?php if ($score >= 90): ?>
    <p>A</p>
<?php else if ($score >= 60): ?>
    <p>Passed</p>
<?php endif; ?>

Kod:
PHP Parse error:  syntax error, unexpected token "if", expecting ":" in /home/index.php on line 4

Bu sorunu yaşamamak için her zaman tek kelime olan `elseif` ifadesini tercih edin.

Mantıksal Operatörler: && ve || Kullanımı

`&&` (ve) operatörü her iki şartın da doğru olmasını, `||` (veya) operatörü ise en az birinin doğru olmasını gerektirir. `!` operatörü ise mevcut durumu tersine çevirir. PHP, sonucun belli olduğu ilk noktada değerlendirmeyi durdurur; örneğin `$user !== null && $user['active']` ifadesinde, eğer kullanıcı null ise ikinci kısma bakılmaz bile.

PHP:
<?php
$age = 17;
$withParent = true;
$role = 'editor';

if ($age >= 18 || $withParent) {
    echo "Can enter\n";
}

if ($role === 'admin' || $role === 'editor') {
    echo "Can edit posts\n";
}

if (in_array($role, ['admin', 'editor'], true)) {
    echo "Same check, shorter\n";
}

if (!($age >= 18)) {
    echo "Not an adult\n";
}

`&&` ve `||` operatörlerini aynı satırda karışık kullandığınızda, işlem önceliğini netleştirmek ve kodun okunabilirliğini artırmak için parantez kullanın. PHP'de `and` ve `or` kelimeleri de mevcuttur ancak bunların önceliği `=` operatöründen bile düşüktür. Mesela `$ok = true and false;` yazdığınızda `$ok` değişkeni `true` olur. Bu yüzden her zaman `&&` ve `||` operatörlerini kullanmaya özen gösterin.

PHP'de "True" ve "False" Kabul Edilen Değerler

Bir koşulun mutlaka boolean türünde olması gerekmez; PHP bunu otomatik olarak dönüştürür. Aşağıdaki değerler `false` olarak kabul edilir:
• `false`
• `0`
• `0.0`
• `""`
• `"0"`
• `[]`
• `null`

Bunlar dışındaki her şey (örneğin `"false"`, `" "` veya `"0.0"`) `true` olarak değerlendirilir.

if ($x) Kullanımındaki Kritik Noktalar

$xboolempty
falsefalsetrue
0falsetrue
0.0falsetrue
""falsetrue
"0"falsetrue
nullfalsetrue
[]falsetrue
" "truefalse
"0.0"truefalse
"a"truefalse
[0]truefalse
1truefalse

`if ($items)` şeklinde bir kullanım, bir dizinin boş olup olmadığını kontrol etmek için sıkça kullanılır. Ancak `"0"` değeri burada risklidir: Bir formdan gelen `"0"` girişi teknik olarak boş olmayan bir stringdir, fakat `if ($_POST['qty'])` şeklinde kontrol edildiğinde `false` döner. Eğer sıfır geçerli bir veri ise, `if ($qty !== '')` gibi kesin bir karşılaştırma yapmalısınız. `empty()` fonksiyonu da aynı mantıkla çalışır.

PHP:
<?php
$cart = [];
$quantity = "0";

if ($cart) {
    echo "Cart has items\n";
} else {
    echo "Cart is empty\n";
}

if ($quantity) {
    echo "Quantity given\n";
} else {
    echo "Treated as false, even though the user typed 0\n";
}

if ($quantity !== '') {
    echo "Explicit check: quantity is $quantity\n";
}

HTML İçinde Alternatif Sözdizimi: if: ve endif;

HTML etiketleri arasında çok sayıda süslü parantez kullanmak karmaşaya neden olabilir. Bunun yerine PHP'nin alternatif sözdizimini kullanabilirsiniz: Koşuldan sonra iki nokta (`:`) koyup, diğer dalları `elseif ...:` ve `else:` şeklinde tanımlayıp, bloğu `endif;` ile kapatabilirsiniz. Kodu çalıştırdığınızda, farklı `$_GET['score']` değerleri ile sonuçların nasıl değiştiğini gözlemleyebilirsiniz.

PHP:
<?php
$score = (int) ($_GET['score'] ?? 72);
?>
<style>
    .pass { color: #1a7f37; } .fail { color: #cf222e; }
</style>
<h3>Score: <?= $score ?></h3>

<?php if ($score >= 90): ?>
    <p class="pass">Excellent, grade A.</p>
<?php elseif ($score >= 60): ?>
    <p class="pass">Passed.</p>
<?php else: ?>
    <p class="fail">Not passed yet. You need 60.</p>
<?php endif; ?>

<p>Try: <a href="?score=95">95</a> · <a href="?score=72">72</a> · <a href="?score=40">40</a></p>

`<?= $score ?>` kullanımı, aslında `<?php echo $score; ?>` ifadesinin kısa yoludur. Benzer iki nokta stili `foreach: endforeach;` ve `while: endwhile;` gibi döngülerde de kullanılır ve birçok şablon sisteminin temelini oluşturur.

Tek Satırlık Koşullar ve Ternary Operatörü

Koşuldan sonra süslü parantez kullanmadan tek bir ifade yazılabilir. Bu yöntem çalışsa da, sonradan eklenen satırların `if` bloğu dışında kalmasına yol açabileceği için çoğu standart her zaman süslü parantez kullanılmasını önerir. İki seçenek arasından birini hızlıca seçmek için ise ternary operatörü, tam bir `if/else` yapısından çok daha pratiktir.

PHP:
<?php
$count = 3;
$debug = false;

if ($debug) echo "Debug mode\n";

$label = $count === 1 ? 'item' : 'items';
echo "$count $label\n";

// Same thing with if/else
if ($count === 1) {
    $label = 'item';
} else {
    $label = 'items';
}
echo "$count $label\n";

Eğer tek bir değişkeni çok sayıda sabit değerle karşılaştırıyorsanız, `match` ifadesi uzun `elseif` zincirlerine göre çok daha okunaklıdır.

Derin İç İçe Yapılar Yerine "Erken Dönüş" (Early Return)

Birbirinin içine geçmiş çok sayıda `if` bloğu kodu takip etmeyi zorlaştırır. Bunun yerine, özellikle fonksiyonlarda önce hata veya başarısızlık durumlarını kontrol edip hemen `return` ile çıkış yapmak daha mantıklıdır. Böylece ana işlem akışı daha sade kalır.

PHP:
<?php
function checkout(array $cart, ?string $email): string
{
    if (!$cart) {
        return "Cart is empty";
    }
    if ($email === null) {
        return "Email required";
    }
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return "Invalid email";
    }

    return "Order placed for $email";
}

echo checkout([], 'ada@example.com'), "\n";
echo checkout(['book'], null), "\n";
echo checkout(['book'], 'not-an-email'), "\n";
echo checkout(['book'], 'ada@example.com'), "\n";

Sık Karşılaşılan Hata: == Yerine = Kullanmak

Tek bir eşittir (`=`) atama işlemi yapar. Eğer `if ($role = 'admin')` şeklinde bir yazım yaparsanız, `$role` değişkenine `'admin'` değeri atanır ve bu string `true` olarak değerlendirildiği için blok her zaman çalışır. Ayrıca değişkenin orijinal değeri de bozulmuş olur.

PHP:
<?php
$role = 'guest';

if ($role = 'admin') {
    echo "Bug: everyone is admin now, role is '$role'\n";
}

$role = 'guest';
if ($role === 'admin') {
    echo "Admin\n";
} else {
    echo "Fixed: role is '$role'\n";
}

Veri tipini değiştirmek istemiyorsanız karşılaştırmalarda her zaman `===` kullanın. Bazı geliştiriciler, yanlışlıkla atama yapmayı önlemek için sabiti başa yazar (`if ('admin' === $role)`); böylece tek eşittir kullanıldığında PHP sessizce atama yapmak yerine hata verir.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst