Bilgisayar programı, belirli değerlere göre kendi
izleyeceği yolu kendisi bulmalıdır. Bir Web programı da aynı mantıkla
tasarlanır. PHP, bir kısmını daha önceki bölümlerde, bir kısmını da şimdi ele
aldığımız araçları kullanarak, belirli durumlarda belirli istikametlere gidecek,
yeri geldiğinde geri dönecek, yeri geldiğinde başka bölümlere sıçrayacak bir
akış planı tasarlamamıza imkan verir.
Web programlarımızda, ziyaretçilerimizin sitemizde
yaptıkları veya yapmak istediklerini bildirdikleri işe göre sayfalar, bu işlere
göre sayfa içerikleri sunarız. Web programımız ziyaretçimizin hareket tarzına ve
amacına uygun olarak ilerler. Bir programın akış planını kontrol etmemizi
sağlayan unsurlar çoğu zaman programın kendi kendine karar vermesini sağlayan
araçlardır. PHP'de program denetim unsurları, programın gidiş yönünü
değiştirmemizi veya olduğu yerde durmasını ve beklemesini veya bir işi biteviye
yapmasını sağlar. Bu bölümde bu araçları ele alacağız.
if Deyimi
Kelime anlamı eğer olan if deyimi ile
programımızı karar almaya zorlarız. if şartının doğru veya yanlış olması
durumunda ne yapacağını da ona biz söyleriz. if deyimi şöyle yazılır:
if ( koşullar )
{
koşullar doğru ise yapılacak işlere ilişkin komutlar
}
elseif (diğer koşullar)
{
diğer koşullar doğru ise yapılacak işlere ilişkin komutlar
}
else
{
diğer her durumda yapılacak işlere ilişkin komutlar
}
PHP, if ifadesinin doğru olması halinde, ifadeye
ait ilk süslü parantezin içindeki komutları icra eder; bu şartlar doğru değilse,
elseif deyimi ile ileri sürebileceğimiz diğer bir grup şartın doğru olup
olmadığını sınayabiliriz. Bu şartlar yerine geliyorsa, PHP, elseif bölümündeki
işleri icra eder. Nihayet diğer her hangi bir durumda icra edilmesini
istediğimiz komutları else bölümünde belirtiriz. PHP, if deyimi doğru değilse,
deyime ait süslü parantezin içindeki işleri yapmadan yoluna devam eder; varsa
elseif deyiminin şartlarını sınar; elseif bölümü yok fakat else bölümü varsa bu
bölümdeki işleri icra eder. Deyimde else bölümü de yoksa, PHP yoluna if
deyiminden sonraki ilk adımdan devam eder. Bunu bir örnekle belirtelim:
<?php
$sarki = "Güneş Doğacak";
if ( $sarki == "Güneş Doğacak" )
{
echo ("Seçtiğiniz şarkının adı: Güneş Doğacak!");
}
elseif ($sarki == "Beklerim Ben")
{
echo ("Seçtiğiniz şarkının adı: Beklerim Ben!");
}
else
{
echo ("Lütfen bir şarkı seçiniz!");
}
?>
Çoğu zaman if deyimlerini birden fazla koşulu
sınayacak şekilde yazarız; bununla birlikte elseif ve else bölümleri olmadan da
yazılabilir:
<?php
if ( $parola == "" )
{
echo ("Sitemize girmek için parola yazmanız gerekir.<br>");
echo ("Lütfen parolayı yazın! <br>");
}
?>
Buradaki if deyimi $parola değişkeninin boş
alfanümerik olması halinde ziyaretçiyi uyarak ve görevi bitecektir. Ziyaretçi
bir parola yazmışsa, daha sonraki komutlar bu parolanın doğru olup olmadığını
sınayabiliriz.
switch Deyimi
PHP'de program akışını yönlendirmekte
kullandığımız bir diğer unsur, switch deyimidir. Adı anahtar anlamına gelen
switch deyimi, verilen bir değişkenin değerinin sıraladığımız koşullardan
hangisine uygun olduğunu sınar ve o koşula ilişkin komutları icra eder. PHP'nin
yaptığı işi bitirdikten sonra switch deyiminin dışına çıkmasını sağlayan, break
komutu vardır:
switch ( değişken )
{
case KOŞUL-1 ;
Koşul-1 doğru ise yapılacak işlere ilişkin komutlar
break;
case KOŞUL-2 ;
Koşul-2 doğru ise yapılacak işlere ilişkin komutlar
break;
case KOŞUL-3 ;
Koşul-3 doğru ise yapılacak işlere ilişkin komutlar
break;
case KOŞUL-4 ;
Koşul-4 doğru ise yapılacak işlere ilişkin komutlar
break;
......................
......................
default:
diğer her durumda yapılacak işlere ilişkin komutlar
}
switch deyimini yazarken mutlaka break ifadesini
kullanmamız gerekmez; switch deyiminin akışı break ile kesilmemişse, program ilk
şart yerine gelmiş olsa bile diğer şartları da sınamaya devam eder ve en sondaki
default deyimine ulaşarak (default'tan sonra noktalı virgül değil iki nokta
üstüste işareti olduğuna dikkat edin), bu bölümdeki komutları icra eder. Ne var
ki programcılık mantığına aykırı olabilir: bir değişkenin içeriği verdiğimiz
şartlardan birini tutmuşsa, muhtemelen diğer şartları yerine getirmeyecek
demektir. Bu durumda diğer koşulların sınanması gereksiz, default işlerin icra
edilmesi ise hata olur. Bu deyimi de bir örnekle görelim:
switch ( $sarki )
{
case "Güneş Doğacak" ;
echo ("Seçtiğiniz şarkının adı: Güneş Doğacak<br>") ;
break;
case "Derdime Derman" ;
echo ("Seçtiğiniz şarkının adı: Derdime Derman<br>") ;
break;
case "Haberi Yok" ;
echo ("Seçtiğiniz şarkının adı: Haberi Yok<br>") ;
break;
case "Sonsuza kadar" ;
echo ("Seçtiğiniz şarkının adı: Sonsuza kadar <br>") ;
break;
default:
echo ("Seçtiğiniz şarkının adı bilinmiyor<br>") ;
}
Programımız, bu kodu icra ederken, $sarki adlı
değişkenin değerini, buradaki dört isimle karşılaştıracaktır. Şarkının adı,
"Güneş Doğacak" ise ilk durum gerçekleşmiş olacak; program Browser pencerisine
şarkının adını yazacak (ve muhtemelen bu sözlerini görüntüleyecek!) ve ikinci
adıma break ifadesine geçecektir. break, switch deyiminin sona ermesini sağlar;
PHP yoluna, switch deyiminin kapanan süslü parantezinden sonra devam eder. Bu
örnekte break ifadesi kullanılmamış olsaydı, PHP, diğer şartları da sınacak ve
boşun azaman kaybedecekti; daha da garibi, en sondaki default komutu da icra
edileceği için programımız Browser pencerisine hem seçilen şarkının adını, hem
de "Seçtiğiniz şarkının adı bilinmiyor" yazacaktı. Bunu gözönünde tutarak,
switch deyimini daima break ile birlikte yazmamız gerekir.
switch için kısa yol
Kimi zaman uzun uzadıya switch deyimi yazmamız
gerekmeyebilir; bir değişkenin değerini sadece bir şarta uygunluk açısından
sınamamız gerekir. Bunu soru ve iki nokta üstüste işaretleri (? ... :) olarak
yazılan işlemci ile yaparız. Diyelim ki, Web sitemizi ziyaret eden kişinin
parola yazıp yazmadığını sıramak istiyoruz:
<?php
$uyari = ($parola == "" ) ? "Parola yazmanız gerekir" : "Teşekkür ederiz" ;
echo ($uyari);
?>
Bu kod parçacığı, ziyaretçinin parola girip
girmediğini $parola değişkeninin içinin boş olup olmadığına bakarak anlayacak ve
$parola değişkenin içi boş ise (yani soru işaretinin sorguladığı durumun doğru
olması halinde) iki nokta üstüskte işaretinden önceki metni $uyarı değişkenin
içeriği haline getirecek; $parola değişkeninin içi dolu ise (yani koşul yerine
gelmiyorsa, durum yanlış ise) iki nokta üstüste işaretinden sonraki metni $uyarı
değişkeninin içeriği yapacaktır. Bir sonraki echo() komutu ise içeriği bu sınav
sonucuna göre belirlennen $uyarı değişkeninin değerini Browser penceresinde
görüntüleyecektir.
Döngüler
Yukarıdaki iki denetim ögesi de programın ileri
doğru akışını bozmayan araçlardır. Oysa bazen programımızın bir koşul
gerçekleşincele kadar yerinde sayması ve koşul gerçekleşmedikçe ilerlememesi
gerekebilir. Kimi zaman da programımıza bir işi bitirmeden ileri gitmemesini biz
bildiririz. Program akışının bu tür denetimini döngü deyimleri sağlar. PHP'de
iki tür döngü vardır: bir durum devam ettiği veya etmediği sürece yapılan ve kaç
kere tekrar edeceği bilinemeyen while döngüleri ve tekrar sayısı belirli for
döngüleri.
While döngüsü
Bir değişkenin içeriğinin belirli bir şartı
karşılaması veya karşılamaması halinde icra edilir. Burada dikkat edeceğimiz
nokta, programın icrası sırasında değişkenin içeriğinin veya koşulun
değişmesinin sağlanmasıdır. Aksi taktirde pıgramımız sonsuz döngüye girer ve
muhtemelen çöker. while döngüsü şöyle yazılır:
while (koşul)
{
Koşul doğru ise yapılacak işlere ilişkin komutlar
}
Bu yöntemin yaygın kullanıldığı alan, bir sayaçla
yaptırılan işlerdir. Aşağıdaki programı while.php adılma kaydedip,
çalışrırsanız, PHP, Browser'ın yazı türü boyutunu 1'den 7'ye kadar büyüterek,
aynı metni yazdıracaktır:
<HTML>
<HEAD>
<TITLE>PHP'de Döngü</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
$sayac = 1;
while ( $sayac <= 7 )
{
print ("<font SIZE= $sayac >");
print ("<b><p>İyileri iyilikleri ile alkışlayınız!</b></p>");
print ("</FONT>");
$sayac ++;
}
?>
</BODY>
</HTML>
Programımız, while döngüsü içindeki iken, sonsuz
döngüden kurtulabilmek için, yazıyı yazdırdıktan sonra, $sayac değişkenini bir
arttırıyor. Aksi taktirde, değişken hiç bir zaman while döngüsünün beklediği
şarta kavuşarak 7'ye eşit hale gelemeyecektir. (Programı, sondaki "$sayac ++;"
satırını kaldırarak denerseniz, zararsız bir sonsuz döngünün ne olduğunu
görebilirsiniz).
while döngüsün aradığı şartın yerine gelmesi, her
zaman burada olduğu gibi, tabir yerinde ise "elle" yapılmaz; döngünün icra
ettiği komutlar veya fonksiyonlar koşulu içeren değişkeni değiştirebilirler.
Sözgelimi elektronik ticaret sitemizde Web ziyaretçimizin while içinde yaptığı
alışverişin tutarını koşul olarak kullanabiliriz ve bu koşulu içeren değişken
alışveriş ile değişebilir.
Do..while Döngüsü
while döngüsü farkettiğiniz gibi, ileri sürdüğümüz
şartı, iyi yapmadan önce sınar; ve bu şart ortadan kalkmamışsa (yani henüz
doğru/true ise) yapacağı işi yapar; başka bir deyişle while döngüsünün yapacağı
iş hiç yapılmayabilir. Fakat sınamanın iş yapıldıktan sonra yerine getirildiği
bir şekli de vardır: do..while. Bu döngü ise şöyle yazılır:
do
{
Koşul doğru ise yapılacak işlere ilişkin komutlar
} while (koşul);
Burada gördğünüz gibi do..while döngüsü en az bir
kere icra edilir; çünkü şartın sınanması yapılacak işe ilişkin komutlardan sonra
gelmektedir. Bu döngünün aradığı şartın döngünün yaptığı işlerin sonucu veya kod
bölümünde bizim tarafımızdan gerçekleştirilmesi için igerekli komutların
bulunmasına dikkat etmelisiniz. Yoksa, bu döngü de sonsuzluğa erişir! Yukarıda
örneği, bu yöntemle yazalım:
<?php
$sayac = 1;
do
{
print ("<font SIZE= $sayac >");
print ("<b><p>İyileri iyilikleri ile alkışlayınız!</b></p>");
print ("</FONT>");
$sayac ++;
} while ( $sayac <= 7 ) ;
?>
Bu döngüyü yazarken, while satırının sorunda
noktalı virgül bulunduğuna dikkat edin.
For döngüsü
PHP'de Web programlarımız, döngünün belirli bir
sayıda olmasını ve mesela bu sayının bizim istediğimiz basamaklarda artmasını
gerektiriyorsa, döngüyü for deyimiyle kurabiliriz. Ayrıca for deyimi sayaç gibi
şartın yerine gelmesini sağlayacak arttırma veşa eksiltme işlemlerini kendisi
yapacağı için, sonsuz döngüye girme tehlikesi de hemen hemen yoktur. Bu döngü
şöyle yazılır:
for ( $yeni_degisken atama ; koşul ; artış basaması )
{
Koşul doğru ise yapılacak işlere ilişkin komutlar
}
for deyiminin ilk ögesi, döngü sayacı olarak
kullanılacak bir değişken oluşkturulması ve buna değer atanmasına ilişkindir;
sonra bir noktalı vrigül ile bu sayacın sınırı olan koşul belirtilir. Yine
noktalı virgül ile ayırarak, sayaç değişkeninin artış hızı verilir. Bunu da yine
yukarıdaki örnekle gösterelim:
<?php
for ($sayac = 1; $sayac <= 7 ; $sayac++ )
{
print ("<font SIZE= $sayac >");
print ("<b><p>İyileri iyilikleri ile alkışlayınız!</b></p>");
print ("</FONT>");
}
?>
Buradaki kod, while ve do..while göre çok daha kısa; ve
while döngüsü sayacı arttırmayı sağlayan satır unutulsa bile çalışacağı halde,
for döngüsü unsurlara ilişkin noktalı virgüller eksik olursa çalışmayacak ve
bize böylece sonsuz döngü tehlikesini hatırlatmış olacaktır. for döngüsü kendi
sayacını verdiğiniz şartı karşılayıncaya kendisi arttıracak, yani buradaki
örneği göre $sayaç değişkeni 7 oluncaya kadar çalışacak ve şart karşılandığı
anda, sona erecektir.
Foreach Döngüsü
PHP'nin programcıya çok kolaylık sağlayan bir
diğer döngüsü, foreach döngüsüdür. Ancak bir değişkenin bütün elemanlarını
tekrar sayısında esas alan bu döngünün çalışma ilkelerini görebilmek için dizi
değişken kavramını ele almış olmamız gerekiyor. Bu döngüyü dizi değişkenlerden
sonra göreceğiz.
Döngüyü sona erdirmek için: break
Programımızın akışı, bazen döngünün durdurulmasını
gerektirir. Örneğin, sayaç değişkenini ziyaretçinin vermesi gerektiği ve
vermediği durumda, döngünün başlamaması yerinde olur. Programın gerektirdiği
böyle bir sebeple döngüyü break komutuyla durduruz.
Sözgelimi aşağıdaki kodda kullandığımız $tekrar
değişkenini değerini ziyaretçiden form yoluyla aldığımızı varsayalım:
<?php
$tekrar = 10 :
for ($sayac = 1; $sayac <= $tekrar ; $sayac++ )
{
if ( $tekrar <= 0 ) break;
print ("<font SIZE= $sayac >");
print ("<b><p>İyileri iyilikleri ile alkışlayınız!</b></p>");
print ("</FONT>");
}
?>
Bu kod parçasını, bir sayfa kodunun içine
yerleştirir ve önce bu şekliyle, danha sonra $tekrar= 0 yazarak sınarsanız,
break komutunun işe yaradığını göreceksiniz. ($tekrar değişkeninin değerini,
Form yoluyla ziyaretçiden değişken değeri almayı öğreninceye kadar şimdilik
kaydıyla biz yapıyoruz. Ayrıca buradaki if deyiminin süslü parantez olmadan
yazıldığına dikkat edin.
Döngüyü sürdürmek için: continue
Programımızın akışı, kimi zaman da döngünün
sadece belirli bir durumda kendisinden beklenen işi yapmamakla birlikte böyle
tümüyle kesilmesini de gerektirmez. Yine yukarıdaki örneğe dönersek, sayaç
değişkenini ziyaretçinin vermesi gerektiği ve vermediği durumda, döngünün
tümüyle kesilmesini değil de, sadece sayacı gösteren $sayac değişkeninin
sıfırdan büyük bir değere ulaşlmasını beklememiz yerinde olabilir. Bu
devamlılığı continue komutuyla sağlarız:
Yine bu örnekte kullandığımız $sayaçc değişkeninin değerini
ziyaretçiden form yoluyla aldığımızı varsayarak, kodu şöyle değiştirebiliriz:
<?php
$sayac = -5 :
for (; $sayac <= 7 ; $sayac++ )
{
if ( $sayac <= 0 ) continue;
print ("<font SIZE= $sayac >");
print ("<b><p>İyileri iyilikleri ile alkışlayınız!</b></p>");
print ("</FONT>");
}
?>
Bu durumda PHP, conktinue komutunu gördüğü anda
for döngüsünün geri kalan kısmını icra etmek yerine başa dönecek ve döngüyü
yeniden icra etmeye başlayacaktır. Döngünün ilk satırınnda kod parçasını, bir
sayfa kodunun içine yerleştirir ve önce bu şekliyle, danha sonra $sayac= 1
yazarak sınarsanız, continue komutunun programı sayaç değişkeninin değeri 1
oluncaya kadar durdurduğunu ama bu sırada for döngüsünün devam ettiğini
göreceksiniz. ($sayac değişkeninin değerini, Form yoluyla ziyaretçiden nasıl
alacağımızı daha sonra göreceğiz.)
Buraya kadar, PHP programı oluşturabilmek için
gerekli temel yazım kurallarını, yapıtaşlarını ve program akışında
yararlanacağımız kontrol ögelerini ele almış olduk. Şimdi bu unsurların hepsini
bir arada kullanabileceğimiz grupları, fonksiyonları ele alabiliriz.