PSR-0 – Önerilen PHP Standartları
PHP Topluluğu inanılmaz büyük ve sayısız framework ve kütüphaneye sahip. Herkes kendi projelerine bu kütüphaneleri dahil etmek ister. Kodlama stilleri ile amaçlanan bu kütüphaneleri sıkıntısız bir şekilde projelerimize dahil etmek.
Eğer Php kodu yazdıysanız ve birden çok yazılımcının yazdığı kodu gördüyseniz, bazı durumlarda maalesef üzerinde değişiklik yapmak zorunda kaldıysanız bilirsiniz ki php yazılım dünyası vahşi batı gibidir. Zibilyon çeşit kod yazım tarzı görürsünüz ve pek çok zaman bir kodda değişiklik yapmak yeniden yazmaktan zor gelir.
“Framework yada belli bi standart kullanmıyorum! benim kendi frameworküm, kendi standartlarım var!” kafasına tepki olarak bazı standartların geliştirilmesi artık kaçınılmaz hale geldi.
PHP 5.3 ile birlikte namespace özelliği desteklenmeye başladı. 2009’da PHP topluluğundan kendilerine PHP Standards Working Group ismini veren grup PHP Standartları üzerinde çalışmaya karar verdi (Grup daha sonra ismini Framework Interoperatability Group olarak değiştirmiştir). Bu grup daha sonra PSR-0 adı altında (PHP Standards Recommendation Önerilen PHP Standartları) Autoloader standardı oluşturdu.
Standartlar PSR-0,PSR1,PSR-2 ve PSR-3 olarak 3 ana başlığa ayrılmış. Tamamına uymanız yada katılmanız gerekmiyor, hatta siz de konuya dahil olup çeşitli konularda oy verebiliyorsunuz.
PSR-0 – The Autoloading Standard
PSR-1 – The Basic Coding Standard
PSR-2 – Coding Style Guide
PSR-3 – Logger Interface
PSR-0
Autoloading üzerine bir standarttır.
Zorunluluklar
Tüm namespace ve classlar şu formatta olmalı <Sağlayıcı Adı>(<Namespace>)*<Sınıf Adı>
-Tüm namespacelerin üstünde bir Sağlayıcı İsmi olmalı.
-Her bir namespace’in altında istediği kadar namespace olabilir.
-Her bir namespace yüklenirken namespace ayracı (), klasör ayracına (DIRECTORY_SEPARATOR) dönüştürülür.
-Class ismindeki her bir alt çizgi “_” , klasör ayracına dönüştürülür.
-Her bir namespace ve class dosyası .php uzantısına sahip olmalıdır. Sağlayıcı adı, namespace ve class isimlerinde büyük, küçük harfin önemi yoktur.
Klasör yapısı şöyle olursa;
Sınıfımızda şu şekilde olmalıdır;
<?php
namespace Vendor\\\\Package
class Example {
}
?>
Örnekler ;
\\\\Doctrine\\\\Common\\\\IsolatedClassLoader
\\\\Doctrine\\\\Common\\\\IsolatedClassLoader => /var/www/lib/Doctrine/Common/IsolatedClassLoader.php
Sağlayıcı Adı: Doctrine
Namespace: Common
Class: IsolatedClassLoader
\\\\Application\\\\Controller\\\\Post => /var/www/lib/Application/Controller/Post.php
Sağlayıcı Adı: Application
Namespace: Controller
Class: Post
Alt çizgili bir örnek ;
\\\\Application\\\\Controller\\\\User_Post => /var/www/lib/Application/Controller/User/Post.php
Include edilecek class adını vererek, include edilecek dosyayı bulan bir fonksiyon;
<?php
function autoload($className)
{
$className = ltrim($className, ’\\\\\\\\’);
$fileName = ’’;
$namespace = ’’;
if ($lastNsPos = strrpos($className, ’\\\\\\\\’)) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace(’\\\\\\\\’, DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace(’_’, DIRECTORY_SEPARATOR, $className) . ’.php’;
require $fileName;
}
Tüm kodlarınızı PSR-0 uyumlu yazarsanız hiç birşeyi include etmenize gerek kalmayacak. spl_autoload_register() kullanarakta sınıflarınızı otomatik olarak yükleyebilirsiniz.