Dizi-Değişkenler, Nesneler
PHP'de, diğer programlama dillerinde olduğu gibi, kullandığımız bilgileri, verileri
değişken adını verdiğimiz kaplarda tuttuğumuzu biliyoruz. Bu kaplarla ne işler
yapabileceğimizi de gördük. Fakat bu kapların sadece bir birim bilgi tuttuğunu farketmiş
olmalısınız. Oysa programlarımızda genellikle, sözgelimi "öğrencilerin adları" dediğimiz
zaman yüzlerce ismi tutabilen kaplara ihtiyacımız olur. Aksi taktirde, öğrenci sayısı kadar
değişken oluşturmamız gerekir ki, bu durumda değişken oluşturma zahmetinden
vazgeçmek daha uygun olur; öğrencilerin isimleri, değişkene koymadan da kullanabiliriz.
İşte, bu tür, bir grup bilgili topluca tutan değişkenlere dizi-değişken (array) denir; ve
program boyunca işe yarayan değişken türü de budur.
PHP'nin diğer bir çok dilden farkını sağlayan bir özelliği, büyük ölçüde dizi
değişkenlere dayanan, içinde kendi değişkenleri ve kendi fonksiyonları olan nesne (object)
oluşturma imkanına sahip bulunmasıdır. Bu açıdan PHP, nesne-yönelimli (Object-oriented)
diller grubuna girer. Nesne oluşturmak ve kullanmak, bu yönteme alışık olmayan
programcılar için önceleri çok zor görünür. Ancak bir kere nesne ile programlamanın özünü
kavrayanların bir daha kolay kolay nesne fikrinden vazgeçtikleri de görülmemiştir.
Dizi Değişkenler
Dizi değişkenden ayrıntılı söz edebilmek için önce tipik bir dizi-değişkende neler
olduğuna bakalım. Sözgelimi, verdiğiniz "PHP ile Programlama" kursundaki öğrencilerinizin
listesi şöyle olabilir:
Öğrenci No Adı Soyadı S ınav-1 Sınav-2 Not
1 Özbay Altun .. .. ..
2 Muharrem Taç .. .. ..
3 Erhan Mataracı .. .. ..
4 Hasan Civelek .. .. ..
5 Şahika Tabak .. .. ..
Dizi Değişken Oluşturalım
Şimdi, PHP bize öyle bir araç vermeli ki, biz bir kerede bu listenin tümünü, her bir
ögesine sanki bir değişkenin değeri imiş gibi tek-tek, veya bir kaçına birden ulaşabilmeli ve
arzu ettiğimiz zaman notları doldurabilmeliyiz. Öğrenciler de yapacağımız Web sitesine
girerek, kendi notlarını görebilmeli ve notlarını inceleyebilmeli. PHP'nin bu amaçla sağladığı
araç, çok-boyutlu dizi-değişken oluşturma aracıdır. Ve bu araçla yukarıdaki listeyi aynen
şöyle yapabiliriz. Bu kodu dizi_degiskenler01.php adıyla kaydedin:
Kod:
<HTML>
<HEAD>
<TITLE>PHP'de Degiskenler</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>
<B> <H2>
<?php
$ogrenciler = array ( array ( adi => "Özbay", soyadi => "Altun", sinav1 =>"", sinav2 =>"", not =>""),
array ( adi => "Muharrem", soyadi => "Taç", sinav1 =>"", sinav2 =>"", not =>""),
array ( adi => "Hasan", soyadi => "Civelek", sinav1 =>"", sinav2 =>"", not =>""),
array ( adi => "Şahika", soyadi => "Tabak", sinav1 =>"", sinav2 =>"", not =>""), );
// Buraya başka kodlar girecek
print $ogrenciler[0][adi];
?>
</H2> </B>
</BODY>
</HTML>
Programdaki "print()" komutunu sadece dizi değişkeni doğru yazıp yazmadığımızı
sınamak amacıyla yazdık; bu programı Browser'da açtığınızda yazdığınız ilk ismi Browser
penceresinde görüyorsanız, dizi-değişkeni doğru şekilde oluşturdunuz demektir. Burada,
array() komutnu yazarken, süslü parantez değil, normal parantez kullandığımıza ve herbir
elemanın değerlerinin sonunda vrigül olduğuna dikkat edir. Bir diğer önemli nokta: endeks
adları bir kelimeden fazla ise bunları tırnak içine alarak belirtmektir. Örneğin:
Kod:
array ( adi => "Özbay", soyadi => "Altun", "Sinav 1 Notları" =>"", "Sinav 2 Notları" =>"", "Toplam Not Ortalamasi" =>""),
Burada, daha öncekilere benzer bir şekilde adlandırılmış $ogrenciler değişkenin
içeriğini array() komutu ile doldurduğumuzu görüyoruz. Array() ile böyle çok boyutlu ve
içerdiği değerlerin her birinin bir "endeks adı" olan dizi-değişkene İlişkili Dizi (Associative
array) de denir. Perl bilenler ise bu tür değişkenlere "Hash" dendiğini hatırlayacaklardır.
İlişkili Dizi'lerin birinci satırı 0, ikinci satırı 1, üçüncü satırı 2.. diye numaralandırılır. Bu
dizinin o satırındaki kaydın sıra endeksidir. Ayrıca burada "adi," "soyadi," "sinav1" .. dizi
değişkenin içindeki değerlerin endeks adıdır. Yani bu değerlere atıfta bulunurken, referans
yaparken veya bu değerleriekullanmak amacıyla erişirken sıra endeksi ve endeks adıyla
hitabederiz. Yukarıdaki sınama amaçlı print() komutuna bakarsanız, birinci öğrencinin
ismini "[0][adi]" olarak çağırıyor.
Çok elemanlı ilişkili dizi oluşturmanın bir diğer yolu, yeri geldiğinde böyle bir dizi
için yeni bir üye ilgili bilgileri eleman endeksi ve değerler için endeks adı belirterek şöyle
bir kod yazmaktan ibarettir. dizi_degiskenler01.php dosyasında şu değişikliği yaparak,
dizi_degiskenler02.php adıyla kaydedin
Kod:
<?php
$ogrenciler[0][adi] = "Özbay";
$ogrenciler[0][soyadi] = "Altun";
$ogrenciler[0][sinav1] = "";
$ogrenciler[0][sinav2] = "";
$ogrenciler[0][not] = ""; // Buraya Buraya başka kodlar girecek
print $ogrenciler[0][adi];
?>
Bir dizi değişkende kaç boyut olacaksa, o kadar içiçe array() ögesi oluşturabiliriz.
Buna göre tek boyutlu bir dizi değişken sadece bir array() komutu ile ve sadece değerler
verilerek oluşturulabilir. Diyelim ki yukarıdaki öğrenci listemiz sadece öğrencilerin
isimlerinden oluşacak. Bu durumda $ogrenciler değişkenine ilişkin satırı şöyle yazabilirdik:
Kod:
$ogrenciler = array ("Özbay", "Muharrem", "Hasan", "Şahika");
PHP, böyle tek boyutlu bir dizinin örneğin birinci elemanını, "$ogrenciler[0]" adıyla
bilir. Böyle bir tek-boyutlu diziyi oluşturmak için PHP bize başka bir kolaylık da sağlar:
array() komutunu kullanmadan, doğruca dizinin ögelerine değer vermemiz mümkündür.
Yukarıdaki programın sadece PHP bölümünü şöyle değiştirerek, dizi_degiskenler03.php
adıyla kaydedin:
Kod:
<?php
$ogrenciler[] = "Özbay";
$ogrenciler[] = "Muharrem";
$ogrenciler[] = "Hasan";
$ogrenciler[] = "Şahika";
// Buraya başka kodlar girecek
print $ogrenciler[0];
?>
Böyle sırayla dizi değişken oluşturur veya oluşturulmuş bir dizi değişkene ek
yaparken, değişkenin sıra numarasını yazmazsak, PHP bunları kendisi sıralar. Yukarıdaki
kodun da Browser penceresine "Özbay" yazdırması gerekir. Mevcut tek-boyutlu bir dizi
değişkene ek yaptığımızda, be yeni değerin dizinin en altına eklenmesini istiyorsak, sıra
numarası yazmamıza gerek yoktur. Mevcut değerlerden birini değiştirmek istiyorsak, o
değerin sıra numarasını yazmamız gerekir. Bunu denemek için yukarıdaki kodu şöyle
değiştirilim ve dizi_degiskenler04.php adıyla kaydedelim:
Kod:
<?php
$ogrenciler[] = "Özbay";
$ogrenciler[] = "Muharrem";
$ogrenciler[] = "Hasan";
$ogrenciler[] = "Şahika"; // Buraya başka kodlar girecek
$ogrenciler[0] = "Emre";
$ogrenciler[15] = "Özbay";
print ("Dizideki 1'nci isim: $ogrenciler[0] <br>");
print ("Dizideki 2'nci isim: $ogrenciler[1] <br>");
print ("Dizideki 3'ünci isim: $ogrenciler[2] <br>");
print ("Dizideki 4'üncü isim: $ogrenciler[3] <br>");
print ("Dizideki 5'inci isim: $ogrenciler[4] <br>");
print ("Dizideki 6'ncı isim: $ogrenciler[5] <br>");
print ("..............<br>");
print ("Dizideki 15'nci isim: $ogrenciler[15] <br>");
?>
Bu programın Browser penceresine göndereceği sırada, birinci öğrenci
($ogrenci[0]) olarak bu kez Özbay değil Emre yazdığını göreceğiz.
Bunun sebebi, diziyi oluşturan ilk grup deyimden sonra, $ogrenciler[0] = "Emre"; satırı ile birinci elemanın değerini değiştirmiş olduk. 15'nci elemana atama
yapmakla, PHP'nin $ogrenciler dizisinde 6, 7, 8, 9,.. 14'e kadar boş elemanlar
oluşturmasına sebep olduk.
Tek boyutlu dizileri de İlişkili Dizi olarak oluşturabilir yani değerlere endeks adı
verebiliriz. Daha önce kaydettiğimiz dosyada şu değişikliği yapalım ve
dizi_degiskenler05.php adıyla kaydedelim:
Kod:
<?php
$ogrenci[adi] = "Özbay";
$ogrenci[soyadi] = "Altun";
$ogrenci[sinav1] = "";
$ogrenci[sinav2] = "";
$ogrenci[not] = "";
// Buraya başka kodlar girecek
print $ogrenci[adi];
?>
PHP, $ogrenci adlı değişkenin beş ayrı değeri olduğunu ve bunların "adi," "soyadi,"
"sinav1"... olduğunu biliyor. Şimdi artık istediğimiz noktada bu değişkenin istediğimiz
değerine, o değerin endeks adını yazarak, çağrıda bulunabiliriz; bu değeri yeniden
verebiliriz.