PHP Bu dersimizde, kişisel web sunucumuza PHP ye giriş yapacağız. Öncelikle PHP'nin sözdizimi (syntax) ile ilgili bilgiler öğrenecek, ardından da PHP'de kullanılan veri tiplerini, değişkenleri ve sabitleri inceleyerek dersimizi tamamlayacağız. PHP Nedir? PHP HTML içine gömülebilir, sunucu taraflı, açık kod lisansıyla dağıtılan bir programlama dilidir. PHP, ASP ile aynı kulvarda koşar ve benzer çalışma mantığına sahiptir. PHP Nedir? Bir örnek: <html> <head> <title>örnek</title> </head> <body> echo "Merhaba, ben bir PHP programıyım!"; </body> </html> PHP Nedir? İnternet Programcılığı 1 İnternet Programcılığı 2 İnternet Programcılığı 3 PHP'ye Giriş Bir PHP programı (scripti) Perl ve C dillerine çok benzer. HTML kodu yaratmak için bir sürü kod yazacağınıza, istediğiniz işi yapan bir gömülü koda sahip HTML yazabilirsiniz (bu örnekte, yapılan iş ekrana yazı yazmak). PHP kodu özel başlangıç ve bitiş etiketleri arasına yazılır. Bu etiketler "PHP moduna" girip çıkabilmenizi sağlarlar. (Syntax) HTML'den Kaçış PHP bir dosyayı okurken, kendisine taranan metnin PHP kodu olduğunu söyleyen özel etiketlerden birine rastlayıncaya kadar dosyadaki metni işlemeden geçirmekle yetinir (HTML olarak kabul eder). Bu etiketler arasındaki kod ise, bir sonlandırma etiketiyle karşılaşılıncaya kadar çalıştırılır ve sonlandırma etiketiyle birlikte tekrar işlemeden geçirme işlemine devam edilir. Bu mekanizma, PHP'yi HTML kodunun içine gömme imkanı sağlar. PHP etiketlerinin dışındaki herşey olduğu gibi bırakılır, içerdeki herşey kod kabul edilerek taranır. PHP kod bloğunu belirtmek için ise farklı etiket biçimi vardır. Bunlardan yalnızca iki tanesi (... ve <script language="php">... </script>) her zaman mevcuttur; diğerleri php.ini konfigürasyon dosyası (php.ini) içersinden açılabilir yada kapatılabilir. Bu dört etiket biçiminden istediğinizi kullanma özgürlüğüne sahipsiniz, ancak en çok kullanılan biçimi şeklinde olanıdır. İnternet Programcılığı 4 İnternet Programcılığı 5 İnternet Programcılığı 6 PHP tarafından desteklenen etiketler şöyle sıralanabilir: 1. <? echo ("bu en basit kullanımdır\n"); <?= degisken pratik kullanımı ise şunun kısaltılmışıdır: "<? echo degisken " Bu yöntem bazı php sürümlerinde desteklenmemektedir. 2. echo("xhtml veya XML dokümanları sunuyorsanız, bu şekilde yapın\n"); 3. <script language="php"> echo ("bazı editörler bu kullanımı sevmezler"); </script> İnternet Programcılığı 7 4. <% echo ("İsterseniz ASP-tipi etiketler kullanabilirsiniz, fazla önerilmez"); %> <%= $variable; %> ise "<% echo..." %> için kısaltılmış kullanımdır. Bu yöntem de bazı php sürümlerinde desteklenmemektedir. Bunlar basitçe HTML'den kaçış yöntemleri (HTML ile PHP arasında geçiş) olarak değerlendirilirler. İnternet Programcılığı 8 Komut Ayrımı Komutlar birbirlerinden C ya da Perl dillerinde olduğu gibi ayrılırlar, bütün komutlar noktalı virgül ile sonlandırılır. Sonlandırma etiketi () aynı zamanda komutun sona erdiğini belirtir, bu nedenle aşağıdaki iki kullanım birbirine denktir: echo "Bu bir denemedir"; echo "Bu bir denemedir" İnternet Programcılığı 9 1
Açıklama (Remark) Kullanımı PHP, "C", "C++" ve Unix kabuk (shell) tipi yorum (comment, remark) kullanımını destekler. Örneğin: echo "Bu bir denemedir"; // Bu tek satırlık c++ tipi yorumdur /* Bu çoklu satır c++ tipi yorumudur ve bir başka satır daha */ echo "Bu diğer bir testtir"; echo "Son bitiş testi"; # Bu shell tipi yorumdur İnternet Programcılığı 10 PHP'de yedi adet veri tipini bulunmaktadır: Dört ölçeklenebilir tip: Boolean (Doğru/Yanlış) Integer (Tamsayı) Float (Kesirli sayı, double olarak da bilinir) String (Karakter katarı) İki bileşik tip: Array (Dizi) Object (Nesne) Ve son olarak iki özel tip: Resource (Kaynak) NULL (Boş) İnternet Programcılığı 11 BOOLEAN En basit değişken tipidir. Bir boolean, doğruluk değerini ifade eder. Sadece TRUE (doğru) yada FALSE (yanlış) değerini alabilir. $degisken = True; // $degisken 'e TRUE değerini atadık. Daha çok kontrol yapılarında ve operatörlerle birlikte kullanılır. Bir sonucun doğru olup olmadığını yada bir değişkenin içerisinde bilgi olup olmadığını bu şekilde kontrol edebiliriz. İnternet Programcılığı 12 Boolean şu tip ve değerlerde FALSE sonucunu üretir: Boolean değişkenin değeri False ise Integer değişkenin değeri 0 ise Float değişkenin değeri 0.0 ise String değişkenin içeriği boş ("") yada değeri "0" ise Array değişkenin hiç elemanı yoksa Object değişkenin üye değişkenleri yoksa Değişkenin değeri NULL ise Değişken tiplerinin belirtilen durumları haricindeki tüm değerleri TRUE sonucunu verir. İnternet Programcılığı 13 INTEGER Integer, Z =..., -2, -1, 0, 1, 2,... tamsayılar kümesindeki bir sayıyı ifade eder. Integer değişkenler decimal (10-tabanlı), hexadecimal (16-tabanlı) yada octal (8-tabanlı) olarak tanımlanabilir ve seçime bağlı olarak + yada - değer alabilirler. Eğer sekizlik gösterimi kullanmak istiyorsanız rakamın başına 0, onaltılık gösterimi kullanmak istiyorsanız 0x yazmanız gerekir. İnternet Programcılığı 14 $a = 1234; # pozitif tamsayı $a = -123; # negatif sayı $a = 0123; # sekizlik sayı (ondalık sayı karşılığı: 83) $a = 0x1A; # onaltılık sayı (ondalık sayı karşılığı: 26) Integer bir değişkende tutabileceğimiz maksimum değer 2147483647'dir. Bu değerin aşılması durumunda değişken otomatik olarak integer'dan daha büyük sayıları barındırabilen float tipine dönüşür. İnternet Programcılığı 15 FLOAT Floating Point Number (Kayan Noktalı Sayı), double (çift), ya da real number (gerçek sayı) olarak da bilinen float veri tipi, virgüllü sayıları ve integer'ın alamayacağı büyüklükteki sayıları barındırmak için kullanılır. Float değişkenler hafızada 64 bitlik yer kaplarlar. $a = 1.234; // 1.234 $b = 1.2e3; // 1.2 x (10^3) = 1200 $c = 7E-4; // 7 x (10^-4) = 0.0007 STRING String, karakterlerden oluşan bir dizidir. Karakter katarı ya da dizisi (array'dan farklı) olarak Türkçeleştirilebilir. Pratikte stringler için karakter sınırı yoktur, bu yüzden de çok uzun olabilirler. Bir string bilgisi 3 farklı şekilde belirlenebilir: Tek tırnaklı (single quoted) Çift tırnaklı (double quoted) Heredoc sözdizimli (heredoc syntax) a. Tek Tırnaklı Basit stringleri tanımlamak için kullanılan en basit yoldur. String tek tırnak işaretleri (') arasına yazılır. Tek tırnakla string tanımlanmasının getireceği farklılık şudur: Özel karakterler (\n, \\, klavyeden girilen enter karakteri, vb.) ve değişken isimleri dönüştürülmez, yani taşıdıkları anlam yada değer değil, yazılışları dikkate alınır ve çıktıda ekrana aynen yazılır (\' bunun dışındadır). İnternet Programcılığı 16 İnternet Programcılığı 17 İnternet Programcılığı 18 2
echo "<pre>"; echo 'bu, basit bir string'; echo 'bu string içerisine gömülü olarak yeni satırları basit bir şekilde oluşturabilirsiniz'; echo 'İngilizce öğreniyoruz: "I\'ll be back"'; // Çıktı: İngilizce öğreniyoruz: "I'll be back" echo 'Silinsin mi C:\\*.*?'; // Çıktı: Silinsin mi C:\*.*? echo 'Silinsin mi C:\*.*?'; // Çıktı: Silinsin mi C:\*.*? echo 'Yeni satıra geçer: \n yeni bir satır'; // Çıktı: Yeni satıra geçer: \n yeni bir satır echo 'Mevcut değerler $degisken1 $degisken2'; // Çıktı: Mevcut değerler $degisken1 $degisken2 echo "</pre>"; İnternet Programcılığı 19 b. Çift Tırnaklı Eğer string çift tırnaklar arasına yazılmışsa, PHP string içerisinde kaçış karakterleri (escape characters) kullanılabileceğini anlar. En çok kullanılan kaçış karakterleri aşağıda verilmiştir: \n Yeni satır \r Satırbaşı karakteri \t Tab karakteri \\ Ters bölü işareti \$ Dolar işareti \" Çift tırnak İnternet Programcılığı 20 $degisken1="deg1"; $degisken2="deg2"; echo "<pre>"; echo "bu, basit bir string"; echo "İngilizce öğreniyoruz: \"I'll be back\""; // Çıktı: İngilizce öğreniyoruz: "I'll be back" echo "Klasörümüzün yolu: C:\resim\tuval"; // hatalı görünür echo "Klasörümüzün yolu: C:\\resim\\tuval"; // doğru görünür echo "Yeni satıra geçer: \n yeni bir satır"; // iki satırda görünür echo "Mevcut değerler $degisken1 $degisken2"; // Çıktı: Mevcut değerler deg1 deg2 echo "</pre>"; İnternet Programcılığı 21 c. Heredoc Sözdizimli Pek kullanımı olmayan başka bir yol da heredoc ("<<<") adı verilen sözdizimi ile karakterleri sınırlandırmaktır. Bu metod kullanılırken öncelikle <<< tanımlayıcısından sonra herhangi bir string tanımlanmalı ve alıntı aynı tanımlayıcı ile kapanmalıdır. Kapanış tanımlayıcısı mutlaka satırın ilk sütununda tanımlanmalıdır. echo "<pre>"; $ders = 'İnternet Programcılığı'; echo <<<TANIM Şu an "$ders" dersini işlemekteyiz. Burada büyük 'a' harfi olmalı: \x41 TANIM; echo "</pre>"; String'lerde Basit Sözdizimi PHP yorumlayıcısı dolar ($) işareti gördüğünde sonrasının bir değişken adı olduğunu düşünür. Eğer değişken adının açıkça belirtilmesi gerekiyorsa işaretleri arasına yazılmalıdır. String'deki Karakterlere Erişme String'lerin içerdiği karakterlere yine karakterleri aracılığıyla ulaşılabilir. String'in ilk hanesi 0'dan başlayarak string uzunluğu 1'e kadar gider. İnternet Programcılığı 22 İnternet Programcılığı 23 İnternet Programcılığı 24 String'leri Sayılara Dönüştürme İki string'i birleştirmek için nokta (.) karakteri kullanılır. $isim = $ad." ".$soyad; String'ler üzerinde yapılabilecek işlemler tabii ki bunlarla kısıtlı değildir. PHP'nin çok geniş bir hazır string fonksiyonları kütüphanesi bulunmaktadır. Hazır string fonksiyonlarını ileriki konularda ayrıntılı olarak işleyeceğiz. ARRAY PHP'de array (dizi)'ları birçok değişkeni içerisinde barındıran düzenli bir harita yapısı şeklinde düşünebilirsiniz. Bu harita yapısı anahtar ve değerlerden oluşur. Array'ları matris yapısı şeklinde düşünebilirsiniz. PHP'de diziler tek boyutlu olabildiği gibi iki, üç ve daha fazla boyuta da sahip olabilirler. Yapı basitçe şu şekildedir: $dizi_adi[anahtar]=değer; /* dizinin belirli bir anahtarına değer atama */ $degisken=$dizi_adi[anahtar]; /* dizinin belirli bir anahtarından değer okuma */ Şimdi basit bir dizi tanımlayarak konuyu örnek üzerinde anlamaya çalışalım: $mevsimler = array("ilkbahar","kış","sonbahar","yaz"); echo $mevsimler[0]; // Çıktı: İlkbahar echo $mevsimler[2]; // Çıktı: Sonbahar İnternet Programcılığı 25 İnternet Programcılığı 26 İnternet Programcılığı 27 3
OBJECT Nesneler günümüzde neredeyse bütün programlama dillerinde varolan veri tipleridir. PHP'de bir nesne oluşturmak için, tanımlamış olduğumuz sınıf (class) öğesini "new" deyimi aracılığıyla nesne yapılacak değişkene aktarırız. Class içerisinde tanımladığımız değişkenler nesnenin özellikleri (attributes), fonksiyonlar ise nesnenin metodları olurlar. Örnek : class araba var $model; var $renk; function goster() echo "$this->renk bir Ford $this->model araba."; $ford = new araba; $ford->model="fiesta"; $ford->renk="kırmızı"; $ford->goster(); RESOURCE Kaynak veri tipi dediğimiz resource aslında bildiğimiz değişken kullanımından biraz farklıdır. Resource veri tipi, dosya açarken ya da veritabanına bağlanırken kullandığımız özel bir işleyici (handle) olarak karşımıza çıkarlar. $dosya = fopen ("c:\\ders\\bilgi.txt", "r"); /* $dosya değişkeni bir resource'dır */ $veri = mysql_connect("localhost", "kullanıcı", "şifre") /* bu da başka bir resource */ İnternet Programcılığı 28 İnternet Programcılığı 29 İnternet Programcılığı 30 NULL Null, çok özel bir veri tipidir. Boş, yok yada hiçbirşey anlamlarına gelmektedir. Bir değişken şu durumlarda Null olarak ifade edilebilir: İçerisine sabit tanım olan NULL atanmışsa ($deg=null) Henüz set edilmemişse ya da değer atanmamışsa (tanımlanmamış $deg) Unset edilmişse (unset($deg)) $a=null; if (is_null($a)) echo "a değişkenine herhangi bir değer atanmamış"; echo "<br>"; if (is_null($b)) echo "b değişkenine herhangi bir değer atanmamış"; Veri Tipi Okuma ve Kontrol PHP'de değişkenlerin tipi programcılar tarafından genellikle tanımlanmaz. Bunun yerine değişkenin tipi, PHP'nin çalışması sırasında içeriğe bağlı olarak kendiliğinden belirlenir. Eğer kesin bir ifadenin tipini ve değerini görmek istiyorsanız var_dump() fonksiyonunu kullanabilirsiniz. İnternet Programcılığı 31 İnternet Programcılığı 32 İnternet Programcılığı 33 Eğer hata ayıklama için değişken tipinin basitçe okunabilir gösterimini elde etmek istiyorsanız gettype() fonksiyonunu kullanabilirsiniz. Fakat amacınız değişkenin tipini almak değil de sadece kontrol etmek ise gettype() yerine is_type fonksiyonlarını kullanabilirsiniz. is_type fonksiyonları bütün veri tipleri için kullanılabilir. Örneğin; is_bool(), is_float(), is_int(), is_string(), is_object(), is_array(), is_null(). Geriye TRUE yada FALSE değeri döndürürler. Burada üzerinde bahsetmemiz gereken is_null fonksiyonu vardır. Bir değişkenin "null" olması, set edilmemiş (tanımlanmamış, hiç değer atanmamış) olması ile aynı manadadır. Veri Tipi Dönüşümü PHP'de değişkenlerin tipinin tanımlanmasına gerek olmadığını (hatta bunun desteklenmediğini), veri tipinin değişkenin içeriğine atılan değere göre otomatik belirleneceğini daha önce söylemiştik. Örneğin $deg değişkenine string atarsanız veri tipi string, tamsayı atarsanız integer, kesirli sayı atarsanız float olacaktır. PHP'nin otomatik tip dönüşümüne bir örnek de "+" operatörüdür. Eğer "+" ile birleştireceğiniz iki ifade de float ise sonuç da float olur. Fakat bu işlemde operatör ile işleme sokulan ifadelerin veri tipleri değişmez, sadece hesaplanan sonucun veri tipi ve değeri değişir. Eğer bir değişkenin tipini kesin olarak değiştirmek istiyorsanız settype() fonksiyonunu kullanabilirsiniz. settype() fonksiyonu ile herhangi bir değişkenin tipi, PHP'nin 7 veri tipinden birine dönüştürülebilir. Her ifadede olduğu gibi dönüşümün başarılı olması sonucu geriye TRUE değeri, başarısız olması durumunda ise FALSE değeri döner. Eğer amacınız bir değişkenin tipini kesin olarak değiştirmek değil de, o değişkenin başka veri tipine dönüştürülmüş halini elde etmekse, bu sefer parantezli PHP ifadelerini kullanabilirsiniz. Parantezli kullanımda, "+" operatöründe olduğu gibi, girdi ifadelerinin veri tipi değişmez, sadece çıktıyı etkilemiş oluruz. İnternet Programcılığı 34 İnternet Programcılığı 35 İnternet Programcılığı 36 4
PHP'de değişkenler, dolar işaretini ($) takip eden isimle temsil edilirler. Değişken isimleri büyük/küçük harf duyarlıdır (case-sensitive). Değişken isimleri, diğer PHP etiketleriyle aynı kuralları izlerler. Geçerli bir değişken adı harf veya alt çizgi karakteri (_) ile başlar, herhangi bir harf, sayı yada alt çizgi karakteri ile devam edebilir. Not: Burada "harf" ten kasıt, a-z ve A-Z'nin yanında 127'den 255'e kadar olan ASCII karakterlerdir. PHP çok sayıda öntanımlı değişken taşır. Bu değişkenleri phpinfo() fonksiyonunu çalıştırdığınızda görebilirsiniz (bu değişkenlerin bazıları, komut satırında çalıştırılan PHP'de mevcut değildir). Örnek : $a = 3; /* global */ function Test() echo $a+4; /* local */ Test(); // sonuç 7 mi acaba? :) İnternet Programcılığı 37 İnternet Programcılığı 38 İnternet Programcılığı 39 Evet, bu PHP scripti 7 sonucunu vermez, ekranda 4 görürsünüz. Bunun nedeni, Test isimli fonksiyonun içerisinde tanımlanan $a değişkeninin local (lokal, yerel) bir değişken olmasıdır. Dolayısıyla bu değişkenin fonksiyon içerisinde hiçbir değer atanmamış hali 4 ile toplandığında 0+4 olacağından sonuç da 4 olacaktır. PHP'nin burada C dilinden küçük bir farkla ayrıldığı dikkatinizi çekmiş olabilir. C'de global değişkenler fonksiyon içerisinde de geçerli olurken, PHP'de bunu yapmak için global a$; şeklinde bir tanımlama yapmak gerekir, aksi halde global değişken fonksiyona aktarılmaz. İnternet Programcılığı 40 $a = 1; $b = 2; function topla() global $a, $b; $b = $a + $b; topla(); echo $b; // çıktı: 3 Yukarıdaki script 3 sonucunu verecektir. $a ve $b değişkenlerinin fonksiyon içerisinde global olarak tanımlanması ile bu değişkenleri fonksiyon içerisinde kullanmak mümkün olmaktadır. İnternet Programcılığı 41 Değişken kapsamı ile ilgili bir başka önemli özellik ise statik değişkendir. Bir statik değişken, sadece yerel fonksiyonda varolur, fakat script çalışma esnasında bu fonksiyondan çıksa bile statik değişkenin değeri kaybolmaz. Aşağıdaki örnekte $a, normal tanımlı bir yerel değişkendir. test() fonksiyonunu 3 kere çağırmamıza rağmen, fonksiyona her girişte $a değişkenine 0 değeri atanacağından ekranda 000 çıktısını görürüz. Fakat $a değişkeni static olarak tanımlanırsa ilk değer bir defa atanır, fonksiyon tekrar çağırıldığında zaten bir değeri varsa tanımlama esnasında sıfırlanmaz. İnternet Programcılığı 42 Örnek : function test () $a = 0; // $a = 0; yerine static $a = 0; kullanılmalı echo $a; $a++; test(); test(); test(); Değişken Bir değişkenin değeri, başka bir değişken adı olarak kullanılabiliyorsa, bu tür değişkenlere "değişken değişken" adı verilir. Bu işlem $$degisken şeklinde ifade edilir. $ sembolü nasıl ki bir değişkenin değerini veriyor ise, $$ sembolü de değişkenin değerini adındaki değişkenin değerini vermektedir. Bir örnekle konuyu anlamaya çalışalım: $elma="amasya"; $meyve="elma"; $sonuc=$$meyve; echo $sonuc; // çıktı: amasya İnternet Programcılığı 43 İnternet Programcılığı 44 İnternet Programcılığı 45 5
Sabitler Bir sabit (constant), basit bir değerin tanımlayıcısıdır. Tanımlanmalarından sonra scriptin çalışması esnasında değerleri değişmez. Sabitler varsayılan olarak küçük/büyük harf duyarlıdır, ancak bir genel kural olarak daima büyük harflerle tanımlanırlar. Sabitleri tanımlarken kullanılan isimlerin kuralları, değişkenlerde olduğu gibidir. Superglobal değişkenler gibi sabitler de genel (global) bir kapsama sahiptir, yani tanımlandıktan sonra scriptin her yerinde kullanılabilirler. Sabitler, sadece define() fonksiyonu kullanılarak tanımlanabilirler, değişkenlerde olduğu gibi basit atama ($a=5 gibi) yöntemiyle sabit oluşturulamaz. Bir sabit bir kere tanımlandıktan sonra değiştirilemez ve tanımı yok edilemez. Sabitler Sabitler boolean, integer, float ve string gibi sadece ölçülebilir (scalar) veri tiplerini içerebilirler. Sabitler tanımlanırken/kullanılırken salt isimleri ile ifade edilirler; değişkenlerde olduğu gibi "$" karakteri ile sembolize edilmezler. PHP scriptinizin içerisinde o ana kadar tanımlanmış sabitleri öğrenmek için get_defined_constants() fonksiyonunu kullanabilirsiniz. Sabitler define("pi_sayisi", 3.14); define("okul", "Uludağ Üniversitesi"); echo PI_SAYISI*2; // çıktı: 6.28 echo "<br>"; echo OKUL; // çıktı: Uludağ Üniversitesi echo "<br>"; echo Okul; // çıktı: Okul (büyük/küçük harf duyarlı demiştik) İnternet Programcılığı 46 İnternet Programcılığı 47 İnternet Programcılığı 48 6