İçinde Yazılım

PHP Kod Standartları

Tek başınada olsanız, iyi bir ekibiniz de olsa mutlak suretle yazdığınız programlama dili ne olursa olsun, belli bir kod standartında yazılmadığı sürece, kodunuz bir süre sonra “spagetti” koda dönüşmeye mahkumdur. Çoğu yazılımcı kendi kodunu rahatlıkla anladığını öne sürer, fakat burada önemli olan, yazdığınız koda 1 sene sonra bir şey eklemek istediğinizde bir yabancı gibi kalacak olmanızdır veya sizden sonra gelecek programcının sizin standartlarınıza değil, genel kabul görülmüş standartlar çerçevesinde yazılan bir kod yapısı ile, çok daha hızlı uyum sağlayabilecek olmasıdır. Günümüzde MVC ile kodlama standartları birazda olsa bir düzene giriyor fakat yeterli değil.

PHP’ de “zorunlu olarak şöyle kodlanmalıdır” diye bir zorunluluk yok. Sadece öneri olarak sunulan belli standartlar var bu standartların geliştirilmesi için çalışan belli php gruplar mevcut. Genel kabul görmüş olarak nitelendirilebilecek PSR (Php Standards Recommendation) olarak tanımlanan standartlar mevcut. Bunlar günümüz itibariyle 4 farklı grupta toplanmış durumdadı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);
?>

Yorum Yaz

Yorum