WTK290U-İNTERNET TABANLI PROGRAMLAMA
Ünite 3: PHP ile Dinamik Web Kodlama
Giriş
Bu ünitede ise PHP programlama dilinin yapısı konusunda bilgi verilecek ve bir PHP çerçevesi olan Laravel tanıtılacaktır. PHP programlama dili birçok özelliği ve uygulama alanı olan son derece gelişmiş bir programlama dili olduğu için tüm özelliklerini detaylı olarak bir veya iki ünitede anlatmak mümkün değildir. Bu bakımdan bu ünite de PHP dilinin temel özellikleri konusunda özet bilgiye yer verilmiştir. Bu ünitede veriler bilgiler ışığında basit etkileşimli web sayfaları yapmak mümkün olacaktır. PHP programlama dilinin sözdizimi, C ve Java gibi programlama dillerindeki sözdizimine oldukça benzemektedir. Dolayısıyla benzer sözdizimine sahip programlama dillerine aşina olan bir programcının PHP programlama dilini öğrenmesi oldukça kolay olacaktır.
Değişkenler ve Değişken Türleri
PHP dilinde değişkenlerin türünü özellikle belirtmeye gerek yoktur. Bir değişken tanımlanıp değer atandığı anda o değişkenin türü atanan değere göre otomatik olarak belirlenmiş olur. Örneğin bir değişkene true değeri atandığında bu değişkenin türü boolean olur. Aynı değişkene daha sonra bir tam sayı atanabilir. Bu durumda değişkenin türü de değişmiş olacaktır. PHP, değişkenler konusunda oldukça esnek bir yapıya sahiptir. Genel olarak PHP’de 4 temel türden bahsedilebilir: boolean, integer, float ve string. Boolean türündeki değişkenler sadece iki değer alabilmektedirler: true ve false. Bu tür değişkenler genellikle şartlı ifadelerde kullanılmaktadır. Integer ve float türleri ise tamsayı ve ondalıklı sayı değerleri ifade etmektedir. String türü değişkenler ise içlerinde metinsel ifadeleri barındırırlar.
Diziler
PHP programlama dilinde birçok değeri içinde barındırabilen diziler oluşturmak mümkündür. Diziler aslında anahtarların ve değerlerin ilişkilendirilmesi ile ilgili bilgiyi barındıran yapılardır. PHP dili diziler konusunda son derece esnek bir kullanım imkânı sunmaktadır. Dizi oluşturmak için array ya da [] ifadeleri kullanılabilir. Dizi elemanlarına ulaşmak için değişken adı yazıldıktan sonra köşeli parantez içinde anahtar yazılmalıdır. Diğer bazı programlama dillerinde olduğu gibi dizi elemanlarının tek bir türde olma zorunluluğu bulunmamaktadır. Bir dizi; string, integer, float, boolean, array, oject, vb. türünde değerler barındırılabilir. Dizilerde anahtar tanımlaması yapmak için => işareti kullanılmaktadır. Bu işaretin solundaki ifade anahtar sağındaki ifade ise değerdir. Anahtarlar sadece string veya integer olabilir. Aynı dizide hem integer hem de string türünde anahtar tanımlanabilir. Dizi oluşturmak için karmaşık türlerden biri olan Array türünü kullanmak gerekmektedir. PHP, dizi kullanımı ile ilgili de oldukça esnek bir yapı sunmaktadır. Anahtarlı diziler tanımlanabileceği gibi, çok boyutlu dizeler de tanımlanabilir. Ayrıca bir dizi farklı türde elemanlara sahip olabilmektedir.
HTML Formları
HTML sayfalarında kullanıcının veri girişi yapabilmesi için HTML formları kullanılmaktadır. Bu formlara girilen değerler kullanıcı formu gönderdiği anda PHP tarafından işlenebilmektedir. Formlarda PHP için en önemli bölüm Form etiketi altındaki action ve method özellikleridir. Action özelliği ile forma girilen bilgilerin hangi dosyaya gönderileceği belirlenmektedir. Burada bir PHP dosyasının tam yolu verilmelidir. Form etiketinin method özelliği ise iki değer almaktadır: post ve get. Post seçeneği seçilir ise, veriler arka planda gönderilir, get seçeneği seçilir ise forma girilen tüm veriler adres çubuğuna eklenerek gönderilir. Formlarda genellikle post değeri tercih edilmektedir. PHP ile farklı yöntemler ile gönderilen bu veriler $_POST ve $_GET dizileri kullanılarak alınabilmektedir. Ayrıca $_REQUEST dizisi ile hem get hem de post yöntemiyle gönderileri verileri almak mümkündür.
Kontrol Yapıları
PHP dili, tüm programlama dillerinde bulunan if, for, while gibi kontrol yapılarını desteklemektedir. Bu yapıların kullanımları, PHP dili ile benzerlik gösteren diğer programlama dilleri ile oldukça benzerdir.
If
Programlama dillerinin en önemli ifadelerinden biri olan if ile bir kod bloğunun belirlenen koşullara bağlı olarak çalıştırılıp çalıştırılmayacağı belirlenir. if(karşılaştırma ifadesi) {çalıştırılacak komutlar;} şeklinde bir kullanıma sahiptir. Eğer if ile belirtilen koşul sağlanmadığında, bir başka deyişle karşılaştırma ifadesi sonucunun yanlış (false) olması durumunda çalıştırılmak istenen komutlar var ise if bloğundan sonra else bloğu kullanılmalıdır.
Karşılaştırma İfadeleri
if, for, while gibi komutların doğru çalışabilmesi için uygun karşılaştırma operatörlerinin kullanıldığı karşılaştırma ifadelerinin yazılması gerekmektedir. Bu karşılaştırma operatörleri (kitabın sayfa 53 Tablo 3.1 de) verilmiştir.
For
for döngüsü, döngü bloğu içine yazılan kodların belirlenen koşullara bağlı olarak istenilen sayıda tekrar tekrar çalıştırılmasını sağlar. for döngüsünde parantez içinde noktalı virgül ile ayrılmış 3 bölüm bulunmaktadır. Birinci ve üçüncü bölümde herhangi bir php ifadesi yazılabilir. İkinci bölümde ise mutlaka bir karşılaştırma ifadesinin yer alması gerekir. for döngüsünün çalışmasındaki en önemli parametre bu karşılaştırma ifadesidir.
While
PHP ile döngü oluşturmak için kullanılabilecek bir başka yapı ise while döngüsüdür. for döngüsü ile aynı şekilde çalışır. for döngüsünden tek farkı parantez içindeki birinci ve üçüncü bölümün olmamasıdır. Karşılaştırma ifadesinin sonucu doğru olduğu sürece döngü içindeki komutlar çalıştırılır ve her döngü adımında karşılaştırma ifadesi kontrol edilir. Karşılaştırma ifadesi yanlış sonucunu ürettiği anda döngüden çıkılır.
Do while
PHP’de bir başka döngü yöntemi ise do while döngüsüdür. do while döngüsü while döngüsüne oldukça benzemektedir. while döngüsünde döngüye girilmeden önce karşılaştırma ifadesi kontrol edilir ve doğru sonucunu üretmesi durumunda döngü komutları çalıştırılır. Hatta döngüye ilk girişte karşılaştırma ifadesi yanlış sonucunu üretir ise döngü bloğu komutları bir kere bile çalıştırılmadan döngüden çıkılmış olur. Ancak do while döngüsünde önce döngü bloğu komutları çalıştırılır ve daha sonra karşılaştırma ifadesi kontrol edilir.
Foreach
Dizi elemanlarına yönelik döngü oluşturmak için foreach döngüsü kullanılır. Parantez içinde “as” kelimesinin solunda döngünün gerçekleştirileceği dizinin değişken adı verilmelidir. As kelimesinin sağında ise herhangi yeni bir değişken adı yazılabilir. Her bir döngü adımında dizi elemanları bu değişkene atanmaktadır. Anahtarlı yapı kullanılır ise dizi elemanının anahtarı ve değeri ayrı ayrı belirtilen değişkenlere atanmaktadır.
Break
Break komutu; çalışmakta olan for, foreach, while, do while veya switch yapılarının çalışmasını sonlandırır ve program akışı bu yapılardan sonraki komut ile çalışmaya devam eder.
Continue
continue komutu sadece döngülerde kullanılır ve kullanıldığı noktadan itibaren döngü bloğu içinde yazılmış kodların çalıştırılmadan döngü başına gidilmesini sağlar. continue komutu varsayılan olarak sadece içinde bulunduğu döngünün başa dönmesini sağlar. Bir başka deyişle break ile benzer şekilde continue için varsayılan değer 1’dir (continue 1;). Eğer continue 2; şeklinde kullanılır ise içe yazılmış olan döngülerden üstte bulunan döngünün başa dönmesi sağlanmış olur. Benzer şekilde 3 adet iç içe yazılmış bir döngü yapısında en iç döngüde yazılan continue 3; komutu en üst düzeydeki döngünün başa dönmesini sağlar.
Switch
Switch bir karşılaştırma yapısıdır ve if ve else if yapısına benzerlik gösterir. Bir değişkenin farklı değerleri için farklı komutların çalıştırılmasını sağlar.
Goto
goto komutu ile program akışını değiştirmek mümkündür. Normalde PHP kodları sırayla çalıştırılır. goto komutu ile program akışının istenilen bölümden devam etmesi sağlanabilir. goto kullanmadan önce program akışında etiketler koymak gerekir. Etiket koymak için etiketin adı ve “:” işareti kullanılmalıdır.
include/include_once
Bu komutlar ile çalışan php dosyasına bir başka php dosyası dahil edilir ve içeriği çalıştırılır. include komutu ile bir dosya birden fazla dahil edilebilirken, include_once
komutu kullanıldığında eğer belirtilen dosya daha önce dahil edildiyse tekrar dahil edilmez. Bu komutlarda belirtilen dosya PHP tarafından bulunamaz ise uyarı mesajı yayınlanır, ancak program çalışmasına devam eder. include ve include_once komutlarında belirtilen dosya öncelikle belirtilen yolda aranır. Eğer belirtilen yolda bulunamaz ise PHP’nin ayar dosyasında include_path ile ayarlanmış klasörlere bakılır.
require/require_once
Bu iki komut da aslında include ve include_once ile aynı işi yapmaktadır. Kullanım şekilleri de aynıdır. Tek fark require ve require_once komutları kullanıldığında belirtilen dosyanın bulunmaması durumunda PHP’de ölümcül hataya neden olur ve program akışı sonlandırılır. Dolayısıyla bu iki komut mutlaka dahil edilmesi gereken dosyalar için kullanılmalıdır. Bu dosyalar dahil edilemediğinde program hata verecek ve çalışmaz hale gelecektir. İnclude ve include_once komutları ise olsa da olur olmasa da olur denebilecek dosyaları dahil etmek için kullanılmalıdır.
Fonksiyonlar
Diğer programlama dillerinde olduğu gibi PHP ile de fonksiyon tanımlamak mümkündür. Fonksiyonlar daha sonra çalıştırmak için programcı tarafından yazılan kod bloklarıdır. Fonksiyonlar genellikle sıkça yapılan işlemler için tanımlanır. Böylece benzer kodlar tekrar tekrar yazılmamış olur. Aynı zamanda kodların organizasyonunu sağlamak içinde fonksiyon tanımlaması yapılabilir. Böylece kodlar daha okunaklı ve anlaşılır olacaktır. Yazılan bir fonksiyonun çalışması için mutlaka çağrılması gerekir. Fonksiyon tanımı function kelimesi ile yapılmaktadır. Daha sonra fonksiyona bir isim verilmelidir. Fonksiyon isimlendirme kuralları, değişken isimlendirme kuralları ile aynıdır. Fonksiyon isminden sonra parantez içinde virgül ile ayrılmış parametre listesi verilmelidir. Parametreler fonksiyona değer göndermek için kullanılmaktadır. Parametre sayısı, fonksiyonun amacına bağlı olarak değişkenlik gösterebilir. Fonksiyon bloğu içinde fonksiyonun yapması istenen komutlar yer almalıdır. Son olarak ise isteğe bağlı olarak fonksiyon geriye bir değer döndürebilir. Geriye değer döndürmek için ise return komutu kullanılmalıdır. return komutunun kullanıldığı yerde fonksiyon sonlandırılır ve fonksiyondan çıkılır. Bu bakımdan return komutu döngüleri sonlandırmak için kullanılan break komutu gibi de kullanılabilmektedir. Fonksiyon return ile geriye bir değer döndürdüğü için geriye dönen bu değeri saklamak için fonksiyon $top değişkenine atanır.
Kapsam
PHP dilinde değişkenler sadece tanımlandıkları blok içinde ve o bloğun alt bloklarında geçerlidir. Bir blok içinde tanımlanmış değişkene yerel değişken, bir blok içinde tanımlanmayan değişkene ise global değişken adı verilir. Global değişkenler tanımlandıktan sonra tüm php dosyasında geçerlidirler. Ancak yerel değişkenler
tanımlandıkları blok bittiğinde ölürler ve bir daha kullanılamazlar.
Parametre Gönderimi
Varsayılan olarak bir fonksiyona parametre gönderildiğinde sadece değer olarak gönderilir. Fonksiyon içinde parametre olarak verilen değişkene ulaşılmaz. Eğer parametre olarak verilen değişkenin fonksiyon tarafından değiştirilmesi istenir ise değişkenin referans olarak gönderilmesi gerekmektedir. Bir değişkenin referans olarak gönderilebilmesi için fonksiyon parametre tanımlamasında başına & işareti konulur.
Varsayılan Parametre Değerleri
Fonksiyonlara varsayılan parametre tanımlaması yapılabilir. Böylece fonksiyon çağrılırken varsayılan parametre tanımlaması yapılan değerler parametre olarak gönderilmeyebilir. Parametre gönderilmediğinde fonksiyon içinde varsayılan değer kullanılır. Varsayılan parametre tanımlaması yapılırken mutlaka parametre listenin en sonundan itibaren yapılmalıdır.
Sınırsız Sayıda Parametre
PHP ile sınırsız sayıda parametre alan fonksiyonlar tanımlanabilir. Sınırsız sayıda parametre alan fonksiyonlarda parametre olarak gönderilen değerler fonksiyona dizi olarak aktarılmaktadır. Sınırsız parametre değişkeninin başına üç nokta yan yana konulmalı ve mutlaka fonksiyon tanımında son parametre olarak verilmelidir.
Sınıflar
PHP’de modern programlama dillerinde olduğu gibi sınıf tanımlaması yapılabilmektedir. PHP’nin 5 versiyonu ile sınıf tanımlama konusunda önemli değişiklikler yapılmış ve tamamen yeni bir Nesne Modeli yazılmıştır. Programlama dillerinde sınıflar, kendi içinde tutarlılığı olan özel işleri modellemek için kullanılır. Bu işlerin yürütülmesinden tamamen tanımlanan bu sınıf sorumlu olacaktır. Böylece programlar gerçek hayatta olduğu gibi sınıflar ile modellenmiş ve daha anlaşılır olur. Sınıf tanımlaması ile kodlar düzenli bir şekilde yazılır ve tekrar tekrar kullanılabilir. Sınıflar kendi içinde sabit, değişken ve fonksiyon barındırabilirler. Bunlara sınıfın üyeleri denilmektedir. Sınıf tanımlama class kelimesi ile yapılmaktadır. Sınıfa ait her bir örneğe ise nesne adı verilmektedir. İşlemler genellikle sınıfın bir örneği olan nesneler üzerinden yapılmaktadır.
PHP programlama dili ile aşırı yükleme, miras alma, sınıf soyutlama, arayüz tanımlama gibi nesne yönelimli programlama dillerinde bulunan ileri düzey özellikler kullanılabilmektedir.
Veritabanı İşlemleri
Web sayfaları için sunucu tarafında çalışan programlama dillerinin en önemli amaçlarından biri de veritabanı ile ilgili işleri yapabilmektir. Kullanıcı girişinin olduğu bir web sitesinde kullanıcı bilgileri, bir alışveriş web sitesinde
siparişler ile ilgili bilgiler, bir kütüphane web sitesinde kitaplar ve ödünç alma/verme ile ilgili bilgilerin saklanması gibi birçok iş için veritabanları kullanılmaktadır. Veritabanları genellikle veritabanı sunucu yazılımları üzerinde oluşturulmaktadır. Sunucu tarafında çalışan programlama dilleri de bu veritabanı sunucu yazılımlarına kullanıcı adı ve şifre ile bağlanmakta ve SQL dili ile veritabanı ile ilgili işler yapabilmektedirler.
PHP programlama dili ile tüm popüler veritabani sunucu yazılımlarına bağlanılabilir. Piyasada Microsoft SQL Server, Oracle, IBM DB2, vb. ücretli ve MySQL, MariaDB, PostgreSQL, MongoDB, SQLite, vb. açık kaynak kodlu ve ücretsiz çok sayıda kendini kanıtlamış veritabanı sunucu yazılımı bulunmaktadır. PHP ile veritabanı sunucu yazılımlarına bağlanabilmek için o yazılımın uzantısının (extension-plugin) kurulu olması ve PHP’nin ayar dosyasından etkinleştirilmesi gerekmektedir. Özellikle PHP kullanıcılarının açık kaynak kodlu ve ücretsiz olan MySQL ve MariaDB veritabanı sunucu yazılımlarını tercih ettikleri söylenebilir.
Veritabanları üzerinde işlem yapmak için SQL dili kullanılmaktadır. PHP ile veritabanına bağlantı yapıldıktan sonra SQL dili ile yazılmış sorgu ifadesi veritabanı üzerinde çalıştırılır ve bu sorgu sonucu elde edilen veriler PHP ile işlenebilir. MySQL veritabanına PHP ile bağlantı yapabilmek için mysqli gibi bir uzantının yüklenmiş olması gerekmektedir. mysqli uzantısı, hem yordamsal programlama hem de nesne yönelimli programlama paradigmalarını desteklemektedir.
Çatılar ve Laravel
Son yıllarda web uygulama geliştirme alanında çatı (framework) kullanımının önemi artmıştır. Web uygulama geliştirme alanında çalışan ve web uygulama geliştirme çatılarının kullanımı hakkında bilgisi olmayan yok denecek kadar azdır. Web uygulama geliştirme çatıları ile yazılım geliştirme süreci önemli derecede hızlanmaktadır. Çatılar, uygulamalar için gerekli olabilecek temel işlevleri ve araçları bünyelerinde bulundurmaktadırlar. Ayrıca çatılarda bulunan güvenlik araçları sayesinde web sitelerinin daha güvenli olmasını sağlanmakta ve dış saldırılardan etkilenme olasılığı düşmektedir.
Çatılar, birçok uygulamada bulunan benzer öğelerin kullanılmalarına yönelik ortak bir tasarım ortaya koymaktadır. Genel olarak tüm uygulamalarda ortak olarak değerlendirilebilecek temel öğeler bulunmaktadır. Çatılar, bu ortak temel öğeler için bir alt yapı ve bir tasarım deseni ortaya koymaktadırlar. Böylece uygulama geliştirici veri tabanı ve kullanıcı yönetimi gibi temel konularda daha az zaman harcayarak asıl zamanını uygulama üzerine yoğunlaştırması mümkün olabilmektedir. Ayrıca çatılar, programcıları belli kurallar içinde kod yazma zorlamaktadır. Böylece geliştirilen kodlar daha basit, anlaşılır ve hataları daha kolay ayıklanabilir olmaktadır.
PHP çatılarının çoğu MVC (Model-View-Controler, Model-Görünüm-Kontrolcü) tasarım desenini kullanmayı
zorunlu kılmaktadırlar. MVC tasarım deseni, kullanıcı etkileşimi gerektiren uygulamalar için geliştirilen tasarım desenlerinden en yaygın olarak kullanılanıdır. Tasarım desenlerinin ortaya çıkmasındaki sebep, daha önce birçok geliştiricinin karşılaşmış oldukların problemlere ortak bir çözüm yolu sunuyor olmasıdır. Örneğin MVC tasarım deseni, uygulamanın görünüm (sunum) katmanı, kontrolcü (business logic) katmanı ve model (veri yönetimi) katmanının nasıl birbirinden ayrılabileceği konusunda geliştiricilere yardımcı olur.
Model katmanı; veri tabanı ile ilgili işlerde kullanılan katmandır. Görünüm katmanı, kullanıcı arayüzünün geliştirilmesi için kullanır, HTML, CSS ve JavaScript gibi kodlar bu bölümde bulunur. Kontrolcü katmanı ise organizasyonun yapıldığı bölümdür. Bu katman ile geliştirici sistemdeki Modelleri ve Görünümleri yöneterek uygulamanın kullanıcıları ile olan etkileşimleri yönetir. Kontrolcü genel olarak hesaplamaların ve yönetim işlerinin yapıldığı bölümdür. Model ve Görünüm katmanlarının Kontrolcü katmanına ulaşması mümkün değildir. Görünüm katmanı Model katmanına ulaşılabilmektedir.
MVC tasarım desenin kullanılmadığı bir web uygulamasında veri tabanına erişim, yönetim ve kullanıcı arayüzü kodlarının tamamı tek bir PHP dosyasına yazılabilir. Bu yazılacak kod miktarını azaltacak ve kodların çalışma performansını arttıracaktır. Ancak bu yazım şekli bazı önemli problemleri beraberinde getirmektedir. Web uygulamalarında kullanıcı arayüzlerinde sık sık güncellemeler ve değişimler olabilmektedir. Uygulamanın yönetim ve veri yönetimi bölümlerinde ise daha seyrek değişimler olur.
Laravel çatısı da MVC desenini destekleyen bir PHP web uygulama geliştirme çatısıdır. Laravel çatısı MVC desenini kullanmayı zorunlu kılmaktadır. Açık kaynak kodlu olan Laravel’in geliştirilmesine tüm dünyadan çok sayıda geliştirici destek vermektedir ve dünyada yaygın kullanılan PHP çatılarından biridir.
Laravel çatısı MVC tasarım desenini kullanmayı mecbur bırakması yanında Elequent teknolojisi ile veri tabanı yönetimi, uluslararasılaştırma teknolojisi ile web uygulamasını çoklu dil desteği, ön-bellekleme, kullanıcı yönetimi ve rol tabanlı erişim kontrolü ve test araçları vb. gibi özellikler ve araçlar içermektedir. Bu özellikler ve araçlar sayesinde Laravel çatısı uygulama geliştirme zamanını önemli ölçüde azaltabilmekte ve Laravel’in kurallarına uygun davranıldığında oldukça güvenli sistemler ortaya konabilmektedir. Laravel çatısı birçok özelliği içinde barındıran oldukça kapsamlı bir çatıdır.