(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
switch
ile uygulanabilir vebreak
ile benzerlik gösterir. Bir döngü içerisindeswitch
kullandıysanız ve kodun yürütülmesine dıştaki döngünün sonraki yinelemeden devam etmesini istiyorsanız,continue 2
kullanabilirsiniz.
Bilginize:
switch
vecase
gevş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
default
kullanımıE_COMPILE_ERROR
hatasını tetikler.
Bilginize: Teknik olarak
default
en 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;
}
?>