PHP PSR Nedir? Standartları

PHP geliştiricileri tarafından belirlenmiş PSR-0, PSR-1, PSR-2, PSR-3, PSR-4 kod standartları çeşitli örneklerle yer almakta.

PHP PSR nedir?

PSR veya PHP Standards Recommendations ( PHP Standart Önerileri ) baş harflerinden meydana gelen kod standartları topluluğudur.

Herhangi bir programlama dili ile yazılım geliştirirken kendimize göre en iyi dediğimiz bazı alışkanlıklarımız vardır.

Değişken tanımlamasını ve koşul ifadelerini aşağıdaki gibi yazmak sizin için en iyi olabilir.

<?php

$birinci_sayi = 10;
$ikinci_sayi = 20;

if ($birinci_sayi < $ikinci_sayi){ echo "İkinci sayı büyük";}
else { echo "Birinci sayı büyük"; }

?>

Bir başkası için ise en iyi aşağıdaki gibi olabilir.

<?php

$birinciSayi = 10;
$ikinciSayi = 20;

if ($birinciSayi < $ikinciSayi)
{
  echo "İkinci sayı büyük";
}
else
{
  echo "Birinci sayı büyük";
}

?>

Bir başkası içinde daha da farklı olabilir.

PHP gibi özgür, açık kaynaklı ve farklı kodlama biçimlerinin olduğu bir programlama dili için kodlar daha da karmaşık hale gelebilir.

Başkası sizin kodlarınızı incelediğinde kodlarınızı anlamak için gereğinden fazla çaba sarf eder.

Bunun önüne geçebilmek için PHP framework geliştiricileri bir araya gelerek PHP Fig ( PHP Framework Interop Group ) topluluğunu oluşturmuş ve çeşitli kodlama standartları belirlemişler.

Ayrıca bu standartların öğrenilmesi Symfony, Yii, Phalcon, Joomla gibi topluluk içinde yer alan uygulamaların daha kolay öğrenilmesini de sağlar.

Standartların uygulanması Netbeans, PhpStorm, Atom, Zend Studio gibi gelişmiş editörler tarafından kolaylıkla uygulanabilir.

PHP PSR-0

PSR-0 standardı OOP-NYP ile yazılım geliştirirken uyulması gereken namespace, class yapısı ile ilgili standartları ve otomatik yükleme yapısını belirtir.

Önemli Not: Bu standart artık önerilmemekte olup yerine PSR-4 kullanılması tavsiye edilmektedir.

  • Her namespace ve class yapısı \<Sağlayıcı>\<namespace>\<class> biçiminde olmalıdır.
  • Her namespace bir üst namespace ( <Sağlayıcı> ) sahip olması gerekir.

Doctrine\Common\IsolatedClassLoader

Sağlayıcı Adı: Doctrine
Namespace: Common
Class: IsolatedClassLoader

Symfony\Core\Request

  • Her namespace alt namespace’lere sahip olabilir.

Symfony\Component\HttpFoundation\RedirectResponse

  • Her namespace ayracı ( \ ) bir alt klasör ( DIRECTORY_SEPARATOR ) olarak gösterilir.

Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php

Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php

  • Sınıf adlarındaki alt çizgi bir alt klasör ( DIRECTORY_SEPARATOR ) olarak gösterilir.

namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php

  • Her namespace ve sınıf, dosya sisteminde .php uzantısı ile gösterilir.
  • Her <Sağlayıcı>, <namespace>, <class> büyük veya küçük harf ile adlandırılabilir.

PSR-0 standartlarına uyulduğunda aşağıdaki otomatik yükleme fonksiyonunun çalışması beklenir.

<?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;
}
spl_autoload_register('autoload');

?>

PHP PSR-1

PSR-1 standardı PHP dosyalarında uyulması gereken temel kodlama standartlarını belirtir.

  • PHP dosyalarında SADECE <?php ve <?= kullanılması gerekir.
  • PHP dosyaları SADECE UTF-8 without BOM ( UTF-8 BOMSUZ ) olmalıdır.
  • Bir PHP dosyası SADECE sınıf, fonksiyon veya sabit tanımlamalı ya da sonuç üretmeli veya ini değişikliği yapmalıdır.

Bir PHP dosyasında hem fonksiyon tanımı hem de çıktı üreten kodların olmaması gerekir.

<?php

// side effect: change ini settings
ini_set('error_reporting', E_ALL);

// side effect: loads a file
include "file.php";

// side effect: generates output
echo "<html>\n";

// declaration
function foo()
{
    // function body
}

?>

Yukardaki hatalı PHP dosyası örneğinde hem yan etki (çıktı, ini dosya değişikliği) hem de tanımlama (fonksiyon) yapılmıştır.

  • Namespace ve sınıf tanımları PSR-0 veya PSR-4 standardına göre yapılmalıdır.
  • Sınıf isimleri StudlyCaps olmalıdır.

PHP 5.3 ve sonrası için sınıf tanımlama örneği

<?php

namespace Vendor\Model;

class Foo
{
}

?>

PHP 5.2 ve öncesi için sınıf tanımlama örneği

<?php

class Vendor_Model_Foo
{
}

?>
  • Sınıf sabitleri tamamı büyük harf olmalı, ayraç olarak sadece alt çizgi kullanılmalıdır.
<?php

namespace Vendor\Model;

class Foo
{
    const VERSION = '1.0';
    const DATE_APPROVED = '2012-06-01';
}

?>
  • Metot isimleri camelCase olmalıdır.
<?php

namespace Sezer\Model;

class OrnekNesne {

  const ADI_SOYADI = "Yusuf Sefa SEZER";
  
  public function merhabaDunya() {
    return "Merhaba Dünya";
  }
  
  public function adiSoyadiNe() {
    return self::ADI_SOYADI;
  }

}

?>

Bu standart özellik isimlendirme ( $StudlyCaps, $camelCase, $under_score ) kurallarını belirtmez.

Ancak bir proje içinde özellik isimlendirmesi tutarlı olmalıdır.

Yani bir sınıf içinde hem $StudlyCaps hem de $under_score kullanılması tavsiye edilmemektedir.

PHP PSR-2

PSR-2 standardı PSR-1’in devamı niteliğindedir ve PHP komutlarında uyulması gereken kodlama standartlarını belirtir.

  • PSR-1 standardına uyulması gerekir.
  • PHP komutlarında girinti tab yerine 4 boşluk olmalıdır.
  • Satır uzunluğu sınırı zorunlu olmamakla birlikte 80 karakter önerilmekte, en fazla ise 120 karakter olması tavsiye edilmektedir.
  • Namespace ve use kullanımından sonra bir satır boşluk bırakılmalıdır.
  • Sınıflara ait açılış ve kapanış süslü parantezleri bir alt satırda olmalıdır.
<?php

namespace Vendor\Package;

class OrnekNesne 
{
}

?>
  • Metotlara ait açılış ve kapanış süslü parantezleri bir alt satırda olmalıdır.
<?php

namespace Vendor\Package;

class OrnekNesne 
{
    public function merhabaDunya()
    {
    }
}

?>
  • Tüm metotlarda erişim belirleyicilerin olması zorunludur. abstract ve final erişim belirleyicilerden önce static ise erişim belirleyicilerden sonra olmalıdır.
<?php

namespace Vendor\Package;

abstract class OrnekNesne
{

    abstract public function notHesapla();

    final public function merhabaDünya()
    {
        return "Merhaba dünya";
    }

    public static function adiSoyadi()
    {
        return "Yusuf Sefa SEZER";
    }

}

?>
  • Kontrol yapısı anahtar kelimelerinden (if, switch, for, while vb.) sonra bir boşluk, süslü parantezden önce bir boşluk olmalıdır. Metotlarda boşluk olmamalıdır.
<?php

if ($expr1) {
    // if body
} elseif ($expr2) {
    // elseif body
} else {
    // else body;
}

//merhabaDunya (); // tavsiye edilmez
//merhabaDunya( ); // tavsiye edilmez
merhabaDunya();

?>
  • Kontrol yapılarında açılış süslü parantezi aynı satırda kapanış süslü parantezi bir alt satırda olmalıdır.
<?php

try {
    // try body
} catch (FirstExceptionType $e) {
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}

?>
  • Kontrol yapılarındaki açılış parantezlerinden sonra, kapanış süslü parantezlerinden önce boşluk olmalıdır.
  • PHP anahtar kelimeleri küçük harfle yazılmalıdır. ( TRUE yerine true, False yerine false, Public yerine public gibi )
  • Metottaki parametreye ait virgülden sonra bir boşluk bırakılmalıdır. Virgülden önce bırakılmamalıdır. Varsayılan değere sahip parametreler en sona yazılmalıdır.

Standarda ait bir örnek PHP dosyası;

<?php
namespace Vendor\Package;

use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class Foo extends Bar implements FooInterface
{
    public function sampleMethod($a, $b = null)
    {
        if ($a === $b) {
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2, $arg3);
        }
    }

    final public static function bar()
    {
        // method body
    }
}

PSR Standartları arasında en çok kuralın olduğu bu standardın diğer detaylarına http://www.php-fig.org/psr/psr-2/ adresinden ulaşabilirsiniz.

PHP PSR-3

PSR-3 standardı IETF tarafından RFC 5424 log tutma standardını uygulamak için gerekli olan arayüzü tanımlar.

Loglama veya kayıt tutma gelişmiş yazılımlarda önemli bir yer tutar.

Oluşan hataların veya sistem ile ilgili bilgilerin takip edilmesi için oluşabilecek durumların kaydının tutulması faydalı olacaktır.

  • PSR-3 standardı IETF RFC 5424, tarafından belirlenmiş sekiz seviye ( debug, info, notice, warning, error, critical, alert, emergency ) kayıt türünü tanımlar.
  • Metotlar temel olarak mesaj ve içerik parametrelerini alır.

PSR-3 arayüzü uygulandığında başka bir PSR-3 arayüzünü uygulayan sınıf yerine kullanılabilir.

Laravel, Symfony gibi framework yapılarında Loglama işlemi PSR-3 standardını uygulayan Monolog yapısını kullanır.

PHP PSR-4

PSR-4 standardı PSR-0 standardına yeni özelliklerin eklenmesi ve bazı uygulamaların kaldırılmasıyla oluşturulmuş otomatik yükleme yapısını belirtir.

  • Her sınıf bir üst namespace (<Sağlayıcı>) sahip olmalıdır.
  • Her namespace alt namespace’lere sahip olabilir.

\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>

  • Sınıf adlarındaki alt çizginin (PSR-0’dan farklı olarak) bir anlamı yoktur.
  • Sınıflar büyük veya küçük harf ile adlandırılabilir.

PSR-4 standardının PSR-0’a göre en büyük farkı her sınıfın bir üst <Sağlayıcı> olarak bilinen ekin kullanılma zorunluluğun olmamasıdır.

Böylece klasör karmaşasının önüne geçilmiştir.

PSR-0’a ait klasör yapısı

vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest

PSR-4’e ait klasör yapısı

vendor/
    vendor_name/
        package_name/
            src/
                ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest

Ayrıca PHP 5.2 öncesinde kullanılan alt çizginin yeni klasörü işaret etmesi de kaldırılmıştır.

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!