PHP EĞİTİM KİTABI

PHP Eğitim Kitabı, DRY, SOLID ve MVC gibi metodolojileri temel alan PHP özelinde bir programlama eğitim kitabıdır. Kitabımızın, bu metodolojileri benimsemiş, küresel standartlarda PHP uygulamalar üretebilen geliştiriciler olunması yolunda bir başucu kitabı olması dileğiyle.


Satış Noktaları


Önsöz

PHP, öğrenilmesi kolay, gelişmiş, sunucu taraflı ve en önemlisi açık kaynaklı bir betik programlama dilidir. PHP ismi, “Hypertext Preprocessor” kelimelerinin kısaltılmasıyla ortaya çıktı. 2018 yılının aralık itibariyle PHP, sunucu tarafında kullanılan programlama dillerinin %82’sini oluşturmaktadır. Oranın bu kadar yüksek olmasında en büyük etken, PHP tabanlı WordPress gibi içerik yönetim sistemleridir. Bu hazır içerik yönetim sistemlerini dikkate almasak bile, Web’in %50’den fazlasına PHP’nin güç verdiğini düşünebiliriz. Web uygulamaları başlığında PHP, kullanım oranı olarak uzun yıllardır rakiplerinden açık ara öndedir. Dilin gelişim sürecini incelediğimizde 5. ve 7. majör versiyonları PHP için dönüm noktalarıdır. PHP7 aynı zamanda PHPNG (PHP New Generation) ismiyle anılmaktadır. PHP, yayınlandığı ilk zamanlarında görece yavaş ve bazı tutarsızlıklar barındıran bir dildi. Yıllar içerisinde yeni versiyonları ile oldukça kararlı bir dil haline geldi. 2009 yılında 5.3 sürümünün yayınlanmasından sonra nesne yönelimli diller listesinde kendine yer buldu. En son majör sürüm olan PHP7 ile modern, son derece hızlı ve güçlü bir şekilde nesne yönelimliliği tam olarak destekleyen bir yapıya kavuştu. DRY, SOLID ve MVC gibi metodolojiler ile PHP, güçlü, iyi bir çeşitliliğe sahip, birçok özelliği sorunsuz sunabilecek hızlı bir dildir. Çalışmamızın, bu metodolojileri benimsemiş, küresel standartlarda PHP uygulamalar üretebilen geliştiriciler olunması yolunda bir başucu kitabı olması dileğiyle.

Mehmet Ali UYSAL


İÇİNDEKİLER

  • Giriş
    • PHP Nedir?
    • PHP ile Neler Yapılabilir?
    • PHP’nin Kullanım Alanları ve Avantajları Nelerdir?
    • Neler Öğrendik?
  • Ayarlamalar ve Kurulum
    • Geliştirme Ortamının Hazırlanması
    • IDE Seçimi ve Kurulumu
    • Apache, PHP ve MySQL Kurulumu
    • Yerel Sunucu Ayarlarının Yapılması
    • Neler Öğrendik?
  • PHP’nin Temelleri
    • Giriş
    • Syntax
    • Neler Öğrendik?
  • PHP’de Değişkenler ve Sabitler
    • Değişkenler
    • Sabitler
    • PHP’de Kaçış Sekansları
    • Neler Öğrendik?
  • Veri Tipleri
    • PHP’de Veri Tipleri
    • PHP’de Tür Dönüşümleri
    • Neler Öğrendik?
  • PHP’de Operatörler
    • Aritmetik Operatörler
    • Atama Operatörleri
    • Artırma ve Azaltma Operatörleri
    • Karşılaştırma Operatörleri
    • Mantıksal Operatörler
    • Neler Öğrendik?
  • PHP’de Koşullu İfadeler
    • if İfadesi
    • else İfadesi
    • elseif İfadesi
    • switch İfadesi
    • Üçlü Koşul Operatörü
    • Neler Öğrendik?
  • PHP’de Diziler
    • PHP’de Dizilerin Tanımlanması
    • PHP’de Dizi Elemanlarına Erişim
    • PHP’de Diziye Eleman Ekleme
    • PHP’de Diziden Eleman(ları) Silme
    • Neler Öğrendik?
  • PHP’de Dizilerde Sıralama
  • PHP’de Dizilerde Dahili İşaretçiler
  • PHP’de Çok Boyutlu Diziler
    • Çok Boyutlu Dizilerin Tanımlanması
    • Çok Boyutlu Dizi Elemanlarına Erişim
    • Neler Öğrendik?
  • PHP’de Dizi Fonksiyonları
  • PHP’de Döngüler
    • Giriş
    • PHP’de for Döngüsü
    • PHP’de foreach Döngüsü
    • PHP’de while Döngüsü
    • PHP’de do…while Döngüsü
    • Neler Öğrendik?
  • PHP’de Ön Tanımlı Değişkenler
    • $GLOBALS
    • $SERVER
    • Neler Öğrendik?
  • PHP’de Fonksiyonlar
    • PHP’de Fonksiyon Tanımlanması
    • PHP’de Fonksiyon Argümanları
    • PHP’de Değişkenlerde Etki Alanı (Variable Scopes)
    • PHP’de Fonksiyonların Varlığının Kontrol Edilmesi
    • PHP’de Tanımlı Tüm Fonksiyonların Görüntülenmesi
    • PHP’de Bir Değişkenin Fonksiyon Gibi Çağırılabilmesi
    • PHP’de Anonim Fonksiyonlar
    • PHP’de İç İçe Fonksiyonlar
    • PHP’de “Static” Anahtar Sözcüğü ve Fonksiyonlarda Kullanımı
    • PHP’de Özyineli Fonksiyonlar
    • PHP’de Üreteç Yapısı ve Üreteç Fonksiyonlar
    • PHP 7’De Tip Beyanı ve Dayatması
    • Neler Öğrendik?
  • Nesne Yönelimli Programlama
    • Nesne Nedir?
    • Nesne Yönelimi Programlama Nedir?
    • Sınıf Nedir? Nesne ile Farkı Nedir?
    • Nesnelerde Görünürlük
    • Statik Kavramı ve Sınıf Sabitleri
    • Sihirli Metotlar
    • Try, Catch, Finally Yapıları ve İstisna ile Hata Yönetimi
    • Neler Öğrendik?
  • Nesnelerde Kapsülleme ve Bilgi Gizleme
    • Koruma Maddeleri (Guard Clauses)
    • Nesnelerde Kapsülleme ve Bilgi Gizleme
    • PHP’de Dosya Dâhil Etme
    • Neler Öğrendik?
  • Nesnelerde Kalıtım ve Çok biçimlilik
    • Kalıtım (Inheritance)
    • Çok biçimlilik (Polymorphism)
    • Kalıtım, Çok Biçimlilik ve Kapsülleme Örneği
    • Neler Öğrendik?
  • Soyutlama
    • Nesnelerde Soyutlama
    • Singleton Tasarım Deseni
    • Neler Öğrendik?
  • Nesne Arayüzleri ve Ortak Nitelik Sınıfları
    • Arayüzler
    • Ortak Kullanılabilen Nitelikler
    • Metot Zincirleme
    • Neler Öğrendik?
  • PHP’de İsim Alanı Kullanımı ve Otomatik Yükleme
    • PHP’de İsim alanı (Namespace) Kullanımı
    • Otomatik Yükleme
    • Neler Öğrendik?
  • Nesne Yönelimli Programlamada SOLID Tasarım Prensipleri
    • Tek Sorumluluk Prensibi
    • Açık/Kapalı Prensibi
    • Yerine Geçme Prensibi
    • Arayüz Ayrıştırma Prensibi
    • Bağımlılığın Ters Çevrilmesi Prensibi
    • Neler Öğrendik?
  • PHP’de Tarih ve Zaman İşlemleri
    • Tarih zaman fonksiyonları
    • Zaman Karşılaştırma
    • Mevcut Zamanı Manipüle Etme
    • Neler Öğrendik?
  • Çerez ve Oturum İşlemleri
    • Çerezler
    • PHP’de Oturum İşlemleri
    • PHP’de Oturum Güvenliği
    • Neler Öğrendik?
  • PHP’de Form İşlemleri
    • HTML Formlar
    • $_GET ve $_POST Dizi Değişkenleri ile Form İşleme
    • Neler Öğrendik?
  • Veritabanı
    • LAMP
    • MySQL
      • MySQL’in Temel Özellikleri
      • MySQL Yönetim Araçlar (GUI)
      • Veritabanı tasarımı
    • PHP ile Veritabanı Bağlantısı
    • PDO ile CRUD işlemleri (CREATE/READ/UPDATE/DELETE)
    • Neler Öğrendik?
  • MVC Yazılım Mimari Deseni
    • Model Katmanı
    • Controller Katmanı
    • View Katmanı
    • Neler Öğrendik?
  • TO-DO List (Yapılacaklar Listesi) Projesi
    • İhtiyaç ve Proje Analizi
    • Tasarım
    • Programlama
      • Uygulama Çatısı
      • TO-DO List Uygulaması
    • Neler Öğrendik?
  • PHP’de Web Servis ve REST, SOAP, CURL Yapıları
    • REST API
    • CURL
    • SOAP
    • Neler Öğrendik?
    • Sonsöz

Sonsöz

Evet arkadaşlar, uzun yıllardır popüler bir teknoloji olan PHP programlama dili, eğitim kitabını bitirdik. Artık bir PHP Geliştiricisi olduğunuzu varsayarak bundan sonrası için sizlere birkaç şeyden bahsetmek ve bir kaç tavsiyede bulunmak isterim. Her çapta web uygulaması için tercih edilebilecek dillerin başında PHP vardır desek abartmış olmayız. Platform bağımsız yapı, betik dili olması, ücretsiz olması, geniş geliştirici kitlesi en büyük avantajlarıdır. PHP doğru yapılandırma ve kodlama ile çok ağır yüklerin altından sorunsuzca kalkabilir. Bu bağlamda doğru noktadayız… Bir dilin baştan sona tüm özellikleri bir kitapta anlatılamaz. PHP.net, PHP’nin baştan sona tüm özelliklerinin açıklandığı, Türkçe dil desteği bulunan dokümantasyon sitesidir. Üstün körü bu özellikleri bir kitapta açıklamak bile on binlerce sayfayı bulabilir ve PHP.net gibi bir sayfa var iken gereksiz bir çalışma olur. Kitabın baştan sona okuduğumuzda PHP özelinde programlama ve genel programlama metodolojileri üzerinde durduk diyebiliriz. PHP’nin sağladığı ön tanımlı ve yardımcı öğeler haricinde ki kontrol yapıları, koşullu ifadeler, diziler, döngüler, nesne yönelimi programlama gibi konular, diğer programlama dillerinin de temel yapı taşlarını oluşturur ve programlama dilleri arasında sadece söz dizimi (syntax) farkları vardır. Bu başlıklarda öğrendiğimiz yapıların aynılarının, diğer programlama dillerinde de olduğunu düşünebiliriz. Kitabın son bölümlerinde popüler bir PHP Uygulama Çatısını (framework) anlatmadık ya da sizi o istikamete yönlendirmedik. Tüm uygulama çatılarının ortak payda da nasıl çalıştığını sizlere anlatmaya çalışarak, tercihi size bıraktık. Konuları ilk olarak programlama genelinde sonrasında PHP özelinde tutmamızın sebebi, programlama dillerinin ya da uygulama çatılarının, bir işi yapmak için araçlar olarak görülmesi gerektiğinden kaynaklanıyor. Programlama dillerine bu açıdan bakarsak kafamızdaki bir programlama diline ya da uygulama çatısına aidiyet tabusunu yıkabilmiş oluruz. Umuyorum ki zaman içinde başarılı bir PHP geliştiricisi olacaksınız. Yeni bir teknoloji öğrenmek, farklı amaç içeren uygulamalar üretmek isteyeceksiniz. PHP’yi genel programlama prensiplerinden kopuk öğrenmediğimiz için yeni bir dil öğrenmek umuyorum ki çok zorlayıcı olmayacak. Örneğin, geliştirdiğiniz ve her noktasına hâkim olduğunuz PHP web uygulamasının, akıllı telefon uygulamasını (android) da geliştirmek istediniz. Bu durumda PHP dünyamızın dışına çıkmamız gerekecek ve karşımıza Java&Andorid ikilisi çıkacak. PHP de nesne yönelimliliği ilk plana aldığımız için Java, ASP.net, Swift öğrenmek bizim için sadece platformu ve işleyişini öğrenmekten ibaret olacak. PHP’de prosedürel geliştirme yapan ve nesne yönelimli programlamaya uzak olan yazılımcılar için bu durum, maalesef çok zorlayıcı olabilmektedir. Bu bağlamda ilk ve en önemli tavsiyem, PHP’de nesne yönelimli kodlamanın ilk tercihiniz olması ve geliştirdiğiniz uygulama kod tabanının DRY ve SOLID prensiplerini barındırmasıdır. Peki PHP’de prosedürel kodlama yapmayacak mıyız diyebilirsiniz. Tabi ki bu yöntemi de kullanacağız ama genel metodolojilerden yine uzak durmayacağız. Bir başka konu ise, açık kaynaklı yazılımların güvenilirliği ile ilgili süre gelen tartışmalar ya da ön yargılardır. “Bedava bir teknolojiyi şirketlerin kullanması uygun olur mu?”, “Kurumsal seviyede çözümler üretilebilir mi?” gibi tamamen bilgi kirliliğinden kaynaklanan soruları karışınıza çıkabilir. Öncelikle bu sorulara PHP için cevap aramanıza gerek olmadığını rahatlıkla söyleyebiliriz. İstatistiklere göz atmak yeterlidir. Hazır içerik yönetim sistemleri ile birlikte tüm web’in en az %80’inin sunucu tarafına PHP’nin güç verdiğini biliyoruz(Her 10 siteden 8’i). Ya da Facebook, Wikipedia, Yahoo ve Google’ın PHP türevlerini kullandığı gerçeği, bu tartışmaların yersiz olduğunun bir başka göstergesidir. Bu bilgiler ışığında web programlama için PHP, mevcut durumda çok popüler ve gelecekte de popüler olacak bir dildir. PHP hakkında çıkan bu ön yargıların nelerden kaynaklandığını kitabımızda tür dönüşümleri konularında değinmiştik. Biliyoruz ki PHP esnek ve “loosely typed” (net tür belirtilmemiş) bir dildir. Ancak bu durumun geliştiricinin sorumluluğunda olduğunu, SOLID, DRY gibi prensipler ile söz konusu olmayacağını öğrendik. Kitapta öğrendiğim şeylerle PHP geliştiricisi olarak çalışabilir miyim? sorusuna cevap verelim. Evet kesinlikle çalışabilirsiniz. Hatta yazılım prensiplerini göz ardı etmeyen örnek uygulamalarınızla ülkemizde, bir değil iki adım önde olacaksınız. Bu aşamada bir konuya daha açıklık getirmek istiyorum. Ülkemizde birçok küçük ve orta ölçekli yazılım firmasında ya da ajansında proje yönetimi, maalesef çok basite indirgeniyor. Fikir geliyor sonrasında programcıya proje kabataslak anlatılıp, bu projenin kodlanması görevi verilmesi ile proje geliştirilmeye başlanıyor. Bir nevi “Kervan yolda düzülüyor”. Bu noktada geliştiricinin çok donanımlı olması ve birçok şeyin sorumluluğunu üstlenmesi gereken bir durum oluşuyor. Uygulamanın arayüz (frontend) kodlaması, arka taraf (backend) kodlaması, Kullanıcı Deneyiminin uygulanması (UX), kullanılacak teknolojilerin belirlenmesi, veritabanı modelinin oluşturulması gibi tüm görevlerinin sorumluluğunu tek bir geliştiriciye bırakılabiliyor. Maalesef çok doğru olmayan bu durumla ülkemizde sıklıkla karşılaşıyoruz. Çok aranan bu geliştirici profili FSD “Full Stack Developer” olarak isimlendirilmektedir. Bilgi birikimi olarak “Full Stack Geliştirici” uygulamada kullanılan tüm teknolojilere hakimdir ve Backend ya da Frontend geliştiricilere göre doğal olarak daha yüksek ücretlerle çalışmaktadır. Full Stack Geliştirici olmayı kötü bir şey olarak algılamamalıyız aksine Full Stack Geliştirici projeyi yönetebilecek özellikleri barındırır. Ancak bir projede tüm kısımların sorumluğunu bir geliştiriciye vermek, hem geliştirici sağlığı hem de geliştirilen projenin sağlığı açısından sıkıntı bir durumdur. Bu bağlamda seçme şansınız var ise bir alanda kalmak ilk etap için daha doğru olacaktır. “Full Stack Developer”’ın takım liderliği ya da proje yönetimi görevini üstlenmesi daha doğru bir iş bölümüdür. Peki “Full Stack Developer” olmak için ne yapmalıyız. Kitabımızda veritabanı içeren bir proje olan TO-DO List projesini baştan sonra çalışır hale getirdik. Veritabanı tasarımı (MySQL), “Frontend” (arayüz tasarım ve kodlama(Javascript)) ve “Backend” (PHP kodlama) yaptık. Bu örnekleri tam olarak anlayabiliyor ve benzer bir projeyi geliştirebiliyor isek “Full Stack Developer” niteliklerini taşıyoruz demektir. Kitabımızda HTML, CSS ve Javascript (jQuery) konularını yüzeysel olarak proje geliştirme aşamasında gördük. Bu yapıların hepsi birer kitaba konu olabilecek kavramlardır. Bu bağlamda PHP’den sonra ya da eş zamanlı olarak HTML, CSS ve özellikle Javascript başlıklarına odaklanmalısınız. İşaretleme dili öğrenmeyi (HTML ve CSS), bir programlama dilini öğrenme ile kıyaslarsak, işaretleme dili (Markup Language) öğrenmenin çok çok daha kolay olduğunu söyleyebiliriz. Bootstrap gibi hazır yapılar sayesinde, başarılı arayüzler geliştirebilir hale çok kısa bir sürede geleceğinizden emin olabilirsiniz. Gelelim Javascript’e… Javascript işaretleme dili değil, PHP gibi betik bir programlama dilidir. Temel fark, PHP sunucu tarafında çalışır, Javascript istemci (tarayıcı) tarafında çalışır. Javascript, web uygulamalarının istemci tarafında, reelde alternatifsiz olduğu için en çok kullanılan programlama dilidir desek yanlış olmaz (Javascript ile Java’yı karıştırmayalım sadece isim benzerliği). 2000 li yılların başlarında internet alt yapısının gelişmesiyle birlikte masaüstü uygulamaların yerini, web uygulamaları almaya başladı. Ancak web uygulamalarının arayüzlerinin masaüstü uygulamalarının arayüzleri kadar işlevsel olabilmesi (olaylar, asenkron işlemler) için javascript kullanmak olmazsa olmaz bir hale geldi. Javascript’i, PHP de olduğu gibi bir uygulama çatısı (MVC çatılar) olmadan ya da bir kütüphane olmadan kullanmak o dönemde gerçekten zorlayıcı ve can sıkıcı olabiliyordu. Bunun sebebi dilin tutarsızlığı değil Javascript kodlarını yorumlayan tarayıcıların çeşitliliği idi. Firefox, Javascript komutlarını olması gerektiği gibi yorumlarken, Internet Explorer kendi prensipleriyle yorumlayabiliyordu. Bu durumda arayüz geliştiricisi, Javascript farklı yorumlayan tarayıcılar için ayrı kodlar yazmak zorunda kalıyor geliştirme ve test süreçleri iki katına çıkabiliyordu. Yeni başladıysanız neyse ki o sancılı dönemleri görmediniz. 2006 yılında John Resig isimli bir mühendis tarafında ücretsiz jQuery adında bir Javascript kütüphanesi geliştirildi. Bu web arayüz teknolojileri için bir işaret fişeği oldu diyebiliriz. Bu kütüphane “Pure Javascript (Yalın Javascript)” ile 20 satırda yapılabilecek bir işlemi bir satıra indirdi. Bunun yanında çapraz olarak tüm tarayıcıların kararsızlıkları, çatı (jQuery) başlatıcı metotları (initiliaze) sayesinde tespit edilerek, tarayıcıya uygun farklı kodları çalıştırma sorununu büyük oranda ortandan kaldırdı. Web uygulamaları jQuery ve türevleri araçlar sayesinde çok daha fazla kullanıcı etkileşimli ve özellikli hale geldi. Yayımlandığı günden günümüze kadar jQuery, en çok tercih edilen ve her 10 web sayfasının 9’unda çalışan bir teknoloji durumundadır. Bu bilgiler ışığında HTML ve CSS’den sonra ya da eş zamanlı olarak Javascript’i öğrenip, jQuery çatısını kullanan etkileşimli arayüzleri kolaylıkla üretebiliriz. Sonuç olarak bir web uygulamasını baştan sonra geliştirebilecek bilgi birikimine sahip olabiliriz. Toparlamak gerekirse, Kitabımızda PHP dilinin temellerini, PHP’nin Apache’nin MySQL’in bir sunucu mimarisi içinde birlikte nasıl çalıştığını kavradık. Nesne yönelimli programlama ile MVC desenini, SOLID prensiplerin ne olduğu hakkında bilgi sahibi olduk. Proje planlama ve gereksinim analizinin ne olduğunu öğrendik. İlişkisel bir veritabanı modeli oluşturduk, uyguladık ve örnek bir web uygulamasını baştan sonra kodladık. Hepsinden önemlisi bir özelliğin geliştirilmesi için kod bilgisinden ziyade, bir kodun, bir özelliğin nasıl öğrenilebileceğini öğrendik. Programlama dillerinin de bir programcı tarafından yazıldığını ve dilin özelliklerinin, geliştiricinin anlayabileceği en iyi şekilde sunulmaya çalıştığını gördük. Örneğin PHP’de “strtoupper“ isimli bir fonksiyon gördüğümüzde, PHP’yi yazan programcının “String To Upper (Büyük harfe çevir)” demek istediğini düşünmeye başladıysak, olmaya başladık diyebiliriz :). Bu aşamalardan sonra fonksiyon ismini ya da kodu ezberlemek yerine, yapılmak istenen şeyi doğru bir şekilde aramanın, en büyük bilgi kaynağı olması gerektiğini artık biliyoruz. Son olarak, şayet bilmiyorsanız en azından teknik terimleri anlayacak seviyede İngilizce öğrenmeniz, gelişim sürecinize büyük katkı sağlayacaktır. Sözlerime ve kitaba son noktayı koyarken, bu çalışmanın yazılım kariyerinizde bir fayda sağlamış olmasını umuyorum. Kitabımızda olası hatalar, anlaşılmayan ya da sizce eksik olan noktalar mutlaka vardır. Bunları bizimle paylaşırsanız bir sonraki baskımızda olabildiğinde bu konuların üzerine yoğunlaşacağımızdan emin olabilirsiniz. Anlaşılmayan noktalarda e-mail yoluyla bana ulaşırsanız, elimden geldiğince yardımcı olmaktan mutluluk duyarım. Geliştirmekten, gelişmekten, öğrenmekten, öğretmekten, paylaşmaktan ve en önemlisi merak etmeden asla vazgeçmeyin.

Saygılarımla
Mehmet Ali UYSAL
[email protected]
[email protected]


Mehmet Ali UYSAL - Yazar

Evli ve 2 çocuk babası olan yazar, 1986 yılında Eskişehir'de doğdu. Bilgisayarla ilk olarak 10 yaşında babasının aldığı i486 ile tanıştı. O günden beri merak ve hevesini hiç kaybetmeden kendisini geliştirmeye devam etti. İşletme Lisans Eğitimi sonrasında, Bilişim Anabilim dalı Yüksek Lisans eğitimini Marmara Üniversitesi’'nde tamamladı. Web & mobil uygulama geliştiricisi olarak devlet kurumlarında ve özel sektörde 8 sene çalıştı. 2014 yılında istanbul merkezli Gelistir Bilgi Teknolojileri (Gelistir.org) yazılım firmasını kurdu. Patentli bir çok projesi olan yazar, Tailor Made yazılımlar üreten genç, dinamik ve meraklı bir geliştici kadrosunun ekip liderliğini yapmaktadır. Ulusal ve uluslar arası bilindik bir çok markaya yazılım, yazılım danışmanlığı, yazılım güvenliği ve proje yönetimi konularında hizmet vermektedir.


Yorumlar