|
PHP'de Program Denetimi
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.
İnsan olarak kararlarımızı hemen hemen
daima "bir şey öyle ise böyle, öyle değilse şöyle davranmak" üzere almaz
mıyız? PHP programında if deyimi bunu sağlar. Kelime anlamı
eğer olan if deyimi ile programımızı karar almaya zorlarız.
Ne var programımız bizim kadar akıllı olamayacağı için 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.
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 e 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.
////////////////KUTU///////////////
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.
/////////////////////////////KUTU BİTTİ///////////////
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.
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! Ama önce Browser'ın dur
düğmesinin yerinde durup durmadığna bir bakın!)
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.
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.
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.
//////////////////KUTU///////////////
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.
Şimdilik bu döngünün varlığını bir kenara yazıp, dizi değişkenlere
kadar, unutabilirsiniz.
////////////////////KUTU BİTTİ///////////////
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.
break ifadesinin döngüyü tamamen
durdurduğunu farkettiniz mi? Oysa 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.
|