MultiServis.Net //PHP El Kitabı

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>

Hata Yapilari'nin Ele Alinmasi - BOLUM 2 Yazar: Serkan Tarih: 01/03/02

Sonsuz Donguler

Yazdiginiz bir "while" dongusu kendi icerisinde kisir bir donguye donusebilir,Bu durumda php.ini dosyasinda belilenen max_execution_time degeri boyunca dongu calistirilir ve bu sure bitiminde ekrana hata mesaji yazilir.

Asagidaki kodu inceleyin ama kesinlikle calistirmayin...

$Sayac=1;
$TestDegiskeni=True;
While ($TestDegiskeni)
{
$Sayac++;
}

Yukarida iki tane degisken tanimlanmistir.Bunlardan birincisi $Sayac digeri de $TestDegiskeni 'dir.Gordugunuz gibi dongu icerisidne $TestDegiskeni degiskenin degerini degistirecek herhangi bir yapi yok.Dolayisi ile dongu ssonsuz bir calisma sureci icerisidne girmisitir...

ONEMLI : Windows makinelerde bu dongu kaynaklarin tamamini emecektir.Sonunda butun makine ve sistem kilitlenebilir.

Her zaman icin "sonsuz dongu" leri boyle orataya cikarmak ve farkina varmak mumkun olmayabilir.Bazen bu durum ozel sartlar altinda kendiliginde de olusabilir.Asagidaki kodu inceleyin,

$Sayac=100;
Do
{
$Sayac = $Sayac * $Degisken;
$Sayac--;
} While ($Sayac>0)

Yukarida acik sekilde goruldugu uzere bu dongunun sonzuza gidip gitmeyecegini $Degisken isimli degiskenimiz belirliyor...

Beklenmeyen Cikti Hatalari

Programin basarisizliga ugramasinda on buyuk etmen programcinin yaptigi mantik hatalaridir.Bunun en guncel ornegi NASA'nin yonettigi bir Mars operasyonunda kullandiklari aracin aniden yok edilmesi olmustur.
Olay incelendiginde araci yoneten programin bir kisminin "inch" sistemine bir kisminin ise "metrik" sisteme gore yazildigi ortaya cikmistir.(Bu sekilde tanimlamalar kullandigim icin ozur dilerim.Bir muhendis olarak olcme sistemlerini biliyorum ama halkin tamaminin olayi anlamasi ici bu sekilde yazdim...Sonucta "SI" yazsam kimse anlayamazdi)

Bu konu hakkindaki daha detayli bilgiyi,

http://mars.jpl.nasa.gov/msp98/news/mco990930.html

adresinden ogrenebilirsiniz...

Burada aciklamak istedigimiz bir konu bulunmaktadir.Program icinde bu tip hatalarin hepsini deneme asamasinda yakalamak imkansizdir.Ancak durum ortaya ciktigi zaman bilgi sahibi olup duzeltme sansina sahip olabilirsiniz...

Fonksiyon,hic bir deger dondurmuyor...

Eger bir fonksiyonu yazdiysaniz ve "return" ile fonksiyonun sonucunda cikan degeri dondurmediyseniz iste bu hataya sebep olursunuz.Asagida yazdigimiz kod parcasi tamamen kurallara uygundur : (inceleyin ve yazinin devaminda ne demek istedigimizi anlamaya calisin)

echo (vergi(1600,25));
function vergi ($Geliriniz,$VergiOrani)
{
$Geliriniz = $Geliriniz - (($Geliriniz/100)*$VergiOrani);
}

yukarida goruldugu uzere "return" komutunu kullanmadik.Kodumuz dogru ama sonucta fonksiyonun boylece dondurulmemis oldu.

Echo ile bu fonksiyonu cagirirsaniz ekranda kocaman bir "0" ciktisi gorursunuz.Sonuc olarak PHP'yi suclamak yerine programcilik yeteneklerinizi ve bilginizi sinamak daha dogru olacaktir.

Size PHP ile fonksyonlarin kullanimi konusunda detayli bilgi daha onceden verilmisti...

Argumentler yanlis sira ile fonksiyona gonderiliyor,geciriliyor...

echo (vergi(1600,25));
function vergi ($Geliriniz,$VergiOrani)
{
return $Geliriniz - (($Geliriniz/100)*$VergiOrani);
}

Hersey dogru ama birde fonksiyonu soyle cagirdiginizi dusunelim.

echo (vergi (25,1600));

beklediginiz sonuc sizce dogru olacakmi?

Tabiiki sonuc beklediginizden biraz farkli olacaktir.$Geliriniz olarak 25 sayisi $VergiOrani olarakta 1600 rakami fonksiyona gecirilecektir.

Kafa karistiran "atama" ve "esitlik" operatorlerinin kullanilmasi...

Ozellille "if" yapilari kullanirken yapacaginiz islemlerde eger bir esitligin varolup olmadigini sinamak istiyorsaniz mutlaka "==" operatoru kullanmalisiniz.

Asagidaki gibi yazilan ve bir esitligin olup olmamasini sinayan programimiz tamamen yanlistir

if ($kisa_kulenin_yuksekligi = 0) {
echo ("Bu yazim sekli yanlistir");
}

yukarida yapilan islemde "$kisa_kulenin_yuksekligi = 0" ile degiskene bir deger atanmistir.Onun "0" sayisina esit olup olmadigina bakilmamistir.

Daha Iyi Kod Yazma Teknikleri

Su ana kadar "hatalari" nasil ele alacaginizi ogrendiniz.Artik daha guzel ve verimli kodlama tekniklerini ele alabiliriz.

Burada anlatilan konular,yararlari anlatilamayacak kadar cok oldugu halde, halen bir cok programci tarafindan uygulanmamaktadir.Sizde onlardan bir tanesi olmayin ve kendinizi gelistirin.Burada gosterilen teknikler sizin cok daha iyi programlar yazmanizi ve verimizi arttricaklardir.

Kodlarinizi Girintili Yazin...

Daha once soylemistik simdi tekrar soyleyelim:Kodlarinizi mumkun oldugunca girintili olacak sekilde yazin.Bu hayati sizin icin daha kolay bir halke getirecektir.ornek bir kodlama teknigi asagida verilmistir.(Kullandigimiz tekniklerle ve HTML ile size bunu gostermek biraz zor oldugu icin bir program yazip onu .phps uzantili olarak servera yerlestirdik.Asagidaki linke tiklayarak burada yazilan kodun girintili seklini yani daha anlasilir halini gorebilirsiniz.sonucta PHP sizin onu nasil yazdigina degil, kodlarin islevselligine bakacaktir.Biz burada size tavsiye olarak eger bunu yaparsaniz geri donup kodlara tekrar bakinca daha okunabilir bir kod grubu bulmanizi istiyoruz)

if ($Text == "Dogru")
{
$sayi = 7;
if ($Text2 == "Dogru")
{
$sayi2= 8;
}
else
{
$sayi2 =0;
}

}

simdi bu kodlarin birde girintili sekilde yazilmis haline bakin anlasilmasi daha kolay oyle degilmi...

http://www.turk-php.com/ornekler/girintili.phps

Kodlariniza Yorum Ekleyin...

Bunu yapmak cok kolay oldugu halde cogu programci usengeclik yapip veya baska nedenlerden dolayi "yorum ekleme" uygulamasini yapmiyor.

Oysaki 15 gun sonra kendisi bile yazdigi bir kod parcasinin ne gorev yaptigini veya hangi degiskenlerin ne icin tanimlandigini hatirlayamayacak kadar beyni onu aldatabilir.

Eger kurumsal bir isletmede calisiyorsaniz bu konu cok onemlidir.Siz isletmeden ayrildiginizda yerinize gelecek olan kisi ne yapmak istediginiz anlayabilmelidir.Temiz bir dil ile yaptiginiz her islemi "programin icinde yorumlar kullanarak belirtmelisiniz"

Php icerisinde bir satir yorum eklemek icin iki tane slah isareti "//" kullanilir.

$Sure = 120; // Nukleer reaktor cekirdegi erimeden onceki uyari suresi

Yukaridaki kodlara bir de reklendirilmis ve duzenli hale getirilmis sekilde bakmak isterseniz,

http://www.turk-php.com/ornekler/girintili1.phps

veya baska bir ornek,

if ($Soru == "Fax") //Eger kullanici Fax secenegini isaretlerse.
{
.........Kodlar...Kodlar.................................
}
elseif ($Soru == "Email") //Eger kullanici Email secenegini isaretlerse.

{
.........Kodlar...Kodlar.................................
}

else // Kullanici bir sey isaretlemedi.Hic bir onay gonderme.
{
.........Kodlar...Kodlar.................................
}

Yukaridaki kodlara bir de reklendirilmis ve duzenli hale getirilmis sekilde bakmak isterseniz,

http://www.turk-php.com/ornekler/girintili2.phps

Detayli Yorum Eklemek

Eger daha detayli yorumlar eklemek istiyorsaniz, /* ve */ isaretlemesini kullanmalisiniz.Ornek vermek istersek,

/* +---------------------------------------------------------------------+
| Kontrol Fonksiyonlari Bolumu |
+---------------------------------------------------------------------+ */

function ilkfonksiyon($Parametre) {

/*
Bu fonksiyon kullanicidan gelecek bilgilerin dogrulugunu kontrol edecektir.
Yanlizca bir tek paramatere alacak ve buda emal'in dogru yazilip yazilmadiginin
kullanilacaktir.
*/

}

Olabildigince Cok Fonksiyon Kullanarak Program Yazin...

Simdiye kadar aciklanan bilgiler sizin fonksiyonlari nnasil kullanabilceginizi gostermekteydi.Sizin bu bilgilere sahip oldugunuzu kabul ediyoruz.Eger simdi ogrenmek istiyorsaniz bilgi arsivimizden "Zekice Kod Yazmak" konu baslikli serimize goz atabilirsiniz.

Programlar'inizi yazarken, yapmak istediginiz "bir islemin" programin cesitli kesimlerince devamli olarak kullanilcagini goreceksiniz.Bu sekilde tekrarlanan islemler icin bir fonksiyon tanimlayip,her ihtiyaciniz oldugunda bu fonksiyonu cagirmak cok guzel bir progranmlama teknigidir.

<?php

//Form detaylarini isle.

FormVerileriniIsle ($Isim,$Email);

//Verileri isleyecek fonksiyion tanimlaniyor...

function FormVerileriniIsle ($Isim,$Email)
{

//Yapilacak kontrol islemeleri
}

?>

Mutlaka Dosyalarinizi "Include" Ederek Kullanin

Kullanilacak bir takim genel fonksyionlari scriptin yazildigi dosyadan ayri olarak, bir baska dosya icine yazip onu her gerektiginde "include" komutu ile programimiza eklemek cok kullanilan yaygin bir yontemdir.

Mesela tum sitenin kullanacagi "header" ve "footer" tabir edilen ve web sayfasinin "bas kisimi" ve "son kisimi" icin birer fonksiyon tanimlayip yeni yaratacagimiz her sayfada bunlari,

<?php
include ("./genel.inc.php");
?>

olarak cagirmak, bizi her sayfa icin bunlari birer birer tekrardan yaratamak ve kullanmak zorlugundan kurtaracaktir.Bir defa tanimla ondan sonra onu "include" et mantigi cok kullanisli ve kolaydir.ustelik sitedeki bir bilgiyi,mesela email adresini degistirmek istediginizde gidip o dosya icindeki veriyi degistirmek yeterli olacaktir.Boylece tum site bir saniye icinde update edilmis hale gelecektir.

Mutlaka Anlamli Degisken Isimleri Kullanin...

Asagidaki kod'a bir goz gezdirin,

<?php

$a=0;
b=12;
if ($a == $b) {

$d=1;
} else {

if ($a>$b){
$tn = "Kule A";
$sn = "Kule B";
$th = $a;
$sh = $b;
}else {
$tn = "Kule A";
$sn = "Kule B";
$th = $a;
$sh = $b;
}
$d=0;
}

if ($d == 1) {
echo("Iki kulenin de yuksekligi esit");
}else {
$r = $th/$sh;
echo("Bu durumda $tn kulesi $r kat daha uzundur $sn kulesinden.");
}
?>

Ilk yazdiginizda bu sekilde anlamsiz degisken isimleri kullandiniz.1 hafta sonra kodlariniza bakinca bunu ben mi yazmistim diyeceksiniz.Hayati kendinizi icin daha zor hale getirmeyin...Programci olmanin keyfine bakin :)

Kendinize iyi bakin....

Serkan Hadi Ceylani

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>