Skip to main content
PHP

PHP PSR Nedir?

Uzun bir süredir bir makale yayımlamaya vaktim olmadı. Bir Türk yazılımcı arkadaşla bir süre önce görüşürken PSR‘ın konusu açıldı. Yeni yeni çalışma düzenimin normale döndüğü bu dönemlerde banada bir makale için fikir vermiş oldu.

PSR yani PHP Standards Recommendation (Önerilen PHP Standartları), PSR-0, PSR-1, PSR-2, PSR-3, PSR-4 olmak üzere toplam 5 ana başlığa ayrılmıştır. Önerilen kelimesi sizi kandırmasın, PHP piyasasında yazılımcıdan istenen ilk şartlar arasına sizler bu yazıyı okurken girmediyse bile yakında girmeye başladığını göreceksiniz.

PSR’da Nereden Çıktı?

PHP malesef hiç bir zaman gerçek anlamda bir kodlama standartlarına sahip olmadı. Belkide bir çoğumuz PHP’yi bu sebeple seçtik. İstediğimiz gibi, kendimize en uygun gelen şekilde yazılım yapma özgürlüğünü bizlere sunuyor.

Bazı yazılımcılar PEAR, Zend Framework gibi iyi belgelenmiş standartları kullanırken bazı yazılımcılarda kendi frameworklarını, kendi standartlarını uygulamayı tercih ediyorlar. Bu özgürlük ilk bakışta özellikle yazılıma yeni atılan kişilere ne kadar iyi gözüksede aslında ciddi anlamda büyük problemlere sebebiyet veriyor. Örneğin bazen başka bir yazılımcı tarafından yazılmış bir işi alıp üzerinde biraz değişiklik yapmak, sadece kendi projenize entegre etmek hatta ve hatta bazen kodu okumak, ne yapmaya çalıştığını anlayabilmek bile bir kabusa dönüşebiliyor.

2009 yılında PHP|tek konferansında farklı projeleri temsil eden PHP yazılımcıları farklı projelerde çalışma hakkında tartıştılar. Tahmin edebileceğiniz gibi ana, asıl konu belirli bir standartlara uymaktı.

Bir süre öncesine kadar kendilerini PHP Standards Group (PHP Standartları Grubu) olarak adlandırıyorlardı. Bu ismin amaçlarını olması gerektiği gibi yansıtmadığını düşündükleri için adlarını Framework Interoperability Group (FIG) olarak değiştirdiler.  FIG üyeleri kendi aralarında bazı PHP standartları belirliyorlar.

Framework Interoperability Group (FIG)

Framework Interoperability Group ismindeki Framework kelimesi sizi aldatmasın. FIG üyeleri içerisinde Symfony, Laravel, Lithium, CakePHP gibi frameworkların yanında PyroCMS, phpDocumentor, Joomla, Drupal, phpBB hatta ve hatta Composer dahi bulunmakta.

Her PHP yazılımcısı, hatta ve hatta isteyen herkes FIG topluluğuna katılabiliyor. Topluluk üyeleri neyin Önerilen PHP Standartları listesine giip giremeyeceği konusunda herhangi bir yaptırımı malesef yok. Bu liste FIG üye proje temsilcileri (her proje bir temsilciye sahip, sitelerinden proje ve temsilcilere ulaşabilirsiniz) tarafından öneri ve oylama yoluyla seçilmektedir.

FIG’ın kısaca amacı belirli bir PHP kodlama standardı oluşturmak. PSR bir kodlama yapmak zorunda değilsiniz. Hatta ve hatta FIG üyeleri bile bu kurallara uyarak kodlama yapmak zorunda değiller.

Makalemin başında da belirttiğim gibi Önerilen PHP Standartları (PSR) önerilen kelimesi sizi “isteğe bağlı, istersek kullanırız” gibi düşüncelere itmesine izin vermeyin. PHP toplulukları tarafından yakından takip edilmeleri, bu tarz topluluklardan, projelerden destek görmeleri yakında her PHP yazılımcısının bir echo kullanımı gibi bilmesi gereken temel başlıklardan biri olacak.


PSR-0: Autoloader Standard


Eskiden sayfaya sınıf dosyalarımızı require ile ekleyebiliyorduk. PHP 5 ile birlikte gelen __autoload() ile bazı şeyler yavaş yavaş değişmeye başladı. PHP 5.1.2 işleri bir adım daha ileri götürerek spl_autoload() fonksiyonunu tanıttı. Bu fonksiyon sayesinde ardı ardına, zincirleme halinde autoload fonksiyonlarımızı spl_autoload_register().

Autoloading (otomatik yükleme) fonsiyonelliği ne kadar iyi olsada uygulamada nasıl yapılması gerektiği hakkında herhangi bir yaptırımı yok. Örneğin projenizde resimlerinizle ilgili işlemleri yapacak (thumbnail oluşturma, kırpma v.s. v.s.) kullanmak istediğiniz resim kütüphanesi sınıf ve dosya yapılarına farklı bir şekilde yaklaşırken Google servislerine bağlanmanız için gerekli olan Google kütüphanesi sınıf ve dosya yapılarına farklı olarak yaklaşabilir. İşin kötü tarafı bu iki kütüphaneyide aynı proje içerisinde kullanmanız gerekiyor.

Bir PHP yazılımcısı olarak mutlaka bu sorunla kariyerinizin bir noktasında karşılaştınız ve büyük ihtimalle bu makeleyi yazdığım dönemde de halen karşılaşmaya devam ediyorsunuz. Eğer benim gibiyseniz PSR’lı bir alternatif aramaya başlıyorsunuz ya da oturup kütüphanede düzenleme yapmaya başlıyorsunuz.

İşte PSR-0 tam olarak burada devreye giriyor. FIG bu konuda PSR-0 kurallarına uygun bir autoloader fonksiyonu örneği sunuyor;

Eğer OO bir çözüm arıyorsanız ya da PHP 5.3 ve üzeri bir sürüm kullanıyorsanız FIG’ın hazırlamış olduğu, PHP 5.3 ve üzeri için önerilen SplClassLoader sınıfını kullanabilirsiniz.


PSR-1 Temel Kodlama Standartları


FIG PSR-0’dan sonra yaklaşık 1 – 1.5 yıl kadar oldukça sessiz kaldı. Ardından PSR-1 ve PSR-2 ile geri dönüş yaptı.

PSR-1 temel kodlama standartlarına odaklanmıştır. Çok detaya kaçmadan, temel kurallar belirleyerek paylaşılan / birden fazla programcının üzerinde çalıştığı PHP kodlarında yüksek seviyede paylaşım imkanı sunmaktadır.

Kısaca PSR-1 standartları şöyledir;

  • Sadece <?php ve <?= etiketlerini kullanın.
  • PHP kodları için sadece UTF-8 (BOM suz) kullanın.
  • Yan-etkileri ve tanımları ayırın.
  • PSR-0 uygulanmalı.
  • Sınıf isimleri StudlyCaps olarak tanımlanmalıdır.
  • Sınıf constantları tanımlamalarında tamamiyle büyük harfler kullanılmalı ve ayıraç olarak sadece _ kullanılmalıdır.
  • Method isimleri camelCase kullanılarak tanımlanmalıdır.

PSR-1 genel olarak isimlendirme ve dosya / klasör yapısına odaklanmıştır. Böylece 3. parti kütüphane / kodları sisteminize ekleseniz dahi, üst seviyeden bakıldığında dosya, klasör yapıları birbirleriyle aynı olacak, proje tam bir bütün olarak gözükecektir. Aksi takdirde özellikle büyük projelerde, projenin arap saçına dönmemesi kaçınılmaz olur.

 


PSR-2: Kodlama Stili


PSR-2 bir bakıma PSR-1’in uzaltılmış, genişletilmiş hali diyebiliriz. PSR-2’nin amaçı paylaşılan PHP kodlarında ortak bir formatlama, kodlama stili sağlamaktır. Bu standartlar belirlenmeden önce FIG üyeleri (oylama yapabilen, FIG üyesi her projelere ait birer temsilci) tarafından uzun bir oylama ve anket sonucunda ortaya çıkarılmışlardır.

PSR-2’ye ait kurallar, FIG üyeleri tarafından kararlaştırılmış kurallardır ve her PHP yazılımcısının kodlama stili tercihi olmayabilir.  FIG’in kuruluşunun başından beri bu kurallar FIG’e üyeleri kendi içlerinde oylama yaparak kendi projelerinde uygulayacakları standartları belirlemek için oluşturulmaktadır. Bu standartların FIG dışına çıkıp genel olarak PHP toplulukları tarafından kabul edilip uygulanmaya başlanması FIG için sadece olumlu bir dönüşüm / sonuç olmuştur.

PSR-2 kodlama stili standartlarını fig-standards Github deposunda bulabilirsiniz. Kesinlikle okumanızı ve hatta yavaş yavaş bu kodlama stilini uygulamaya başlayarak alışmanızı öneririm.

Tabii bazı yazılımcıların isimlendirme (method, sınıf v.s.) ve boşluk yerine tab kullanma gibi kodlama tercihleri nedeniyle PSR-0 ve PSR-1’i uygularken özellikle PSR-2’nin bazı konularını göz ardı ettiklerini gözlemleyebilirsiniz.


PSR-3: Logger Interface


PSR-3 FIG tarafından 27 Aralık 2012’de 18 – 0 (8 üye oy kullanmadı) gibi büyük bir farkla kabul edilmiş Önerilen PHP Standardıdır (PSR).

PSR-3 ortak / paylaşılan, The Syslog Protocol (RFC 5424)‘un 8 Syslog seviyesiyle (debug, info, notice, warning, error, critical, alert ve emergency) birlikte çalışan bir logger arayüzünü tanımlamaktadır.

Syslog’un 8 seviyesi metod isimleri olarak tanımlanmışlardır ve sadece 2 parametre kabul etmektedirler;

  1. string $message; log yazısı
  2. array $context (opsiyonel); log yazımıza uymayan ek veriler.

PSR-3 gibi standartlaştırılmış ortak ara yüzler sayesinde frameworklar, kütüphaneler v.s. gibi uygulamalarda yazılımcılar serbest olarak istedikleri, tercih ettikleri şekilde entegrelerini yapabilirler.


PSR-4: Geliştirilmiş Autoloader


Evet, yeni bir autoloader daha! İyi haber ise PSR-0’ın kullanıldığı herhangi bir sisteme kolaylıkle eklenebilinir. Bu konuda uzun uzun yazmaktansa direk olarak FIG’in PSR-4 sayfasını ziyaret etmenizi öneririm.


Eleştiri


Elbette FIG’ın aldığı bu kurallar, oluşturdukları bu standartlar tepki çekmiyor değil. Bazı kişiler FIG’ın özellikle kodlama stilini bile standartlaştırarak (özellikle PSR-2) hadlerini aştıklarını düşünüyorlarken, bazıları ise bu kurallarla yaratılan ortak / paylaşılan kodların kendine özgü olduğunu, ve esnek olmadığını düşünüyorlar. Fakat bu noktada unutulmaması gereken asıl konu, her standartlaşmayla birlikte mutlaka eleştride gelecektir. Bunun sebebini en kısa şekilde açıklamak gerekecek olursak; herkesin zevki aynı değil.

Her ne kadar zevkler ve renkler konuları ayrı olsada Önerilen PHP Standartlarıyla (PSR) ortaya konulan projelerde, 3. parti bir eklenti / kütüphane gerektiğinde direk olarak projenize bir değişiklik yapmadan ekleyip hemen çalışabilmenize ortam sağlaması gibi büyük bir avantajı asla hiç bir şekilde göz ardı edilemez.

Bu konuda FIG, PHP topluluğuna kattığı Önerilen PHP Standartları (PSR) ile son derece mükemmel bir iş çıkarıyor.


Gelecek


FIG’e üye projelerin sayısının istikrarlı ve hızlı bir şekilde artış göstermesi nedeniyle PHP topluluklarının gözleri FIG’ın üzerinde. PSR-0 şuanda zaten çok yaygın bir şekilde kullanılmakta. Bunun yanında PSR-1 ve PSR-2’ında kullanımı hızla yaygınlaşıyor. PHP ve doğal olarak PHP yazılımcılarının geleceğinde ortak, standarlaştırılmış bir PHP görünüyor.

FIG’ın sadece önerilerde bulunduğunu, yazılımcı Ahmet, Mehmet’in nasıl projelerini yapmaları gerektiğini belirtmediklerinin tekrar tekrar altını çizerek belirtmekte fayda görüyorum.

Her ne kadar öneride olsa PHP toplulukları bu önerileri birer kural olarak kabul etmeye başlamaları nedeniyle PHP’de bu değişim rüzgarına geç kalmadan katılarak kendinizi şimdiden alıştırmaya başlamanızın son derece önemli olduğunu düşünüyorum.

Standartlaştırılmış PHP hakkında düşünceleriniz nedir, kullanmaya başlamayı düşünüyor musunuz, düşünmüyor musunuz yorumlarda belirtmeyi unutmayın!

Ilgıt Yıldırım

Alanında 16 yıldan fazla tecrübesi olan bir freelance / serbest web yazılımcısıyım. Son 8 yıldır e-ticaret siteleri ağırlıklı çalışmalar yapmaktayım. Web yazılımı konusunda PHP, MySQL, HTML, CSS ana ilgi alanlarımdır.

  • serdar

    Uzun süre kendi kodlarinda calisip kendi stiline alistiktan sonra baskasinin kodlariyla calismak sinir bozucu olabiliyor. Birden cok kisinin calistigi sistemlerde standartasma sart..