Beyaz.Net İpucu

Php Kod Standartları

Merhaba Arkadaşlar,

Sizlere bu makalemde PHP deki kodlama standartlarından bahsedeceğim.

Kod Standartları nedir?

Kod standartları adı üzerinde olan bir kavramdır. Yani projedeki tüm yazılımcıların belli standartlara bağlı kalarak kod yazmasınıdır.

Kod standartlarının avantajları nelerdir?

Kodların tüm projedeki yazılımcılar tarafından kolay okunabilmesi ve anlaşılmasını sağlar.
Projeye uzun bir zaman sonra tekrar bakıldığında kolay bir şekilde adapte olunabilmesini sağlar.
Proje sizden başka bir yazılımcıya devredildiğinde onun projeye daha kısa sürede hakim olmasını ve kulaklarınızı daha az çınlatmasını sağlar :)

Genel olarak kod standartlarını bu şekilde açıklayabiliriz. Her dilin kendine has yazın kuralları vardır. Ben sizlere php dilinde genel olarak kabul görmüş PSR (Php Standarts Recommendation) standartlarından bahsedeceğim.

PSR standartları 4 adettir Bunlar:

PSR0
PSR1
PSR2
PSR3'dür

PSR0
Autoloading üzerine bir standarttır.
1. Namespace ve class çağrımları şu şekilde olabilir : \<Project name or vender name>\(<Namespace>\)*<Class Name>
2. Her namespace in top bir namespace i olmalı. Yani yukarıdaki örnekte <Project name or vender name> hep kullanılabilir.
3. Her namespace altında alt namespace’ler olabilir. ör: moduller/text_modulleri/..
4. Her bir namespace tanımı ve “_” işareti, / (DIRECTORY_SEPARATOR) olarak algılanmalıdır.
ör: proje1/paketler/class/email_moduller/Email.php => /var/www/proje1/paketler/class/email/moduller/Email.php
5. Class çağırılırken class adı ve dosya uzantısı mutlaka olmalı. Ör: class/email/moduller/Email.php gibi.
6. Proje adı, class isimleri büyük veya küçük harf kombinasyonu olabilir.
Örnek autoload fonksiyonu:

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;
}

PSR1
Tele kod standartları üzerinedir.
1. PSR0 içerisindeki tüm tavsiyeler geçerlidir.
2. Kodlar <?php ?> ile başlamadı ve dosyalar UTF-8 olmalıdır.
3. Bir declare veya overwrite söz konusu ise üstününe yorum olarak belirtilmesi.
4. Class isimleri “StudlyCaps” (yani Aaaa\Bbbb\Ccc) şeklinde olmalı. Ör:  Email_Sender.php (php 5.2) veya Email/Sender.php (Php 5.3)
5. Class içerisindeki sabit değerler (const) hepsi büyük harf olmalı, istenirse “_” içerebilir.
6. Method isimleri camelCase olmalı. Ör: mailSender
7. Değişken isimlerinde StudlyCaps, camelCase veya hepsi küçük şekilde alt çizgi dahil kullanım olabilir. Ör: currentDate, current_date
Örnekler;


<?php
// side effect: change ini settings
ini_set('error_reporting', E_ALL);
 
// PHP 5.3 and later:
namespace ProjeAdi\Model;
 
class Foo
{
}
 
// PHP 5.2.x and earlier:
class ProjeAdi_Model_Foo
{
}
 
class Foo
{
    const VERSION = '1.0';
    const DATE_APPROVED = '2012-06-01';
}
 
?>

PSR2
Genel olarak fonksiyonlar ve koşul kullanım şekilleri üzerinedir.
1. PSR1 standartlarını destekler.
2. Kodların başlarında tab yerine 4 boşluk kullanılmalı.
3. Bir satırda önerilen 80 maximum 120 karakter olmalı.
4. Namespace, class ismi, method imsinden sonra 1 boşluk olmalı.
5. Class ve method sonrasında açılan { işareti ismin yanında değil altında olmalı. Aynı şekilde kapanışta bir sonraki satırda olmalı.
6. Açılan parantezlerin içerisinde başında ve sonunda boşluk olmamalı.
7. Opearatörlerin değişkenler ile arasında 1 boşluk olmalı.
8. true,false,null küçük kullanılmalı.
Örnekler;


<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface
{
    public function sampleFunction($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
    }
}
 
while ($expr) {
    // structure body
}
 
try {
    // try body
} catch (FirstExceptionType $e) {
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}
 
$closureWithArgs = function ($arg1, $arg2) {
    // body
};
 
?>

PSR3
Loglama üzerine standartları içerir.
1. LoggerInterface adında bir framework kullanıması öneriliyor.
2. 8 level log tipi olmasını öneriyor. (debug, info, notice, warning, error, critical, alert, emergency)
3. Her method string veya obje kabul edebilir.
4. Mesaj içerisindeki placeholder lar, verilen array içerisindekiler ile değiştirilir.
5. Mesaj içerisindeki placeholder lar {} arasında yazılır.
6. Placeholder lar A-Z, a-z, 0-9, _ karakterlerinden oluşabilir.
Örnek


<?php
 /**
* Interpolates context values into the message placeholders.
*/
function interpolate($message, array $context = array())
{
  // build a replacement array with braces around the context keys
  $replace = array();
  foreach ($context as $key => $val) {
      $replace['{' . $key . '}'] = $val;
  }
 
  // interpolate replacement values into the message and return
  return strtr($message, $replace);
}
 
// a message with brace-delimited placeholder names
$message = "User {username} created";
 
// a context array of placeholder names => replacement values
$context = array('username' => 'bolivar');
 
// echoes "User bolivar created"
echo interpolate($message, $context);
 
?>

Kategorideki Güncel Makaleler