(PHP 4, PHP 5, PHP 7, PHP 8)
switch deyimi, aynı ifade içersinde yer alan bir dizi
IF deyimine benzer. Birçok durumda, aynı değişkeni (ya da ifadeyi)
birden çok değerle karşılaştırmak ve her karşılaştırmanın sonucunu
ayrı bir kod parçası çalıştırarak değerlendirmek istersiniz. İşte bu,
switch deyiminin varlık sebebidir.
Bilginize: Başka bazı dillerden farklı olarak, continue deyimi
switchile uygulanabilir vebreakile benzerlik gösterir. Bir döngü içerisindeswitchkullandıysanız ve kodun yürütülmesine dıştaki döngünün sonraki yinelemeden devam etmesini istiyorsanız,continue 2kullanabilirsiniz.
Bilginize:
switchvecasegevşek karşılaştırma yapar.
Aşağıdaki iki örnek aynı şeyi yazmanın iki farklı yolunu göstermektedir.
Birincisi bir dizi if ve elseif
deyiminin kullanımını, ikincisi ise switch deyiminin
kullanımını örneklemektedir:
Örnek 1 - switch yapısı
<?php
// Bu switch deyimi:
switch ($i) {
case 0:
echo "i eşittir 0";
break;
case 1:
echo "i eşittir 1";
break;
case 2:
echo "i eşittir 2";
break;
}
// bunlara eşdeğerdir:
if ($i == 0) {
echo "i eşittir 0";
} elseif ($i == 1) {
echo "i eşittir 1";
} elseif ($i == 2) {
echo "i eşittir 2";
}
?>
Hatalardan kaçınmak için switch deyiminin nasıl
çalıştığını anlamak önemlidir. switch deyimi satır
satır ele alınır (aslında deyim deyim). Başlangıçta, hiçbir kod
çalıştırılmaz. Yalnızca switch ifadesiyle birlikte
verilen değer ile uyuşan case deyimi bulunduğunda PHP
ilgili deyimleri çalıştırmaya başlar. PHP switch
bloğu sonlanana kadar ya da ilk break deyimi ile
karşılaşıncaya kadar çalışmasına devam eder. Bir case bloğunun sonuna
break koymazsanız, PHP sonraki
case deyiminden kodları çalıştırmaya devam eder.
Örnek:
<?php
switch ($i) {
case 0:
echo "i eşittir 0";
case 1:
echo "i eşittir 1";
case 2:
echo "i eşittir 2";
}
?>
Burada, $i 0'a eşit ise, PHP tüm
echo deyimlerini çalıştıracaktır!
$i 1'e eşit ise, PHP son iki echo
deyimini çalıştıracaktır! Beklediğiniz sonucu ('i eşittir 2' metninin
görüntülenmesi) yalnızca $i 2'ye eşitse almanız
mümkün olacaktır. Bu durumun oluşmaması için, break
deyimini kullanmayı unutmamanız önemlidir (yine de, bazı durumlarda
break deyimini kullanmak istemeyebilirsiniz).
Bir switch deyiminde, koşul yalnızca bir defa
sorgulanır ve sonuç her bir case deyimi ile
karşılaştırılır. Bir elseif deyiminde ise, koşul
tekrar sorgulanır. Kullanmak istediğiniz koşul basit bir karşılaştırma
işleminden daha karmaşıksa ve/veya bir döngü içerisindeyse,
switch kullanmak daha hızlı olabilir.
case bloğu kod içermeyebilir ve amacı yalnızca
denetimi bir sonraki case bloğuna geçirmek olabilir.
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i 3'ten küçüktür ama negatif değildir";
break;
case 3:
echo "i eşittir 3";
}
?>
default durumu özel bir durumdur. Bu durum diğer
hiçbir case ile uyuşmayan değerler için kullanılır ve
en sonda yer almalıdır. Örneğin:
<?php
switch ($i) {
case 0:
echo "i eşittir 0";
break;
case 1:
echo "i eşittir 1";
break;
case 2:
echo "i eşittir 2";
break;
default:
echo "i ne 0, ne 1 ne de 2'ye eşittir";
}
?>Bilginize: Çok sayıda
defaultkullanımıE_COMPILE_ERRORhatasını tetikler.
Bilginize: Teknik olarak
defaulten sonda olmak zorunda değildir, herhangi bir yerde olabilir. Yanızca başka bir eşleşme olmazsa kullanılır. Ancak, geleneksel olarak, son dal olarak en sona yerleştirmek en iyisidir.
Hiçbir case eşleşmezse ve default
dalı da yoksa tıpkı doğrulanmayan if deyiminde olduğu
gibi hiçbir kod çalıştırılmaz.
case değeri bir ifade olarak belirtilebilir. Ancak, bu
ifade kendi başına değerlendirilecek ve daha sonra switch
değeri ile gevşek bir şekilde karşılaştırılacaktır.
Yani, switch değeri karmaşık değerlendirmeler için
kullanılamaz. Örnek:
<?php
$hedef = 1;
$ilk = 3;
switch ($hedef) {
case $ilk - 1:
print "A";
break;
case $ilk - 2:
print "B";
break;
case $ilk - 3:
print "C";
break;
case $ilk - 4:
print "D";
break;
}
// "B" basar.
?>
Daha karmaşık karşılaştırmalarda true değeri
switch değeri olarak kullanılabilir. Veya,
switch yerine if-else
deyimleri kullanılabilir.
<?php
$konum = 1;
$ilk = 3;
switch (true) {
case $ilk - $konum === 1:
print "A";
break;
case $ilk - $konum === 2:
print "B";
break;
case $ilk - $konum === 3:
print "C";
break;
case $ilk - $konum === 4:
print "D";
break;
}
// "B" basar.
?>
İki noktalı sözdizimi switch deyimi için de
desteklenmektedir. Daha fazla bilgi için, Denetim yapıları için
diğer sözdizimi bölümünü inceleyebilirsiniz.
<?php
switch ($i):
case 0:
echo "i eşittir 0";
break;
case 1:
echo "i eşittir 1";
break;
case 2:
echo "i eşittir 2";
break;
default:
echo "i ne 0, ne 1 ne de 2'ye eşittir;
endswitch;
?>
case’ten sonraki iki nokta yerine aşağıdaki gibi
deyim sonunda noktalı virgül kullanmak da mümkündür:
<?php
switch($içecek)
{
case 'su';
case 'süt';
case 'ayran';
echo 'İyi seçim';
break;
default;
echo 'Lütfen yeniden seçiniz...';
break;
}
?>