-- PHP

Akış denetimi ve döngüler, programcı/geliştiricilerin derinlemesine bilgi sahibi olmaları gereken önemli konulardan birisidir. Zira programcı/geliştiricinin, kod yazarken kullanıcı seçimlerine bağlı muhtemel senaryoları göz önüne alarak kod içinde adeta checkpoint  noktaları oluşturması olarak tarif edebileceğimiz, program akışını denetleme çabası, kod yazım sürecinin en önemli parçalarındandır.

Bu yazımızda PHP içinde akış denetimini sağlayacak kontrol yapıları ve yine bunun bir parçası sayabileceğimiz yinelemeleri içeren döngüler hakkında size bilgi vermeyi amaçlıyoruz.

 

Kontrol yapıları

Kontrol yapıları, şartlara bağlı olarak program akışını, bir başka değiş ile programın oluşturacağı sonuçlarıdeğiştirmemizi sağlayan yapılardır. Kontrol yapılarının olmadığı bir kod, istisnaları olmakla birlikte dinamizme kapalı, statik yapılardır.

 

A-If else kontrol yapısı

PHP dilinde en bilinen ve yaygın olarak kullanılan kontrol yapısı, diğer bir çok programlama dilinden de aşina olabileceğiniz if else kontrol yapısıdır.

If kontrol yapısının söz dizimi şöyledir.

if(koşul){
//Koşul sağlandığında meydana gelecek sonuç
} else {
//Koşul sağlanamadığında meydana gelecek sonuç
}

Yukarıda gördüğünüz, parantez içine alınmış koşul, if yapısında mantıksal bir değerdir. Bu değer doğru/trueolduğunda, if satırından sonra gelen satır işletilecektir.

Bir örnek ile bu yapıya yakından bakalım.

$oturum = true;
if($oturum)
echo "Oturum açılmış...";
echo "PHP’de If kontrol yapısı...";

Kodumuzu incelediğimizde koşul ifadesinin, boolean veri tipinde mantıksal/logic bir değişken olduğunu görüyoruz. Değişken true değerini taşıdığından, koşul için aranan doğru/true olma durumu sağlanmıştır ve bu yüzden PHP çözümleyici/yorumlayıcısı, bir sonraki satıra geçerek “Oturum açılmış…” stringini echo ile çıktılayacaktır.

Burada if($oturum) satırında, oturum değişkenin değeri false olduğunda ise, PHP çözümleyici/yorumlayıcısı if yapısında yer alan koşul doğru/true olmadığı için akışa if bloğunun sonundan devam edecek ve çıktı şöyle olacaktır.

PHP’de If kontrol yapısı…

Bir başka örneğe bakalım.

$rakam = 10;
if($rakam>8)
echo "Rakam 8'den büyük...";
echo "PHP'de If kontrol yapısı...";

Kodumuza baktığımızda, koşulumuzun büyüktür “>” operatörü yardımı ile, 10 değeri atadığımız rakam değişkeninin 8’den büyük olması olduğunu görüyoruz. Dolayısı ile bu doğru/true ise PHP çözümleyici/yorumlayıcısı bir sonraki satıra geçecek ve “Rakam 8’den büyük…” stringini çıktılayacaktır. Kodu çalıştırdığımızda karşılaşacağımız çıktı

Rakam 8’den büyük…

PHP’de If kontrol yapısı…

olacaktır. Burada if($rakam>8) satırında 9’dan büyük bir rakam yazdığımızda ise, PHP çözümleyici/yorumlayıcısı if yapısında yer alan koşul doğru/true olmadığı için akışa if bloğunun sonundan devam edecek ve çıktı şöyle olacaktır.

PHP’de If kontrol yapısı…

Burada “if bloğu” demişken, süslü/küme parantez kullanımına da değinmeliyiz. PHP’de if ve döngü yapılarında, işletilmesi istenen kod satırı birden fazla olduğunda bu satırlar süslü parantezler içine alınır. Aşağıdaki örnekte olduğu gibi.

if($rakam>8) {
echo "Rakam 8'dan büyük...";
echo "İşletilmesini istediğimiz satır sayısı birden fazla olduğu için, bu satırları süslü parantez içine aldık...";
}

Önceki örneğimize geri dönersek, örneğin koşul satırının if($rakam>10) şeklinde değiştirilmesi halinde, PHP çözümleyici/yorumlayıcısının if yapısında yer alan koşul doğru/true olmadığı için akışa if bloğunun sonundan devam edeceğini belirtmiştim. İstenen koşul doğru olmadığında gerçekleşmesini istediğimiz işlemler olabilir, işte böyle durumlarda if yapısı içinde else deyimi kullanılır.

if($rakam>10)
echo "Rakam 10'dan büyük...";
else
echo "Rakam 10'dan büyük değil";

If yapısı içinde, birden fazla koşulu sınayabileceğimiz gibi, birden fazla if satırı da kullanabiliriz.

$rakam = 9;
$durum = "Geçerli";
if($rakam > 10 && $durum=="Geçersiz")
echo "Rakam 10'dan büyük, durum geçersiz...";
else if($rakam < 10 && $durum=="Geçersiz")
echo "Rakam 10'dan küçük, durum geçersiz...";
else if ($rakam < 10 && $durum=="Geçerli")
echo "Rakam 10'dan küçük, durum geçerli...";
else
echo "Aranan şartların hiçbirisi doğru/true değil...";

Öncelikle kodumuzda birden fazla if satırı için “else if” söz diziminin kullanıldığına dikkat çektikten sonra, bu if satırlarında birden fazla koşulu “&&Ve/And operatörü ile kullandığımızın altını çizelim. Adından da anlaşılacağı üzere Ve/And operatörü, solunda ve sağında yer alan koşulların doğru/true olmasını istediğimiz durumlarda kullanılır. Bu yüzden örneğin if($rakam>10 && $durum==”Geçersiz”) satırı, rakam değerinin 10’dan büyük Ve/And durum değişkeninin değerinin de “Geçersiz” olmasını koşul olarak sunmaktadır.

Kod içinde yaptığımız atamalar açısından Ve/And operatörünün solu ve sağında yer alan koşulların doğru/true olduğu ilk satır else if ($rakam < 10 && $durum==”Geçerli”) satırı olduğundan, PHP yorumlayıcı/çözümleyicisi bu satırdan sonraki satırı işletecek, ardından kodun işleyiş/akışı if bloğundan sonra devam edecektir.

Burada “koşulların doğru/true olduğu ilk satır” ifadesine de dikkatinizi çekmek istiyorum. Aynı if bloğunda birden fazla doğru/true if satırı yer alırsa, PHP yorumlayıcı/çözümleyicisi doğru olan ilk if satırından sonra gelen ve işletilmesi istenen satır(lar)ı çalıştıracak, ardından işleyiş/akış if bloğunun sonrası ile devam edecektir.

$rakam = 9;
$durum = "Geçerli";
if($rakam<10 And $durum="Geçerli") //Gördüğünüz gibi && operatörünü And olarak da kullanabilirsiniz
echo "Rakam 10'dan küçük, durum geçerli...";
else if(20 < 40)
echo "PHP yorumlayıcı/çözümleyicisi, bu satırı işletmeyecektir...";

Bu noktada if kontrol yapısı ile sıklıkla kullanılan “||” Veya/Or ile, “!” Değil/Not operatörlerinin kullanımlarından da örnekler verelim.

$rakam = 9;
$durum = "Geçerli";
if($rakam>10 || $durum=="Geçersiz")
echo "Rakam 10'dan büyük, durum geçersiz...";
else if($rakam < 10 || $durum=="Geçersiz")
echo "Rakam 10'dan küçük yada durum geçersiz...";
else if ($rakam < 10 || $durum=="Geçerli")
echo "Rakam 10'dan küçük, durum geçerli...";
else
echo "Aranan şartların hiçbirisi doğru/true değil...";

Kodumuzu çalıştırdığımda “Rakam 10’dan küçük yada durum geçersiz…” çıktısı ile karşılaşacağız, çünkü else if($rakam < 10 || $durum==”Geçersiz”) satırında koşullardan birisi doğru/true durumdadır. Buradan da anlaşılacağı üzere Veya/Or operatörünün solunda yada sağında yer alan ifadelerden birisi doğru/true ise, if koşulu doğru/true olmakta ve PHP yorumlayıcı/çözümleyicisi sonraki satırı işletmektedir.

Lütfen Değil/Not operatörünün kullanımına dair aşağıdaki örnekleri inceleyin.

$onay = true;
if(!$onay)
echo "Onay yok...";
else
echo "Onay sağlanmış..."; //Onay sağlanmış stringi çıktılanacaktır
$x = 20;
$y = 10;
if(!(($x-$y)<9))
echo "Sonuç 9'dan küçük değil..."; //Bu ifade çıktılanacaktır
$x = 20;
$y = 19;
if(!(($x-$y)<9))
echo "Sonuç 9'dan küçük değil..."; //Bu satır çalıştırılmayacaktır

PHP içinde kullanılan diğer operatörlerden bazıları.

  • ==  eşitse/equal
  • !=  eşit değilse/not equal
  • <>  eşit değilse/not equal
  • <   küçükse
  • >  büyükse
  • <=  küçük veya eşitse
  • >=  büyük veya eşitse

 

B-Switch case kontrol yapısı

Switch case yapısı, kullanım şekil ve mantığı açısından if yapısına benzemektedir.  Bu benzerliği bir değişkeni  birden çok değerle karşılaştırmak ve bu karşılaştırmanın sonucununa bağlı olarak, istenen kod parçasını çalıştırmak olarak tarif edebiliriz.

Bir örnek üzerinden switch yapısı ele alalım.

$kategori = 3;
switch($kategori){
case 1:
echo "Seçilen kategori 1";
break;
case 2:
echo "Seçilen kategori 2";
break;
case 3:
echo "Seçilen kategori 3";
break;
case 4:
echo "Seçilen kategori 4";
break;
}

Kodu çalıştırdığımızda elde edeceğimiz çıktı.

Seçilen kategori 3

Kod içinde gördüğünüz kullanımdan anlaşılacağı üzere switch case yapısı PHP yorumlayıcı/çözümleyicisi tarafından satır satır/deyim deyim ele alınır.

PHP yorumlayıcı/çözümleyicisi, switch deyimiyle birlikte verilen değişken yada değer(evet, switch deyimiyle doğrudan değer de kullanabilirsiniz, örneğin switch(2) gibi) ile uyuşan ilk case deyimini bulduğunda, case deyimi sonrasında yer alan satırları çalıştırır, ta ki break komutunu görene kadar.

Buradan da anlayacağınız üzere break deyimi akış kontrolünü kırar ve akışın, switch bloğundan sonra devam etmesini sağlar. PHP yorumlayıcı/çözümleyicisi eğer bir break komutu göremezse, switch bloğu sonlanana kadar bütün satırları çalıştırır.

switch($kategori){
case 1:
echo "Seçilen kategori 1";
break;
case 2:
echo "Seçilen kategori 2";
break;
case 3:
echo "Seçilen kategori 3";
case 4:
echo "Seçilen kategori 4";
break;
}

Kodu çalıştırdığımızda karşılaşacağımız çıktı.

Seçilen kategori 3
Seçilen kategori 4

PHP yorumlayıcı/çözümleyicisi case 3: satırına geldiğinde, switch deyimine verilen değişken ile aynı durumu yakaladığından, bu satırdan sonra gelen echo satırını çalıştırmış, ancak bir break komutu ile karşılaşmadığından sonraki case satırını da, switch deyimiyle verilen değişken ile aynı durumda olmamasına rağmen çalıştırmıştır. Burada akılda tutulması gereken husus, PHP yorumlayıcı/çözümleyicisinin case satır bloklarını, switch deyimiyle verilen değişken/değer ile aynı durumda olan case satırından sonra çalıştırmaya başlayacağıdır.

Case deyimine string ve sayı(integer/float) tipinde değişken ve değerler atayabilirsiniz.  Yine her case bloğu kod içermek zorunda değidir, örneğin aşağıdaki kod bize “Seçilen kategori 3” çıktısını verecektir.

switch($kategori){
case 1:
case 2:
case 3:
echo "Seçilen kategori 3";
case 4:
echo "Seçilen kategori 4";
break;
}

Burada ilk iki case deyimi, denetimi bir sonraki case deyimine aktarma fonksiyonu görmüştür. Son olarak, durumu hiçbir case ile uyuşmayan değişken/değerler söz konusu olduğunda uygulanması istenen kod blokları için kullanılacak default durumunu örneklendirelim.

switch($kategori){
case 1:
echo "Seçilen kategori 1";
break;
case 2:
echo "Seçilen kategori 2";
break;
case 3:
echo "Seçilen kategori 3";
case 4:
echo "Seçilen kategori 4";
break;
default:
echo "Seçilen kategori 1 ile 4 arasında değil..."; //$kategori değişkeninde 1'den küçün yada 4'denbüyük bir değer depolandığında bu string çıktılanacaktır
}

 

Döngüler

Döngüler, belirli kurallar dahilinde yinelenmesi istenen kod bloklarının çalıştırılmasını sağlayan son derece fonksiyonel, yararlı, geliştirici dostu araçlardır 🙂

Bir önceki yazımızda ele aldığımız kodcu.com’da yer alan makale kategorilerini listeleme örneği hartırlayacak olursak, döngülerin önemini daha iyi kavrayabiliriz.

 

A-For döngüsü

For döngüsü, diğer dillerde olduğu gibi muhtemelen PHP içinde de en sık kullanılan döngüdür. For döngüsü söz dizimi

for (ifade1; ifade2; ifade3)
//yinelenmesi istenen kod bloğu

şeklindedir. İşleyişi yine bir örnek üzerinden anlamaya çalışalım.

for($i=0; $i<5; $i++)
echo "$i.kez çalıştırılıyor";

Kodumuzun çıktısı şöyle olacaktır.

0.kez çalıştırılıyor
1.kez çalıştırılıyor
2.kez çalıştırılıyor
3.kez çalıştırılıyor
4.kez çalıştırılıyor

Şimdi kodumuzu adım adım inceleyerek, for döngüsünün çalışma mantığını anlamaya çalışalım.

  • 1.Adım: For döngüsünde gördüğümüz ilk ifade, bir defaya mahsuz koşulsuz olarak çalıştırılır. Yani $i=0; ataması mutlaka gerçekleşecektir. Dolayısıyla birinci adımda i değişkenine 0 değeri atanmıştır.
  • 2.Adım: İkinci deyime gelindiğinde PHP yorumlayıcı/çözümleyicisi, ifadenin doğru/true olup olmadığına bakacaktır. Bu aşamada i değişkeni değeri 0 olduğundan $i<5 ifadesi doğru/true dur ve bu döngüye devam edileceği anlamına gelmektedir. Aksi yani yanlış/false durumunda akış, for döngüsünden sonra devam edecektir.
  • 3.Adım: Üçüncü deyim, for döngüsünün her yinelemesinde çalıştırılacağından, başlangıçta bu deyim çalıştırılmaz. Bunu kodumuzun çıktısında ilk sırada gördüğünüz “0.kez çalıştırılıyor” stringinden anlamanız mümkün. Üçüncü deyim her yinelemede çalıştırılacak ve ++ operatörü ile i değişkeninin değeri 1 artırılacak, ardından for döngüsü içinde yinelenmesi istenen kod satır(lar)ı çalıştırılacaktır.

Bu üç adımlı akış, 2. adımda yanlış/false durumu meydana gelene kadar devam edecektir. Bu durum da i değişkeninin 5 değerine ulaşması sırasında meydana geldiğinden, kodumuzun son yinelenme anında çıktıladğı metin “4.kez çalıştırılıyor” olmuştur. Yani toplamda döngümüz içinde yinelenmesini istediğimiz kod, 5 kez çalıştırılmış/yinelenmiştir.

For döngülerinde, tıpkı if bloklarında olduğu gibi, işletilmesini istediğimiz kod satırı birden fazla ise, bu satırları süslü/küme parantez içine alırız. For döngüsü içinde, switch case yapısında gördüğümüz break komutunu, aynı amaçla kullanabiliriz.

for($i=0; $i<20; $i++){
if($i==3)
break;
echo "$i.kez çalıştırılıyor";
}
echo "Döngüden çıktık...";

Bu örnekte, 3.yinelemede i değişkeni 3 değerine ulaşmış olacağından break satırı ile for döngüsü kırılacak ve program akışı, döngüden sonrasıyla devam edecektir. Çıktımız şu şekilde olacaktır.

0.kez çalıştırılıyor
1.kez çalıştırılıyor
2.kez çalıştırılıyor
Döngüden çıktık…

 

B-Foreach döngüsü

Bir önceki yazımızda diziler’i ele alırken gördüğümüz foreach, diziler üzerinde yineleme yapmayı kolaylaştıran ve yanlız diziler ile kullanılabilen bir yineleme değimidir.

İki ayrı söz dizimi şu şekildedir.

foreach (dizi_ifadesi as $değişken)
//yinelenmesi istenen kod bloğu
foreach (dizi_ifadesi as $isim => $değişken)
//yinelenmesi istenen kod bloğu

Yine örnekler üzerinden işleyişe yakından bakalım.

$isimler = array("Ahmet", "Mehmet", "Ayşe", "Fatma");
foreach ($isimler as $uyeler)
echo $uyeler;
foreach ($isimler as $uyeler => $deger)
echo $deger;

Yukarıda gördüğünüz her iki kullanım da aynı çıktıyı üretir. Koddan anlaşılacağı üzere, foreach yapısı, dizi değişkeni üzerinde bir döngü oluşturarak, her yinelemede sırası gelen dizi elemanını belirlediğimiz(örneğimizde uyeler değişkeni) değişkene atar ve dizi göstergesini, yani dizi içinde okunacak dizi elemanını gösterir işaret noktasını bir artırır. Böylelikle bir sonraki yinelemede, belirlediğimiz değişkene, bir sonraki dizi elemanı atanmış olacaktır.

 

C-While döngüsü

While döngüsü söz dizimi şu şekildedir.

while (ifade)
//yinelenmesi istenen kod bloğu

While döngüsünün çalışma prensibi, kendisine verilen ifade doğru/true olduğu sürece, yinelenmesi istenen kod satırlarını yinelemkten ibarettir. Bir örnek ile buna bakalım.

$derece = 20;
while ($derece <= 40) {
$derece++;
echo "Sıcaklık: ".$derece";
}

Kodumuzu çalıştırdığımızda çıktılanan son ifade “Sıcaklık: 41” olacaktır, çünkü son yinelemede, while satırında $derece <= 40 kontrolünde derece değişkeni 40 idi ve dolayısıyla ifade hala doğru/true idi. Yinelenerek çalıştırılan kod bloğu içinde biz derece değişkeninin değerini bir artırdık ve ifademizi çıktıladık. Sonrasında $derece <= 40 ifadesi yanlış/false olduğundan akış, while döngüsünden sonrasına devredildi.

 

D-Do while döngüsü

While döngüsüne çok benzeyen do while döngüsünün işleyici, while döngüsünün aksine, kendisine verilen ifadenin doğruluk sınamasını döngünün sonunda yaparak gerçekleşmektedir. Bir örnek ile bu farkı gösterelim ve yazımızı noktalayalım.

$derece = 30;
do {
$derece++;
echo "Sıcaklık 40 dereceyi geçemez, şu an sıcaklık: ".$derece;
} while ($derece <=40);

Kodumuzu çalıştırdığımızda çıktılanan son ifadenin “Sıcaklık 40 dereceyi geçemez, şu an sıcaklık: 41” olduğunu görüyoruz. Bu çuvallamanın sebebi, do while döngüsünde doğrulama sınamasının döngünün sonunda yapıldığı gerçeğini ıskalamaktır 🙂

Döngü içinde derece değişkeni 1 artırılıp 40 değerinin üzerine çıkmadan önce, yani bir önceki yinelelemede değişken değeri 40 olduğundan $derece <=40 ifadesi doğru/true idi ve bu sebeple döngü birkez daha yinelendi ve döngü içinde derece değişkeni 40 değerini aştı. Bu iki örnek ile while ve do while döngülerinde neye dikkat edilmesi gerektiği ve bu iki döngünün hangi ihtiyaçlara cevap verebileceğini kısaca anlatabildiğimi umuyorum…

Kaynak:
https://blog.kodcu.com/2011/04/phpde-akis-denetimi-ve-donguler/

İlgili Yazılar

Yorum Yaz

Yorum