switch ($value) yapısı, belirli bir değeri bir dizi case etiketiyle kıyaslar ve eşleşen ilk etiketin altındaki kod bloğunu çalıştırır. Her case bloğu genellikle break ile sonlandırılır; hiçbir etiketle eşleşme sağlanamadığında ise default bloğu devreye girer.
PHP:
<?php
$day = 'sat';
switch ($day) {
case 'mon':
echo "Start of the week";
break;
case 'fri':
echo "Almost weekend";
break;
case 'sat':
case 'sun':
echo "Weekend";
break;
default:
echo "A regular weekday";
}
$day değişkenine 'fri', 'sun' veya 'wed' değerlerini atayıp kodu çalıştırdığınızda farklı sonuçlar görebilirsiniz. Eğer default bloğu en sonda yer alıyorsa, burada break kullanmanıza gerek yoktur.Tek Bir Blok İçin Birden Fazla Case Tanımlama
Birden fazla değer için aynı kodun çalışmasını istiyorsanız,
case etiketlerini aralarına herhangi bir kod yazmadan alt alta sıralayabilirsiniz. Bu durumda, eşleşen etiketten itibaren aşağıdaki kodlar çalıştırılmaya devam eder.
PHP:
<?php
$extension = 'jpeg';
switch ($extension) {
case 'jpg':
case 'jpeg':
case 'png':
case 'webp':
$type = 'image';
break;
case 'mp4':
case 'mov':
$type = 'video';
break;
default:
$type = 'unknown';
}
echo "Type of .$extension: $type";
match ifadesinin aksine, switch yapısında case 'jpg', 'jpeg': şeklinde bir virgül kullanımı yoktur; bu nedenle etiketlerin alt alta yazılması tek yöntemdir.Fallthrough: break Kullanılmadığında Ne Olur?
Bir switch işlemini durduran ifade
break komutudur. Eğer bu komut kullanılmazsa, PHP eşleşen case'i çalıştırdıktan sonra sonraki etiketleri dikkate almadan, bir break ile karşılaşana veya yapı sona erene kadar altındaki tüm case'leri çalıştırmaya devam eder.
PHP:
<?php
$plan = 'pro';
echo "Features for $plan:\n";
switch ($plan) {
case 'enterprise':
echo "- single sign-on\n";
case 'pro':
echo "- unlimited projects\n";
case 'free':
echo "- 3 projects\n";
echo "- community support\n";
}
Yukarıdaki örnekte fallthrough bilinçli olarak uygulanmıştır: Her plan, kendi özelliklerinin yanı sıra daha alt planların tüm imkanlarını da kapsar. Bu yöntemi kasıtlı olarak kullandığınızda, kodu okuyan diğer kişilerin bunu bir hata sanıp düzeltmemesi için
// no break şeklinde bir yorum eklemeniz önerilir. Bunun aksine, yanlışlıkla unutulan bir break, en sık karşılaşılan switch hatalarından biridir.switch Gevşek Karşılaştırma (==) Kullanır
Her bir
case kontrolü === (sıkı karşılaştırma) ile değil, == (gevşek karşılaştırma) ile yapılır. Bu nedenle sayısal bir string ile bir sayı, null ile false veya boş string (""), true ile de "doğru" kabul edilen her değer eşleşebilir.switch == ile, match === ile karşılaştırır
| $a == $b | 0 | 1 | "0" | "1" | "" | null | false | true | "a" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | true | false | true | false | false | true | true | false | false | false | false |
| 1 | false | true | false | true | false | false | false | true | false | false | false |
| "0" | true | false | true | false | false | false | true | false | false | false | false |
| "1" | false | true | false | true | false | false | false | true | false | false | false |
| "" | false | false | false | false | true | true | true | false | false | false | false |
| null | true | false | false | false | true | true | true | false | false | false | false |
| false | true | false | true | false | true | true | true | false | false | false | false |
| true | false | true | false | true | false | false | false | true | true | true | true |
| "a" | false | false | false | false | false | false | false | true | true | false | false |
| "10" | false | false | false | false | false | false | false | true | false | true | true |
| "1e1" | false | false | false | false | false | false | false | true | false | true | true |
Pratik bir sonuç olarak; bir formdan gelen
"1" şeklindeki string girdi, herhangi bir dönüştürme işlemine gerek kalmadan case 1: bloğuna girer ve bu genellikle istenen durumdur. Ancak boş olmayan bir string ile switch (true) kullanıldığında veya null bir değer case false: ile karşılaştığında beklenmedik sonuçlar ortaya çıkabilir.
PHP:
<?php
function describe(mixed $value): string
{
switch ($value) {
case 0:
return "zero";
case "10":
return "ten";
case false:
return "false-ish";
default:
return "something else";
}
}
echo describe("0"), "\n"; // "0" == 0
echo describe(10), "\n"; // 10 == "10"
echo describe("1e1"), "\n"; // "1e1" == "10" (both are numeric)
echo describe(null), "\n"; // null == 0
echo describe(""), "\n"; // "" == false
echo describe("a"), "\n";
null satırına dikkat edin: null == 0 ifadesi true olduğu ve case 0: daha önce geldiği için kod case false: satırına hiç ulaşmaz. Gevşek karşılaştırmalarda case'lerin sıralaması sonucu doğrudan etkiler. PHP 8 sürümünden itibaren 0 == "a" ifadesi false değerini döndürür (PHP 7'de true idi), bu yüzden sayısal olmayan stringler artık case 0: ile eşleşmez. Kesin tip kontrolü (===) gerekiyorsa, sayfanın sonunda anlatılan match ifadesini kullanın.Aralıklar ve Koşullar İçin switch(true)
Case etiketleri herhangi bir ifade olabilir.
switch (true) yapısını kullandığınızda, her bir case bir koşula dönüşür ve sonucu true olan ilk blok çalışır.
PHP:
<?php
$score = 83;
switch (true) {
case $score >= 90:
$grade = 'A';
break;
case $score >= 80:
$grade = 'B';
break;
case $score >= 70:
$grade = 'C';
break;
default:
$grade = 'F';
}
echo "Score $score is grade $grade";
Case ifadelerinin gerçek bir boolean değer döndürdüğünden emin olun. Gevşek karşılaştırma nedeniyle,
$name değişkeni boş olmayan bir string olduğunda case $name: ifadesi her zaman eşleşecektir.Döngü İçinde switch: break ve continue
Bir döngü içerisindeki switch yapısında kullanılan
break, sadece switch bloğundan çıkış sağlar; döngüyü sonlandırmaz. Döngüden tamamen çıkmak için break 2 kullanmanız gerekir. Switch içinde kullanılan continue ise break gibi davranır ve PHP derleme sırasında şu uyarıyı verir: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. Döngünün bir sonraki adımına geçmek için continue 2 yazmalısınız.
PHP:
<?php
$commands = ['add', 'skip', 'add', 'stop', 'add'];
$total = 0;
foreach ($commands as $command) {
switch ($command) {
case 'add':
$total++;
break; // leaves the switch only
case 'skip':
continue 2; // next foreach iteration
case 'stop':
break 2; // leaves the foreach
}
echo "after $command, total = $total\n";
}
echo "Final total: $total\n";
switch ile match
PHP 8 ile birlikte, switch'in birçok kullanım amacını daha kısa kodla gerçekleştiren
match ifadesi tanıtılmıştır. match; === ile karşılaştırma yapar, bir değer döndürür, fallthrough yapmaz, virgülle ayrılmış koşullara izin verir ve hiçbir eşleşme bulamadığında UnhandledMatchError hatası fırlatır; böylece unutulmuş bir case sessizce geçiştirilmez.
PHP:
<?php
$status = 404;
// switch
switch ($status) {
case 200:
case 201:
$text = 'OK';
break;
case 404:
$text = 'Not found';
break;
default:
$text = 'Error';
}
echo $text, "\n";
// match
echo match ($status) {
200, 201 => 'OK',
404 => 'Not found',
default => 'Error',
}, "\n";
Bir case bloğunda birden fazla işlem yapmanız gerekiyorsa veya plan örneğindeki gibi fallthrough yapısı amaçlanmışsa switch kullanın. Ancak bir değeri belirli bir sonuca eşlemek istiyorsanız match hem daha kısa hem de daha güvenlidir.