Zend Framework PHP Kodlama Standardı Genel Açıklama Kapsam Bu belge geliştiriciler ve geliştirici takımları veya Zend Framework üzerinde geliştirme yapanlar için yönergeler ve kaynaklar sağlamaktadır. Kapsanan konular : PHP Dosya Biçimlemesi İsimlendirme Kuralları Kodlama Stili Satıriçi Belgelendirme Amaçlar Her geliştirme projesinde iyi kodlama standartları önemlidir , ama bilhassa birden fazla geliştirici aynı proje üstünde çalıştığında önemlidir.Kodlama standartlarına sahip olmak kodun yüksek kaliteli , az hatalı ve kolayca bakıma alınabilir olmasını sağlamaktadır. PHP Dosya Biçimlemesi Genel Sadece PHP kodu içeren dosyalar için kapama etiketi ("?>") kullanılmamalı. PHP tarafından ihtiyaç duyulmamaktadır.Bunu eklememek takip eden whitespace karakterlerin kazayla çıktıya eklenmesini önlemektedir. ÖNEMLİ:__HALT_COMPILER() ile ikili herhangi veri dahil edilebilir olmasına rağmen herhangi bir Zend Framework PHP dosyasıyla veya bunlardan türetilen dosyalarda dahil etme engellenmiştir. Bu özelliğin kullanımına sadece bazı özel kurulum betiklerinde izin verilmiştir. Girintili Yazma Satırbaşı boşluğu olarak tab olmadan 4 boşluk kullanın. Maksimum Satır Uzunluğu Hedef satır uzunluğu 80 karakterdir , örn. geliştiriciler mümkün olduğunca kodu pratik olan 80-sütün sınırına yakın tutmalılar.Gene de daha uzun satırlar kabul edilebilir.Herhangi bir satır PHP kodunun maksimum uzunluğu 120 karakterdir. Satır Sonlandırma Satır sonlandırma unix metin dosyaları için standart bir yöntemdir.Satırlar mutlaka linefeed(LF) ile bitmelidir.Linefeed'ler ordinal olarak 10 veya onaltılık olarak 0x0A şeklinde temsil edilir. Carriage return(CR)'leri Macintosh bilgisayarlardaki gibi (0x0D) kullanmayın. Carriage return/linefeed kombinasyonunu (CRLF) Windows bilgisayarlardaki gibi (0x0D, 0x0A) kullanmayın. İsimlendirme Kuralları Sınıflar Zend Framework sınıfların isimlerini bulundukları dizinlere eşlenmesini sağlayan bir isimlendirme kuralına sahip. Zend Framework'ün kök dizini altındaki tüm sınıfların hiyerarşik olarak barındırıldığı "Zend/" dizinidir. Sınıf isimleri sadece alfanümerik karakterlerden oluşabilir. Numaralar sınıf isimlerinde kullanılabilirler ancak bu kullanım uygun bulunmamaktadır. Altçizgilerin sadece konum ayıracının yerine kullanılmasına izin verilir -- "Zend/Db/Table.php" dosya adı mutlaka "Zend_Db_Table" sınıfına eşleme yapmalıdır. Eğer sınıf adı birden çok kelimeden oluşuyorsa , her yeni kelimenin ilk harfi büyük harfe çevrilmelidir. Ardışık büyütülmüş harflere izin verilmez, ör. "Zend_Pdf" sınıf ismi kabul edilirken "Zend_PDF" sınıf adı kabul edilmez. Zend tarafından veya katılımcı ortak firmalardan biri tarafından yazılan ve Zend Framework ile dağıtılan Zend Framework sınıfları "Zend_" ile başlamalı ve bundan dolayı hiyerarşik olarak "Zend/" dizini içinde yerini almalı. Bunlar sınıflar için kabul edilebilir isimler : ÖNEMLİ: Framework ile çalışan fakat framework'ün bir parçası olmayan kod ör. framework'ün son kullanıcısı tarafından yazılan ve Zend veya framework'e ortak şirketlerin olmayan kod asla "Zend_" ile başlamamalıdır. Arayüzler Arayüz sınıfları diğer sınıflarla aynı kurallara uymalıdır (yukarıya bakın) , buna rağmen aşağıdaki örneklerde olduğu gibi mutlaka "Interface" kelimesi ile bitmeli : Dosya Adları Diğer tüm dosyalar için sadece alfanümerik karakterler , altçizgiler ve tire karakteri ("-") kullanılabilir. Boşluklar ve geri kalan karakterler kullanılamaz. PHP kodu içeren her dosya mutlaka ".php" dosya uzantısına sahip olmalıdır. Bu örnekler yukarıdaki bölümdeki sınıf isimlerini içererek kabul edilebilen dosya isimleri göstermektedir : Dosya isimleri yukarıda açıklandığı gibi sınıf adına göre eşleşmeyi takip etmelidir. Fonksiyonlar ve Metodlar Fonksiyon isimleri sadece alfanümerik karakterler içerebilir. Altçizgiler fonksiyon isimlerinde kullanılamaz. Numaralar kullanılabilir ancak bu kullanım uygun bulunmamaktadır Fonksiyon isimleri her zaman küçük harfle başlamalı. Fonksiyon ismi birden fazla kelimeden oluştuğunda her kelimenin ilk harfi büyük olmalı. Buna genellikle "camelCaps" metodu denir. Fonksiyon isimleri uzun yazılmalı.Fonksiyon isimlerinin uzun olması kodun pratik olarak anlaşılabilirliğini artırdığından , fonksiyon isimleri mümkün olduğunca uzun olmalı. Bunlar kabul edilebilir fonksiyon isimleri: Nesneye dayalı programlamada nesne erişirleri(accessor) "get" veya "set" önekleri almalı. Dizayn kalıpları kullanırken mesela iskelet veya fabrika kalıbları , methodun adı kalıbın adını içermeliki kalıb kolayca tanımlanabilsin. Fonksiyonlar ("floating functions") genel kapsamda kullanılabilir ancak bu kullanım uygun bulunmamaktadır. Bu fonksiyonları static bir sınıf'ın içine koymalısınız. Değişkenler Değişken isimleri sadece alfanümerik karakterleden oluşabilir.Altçizgi kullanılamaz. Değişken isimlerinde numaralar kullanılabilir ancak bu kullanım uygun bulunmamaktadır. "private" veya "protected" construct'ı ile tanımlanmış sınıf üyesi değişkenlerin değişken isminin ilk harfi altçizgi olmalı.Bu fonksiyon adında altçizgi kullanılabilir tek kullanım şeklidir. "public" ile tanımlanmış üye değişkenler asla altçizgi ile başlamamalı. Fonksiyon isimlerinde (bölüm 3.3,yukarıda) olduğu gibi değişken isimleride her zaman küçük harfle başlamalı ve "camelCaps" kuralına uymalı. Değişkenler pratik olabilecek kadar uzun olmalı. "$i" ve "$n" gibi kısa ve öz değişken isimleri küçük döngüler dışında kullanılmamalı. Eğer bir döngü 20 satırdan fazla ise , indisler için olan değişkenlerin daha açıklayıcı isimleri olmalı. Sabitler Sabitler hem altçizgi hemde alfanümerik karakterler içerebilir. Sabit isimlerinde sayılar kullanılabilir. Sabitlerin tüm harfleri mutlaka büyük olmalı. Okunabilirliği artırmak için sabitlerdeki kelimeler altçizgilerle ayrılmalı. Örneğin EMBED_SUPPRESS_EMBED_EXCEPTION kabul olmasına karşın EMBED_SUPPRESSEMBEDEXCEPTION kabul edilmez. Sabitler "const" construct'ı kullanılarak sınıf üyeleri olarak tanımlanmalı. Sabitler genel kapsamda "define" ile tanımlanabilmesine karşın bu tanımlama uygun görülmemektedir. Kodlama Stili PHP Kodu Sınırlaması PHP kodu her zaman için tam,standart PHP tagleri ile ayrılmalı : ]]> Kısa taglere izin verilmez. Sadece PHP kodu içeren dosyalarda kapama tagi her zaman için gözardı edilmeli (bakınız ). Stringler Yalın Stringler Bir string yalın olduğunda (değişken değişimi olmadığında) , kesme işareti veya "tek tırnak" her zaman stringi ayırmak için kullanılır: Kesme işareti içeren Yalın Stringler Bir yalın string kesme işareti içerdiği zaman string tırnak işareti veya çift tırnak ile ayrılmalı. Bu özellikle SQL ifadelerine uygun : Yukarıdaki söz dizimi tek tırnak escapelemeye göre tercih edilir. Değişken Yerine koyma Değişken yerine koyma şu iki şekilde yapılabilir : Tutarlılık için bu kullanıma izin verilmez : String Birleştirme Stringler "." operetörü ile birleştirilebilirler. Okunabilirliği artırmak için "." operatöründen önce ve sonra boşluk bırakılmalı : Stringleri "." operetörü ile birleştirirken okunabilirliği artırmak için ifadeyi birden çok satıra bölebiliriz.Bu gibi durumlarda her başarılı satır "." operatörünün "=" operatörünün altına döşendiği gibi whitespace ile takviye edilmeli : Diziler Sayısal İndeksli Diziler Negatif sayılar indis olamaz. İndeksli bir dizi negatif olmayan bir sayı ile başlayabilir halbuki bu uygun değildir ve tüm dizilerin başlangıç indeksi 0 olmalı. İndeksli dizileri array construct'ı ile tanımlarken , okunabilirliği artırmak için her virgül ayıracından sonra boşluk bırakılmalı : "array" construct'ı ile çok satırlı indeksli diziler de tanımlanabilir. Bu durumda aşağıda gösterildiği gibi her başarılı satırın başlangıcı aynı hizaya gelecek şekilde boşluklarla takviye edilmeli : Birleşmeli Diziler Birleşmeli dizileri array construct'ı ile tanımlarken ifadeyi satırlara bölmek tavsiye edilir. Bu durumda her başarılı satır her anahtar ve değer aynı hizaya gelecek şekilde whitespace ile takviye edilmeli: 'ilkDeger', 'ikinciAnahtar' => 'ikinciDeger');]]> Sınıflar Sınıf Tanımlama Sınıflar takip eden isimlendirme kurallarına göre isimlendirilmeli. Büyük parantez her zaman sınıf isminin hemen antındaki satıra yazılır ("Bir gerçek büyük parantez" formu). Her sınıfın PHPDocumentor standardına uyan bilgilendirme kısmı olmalı. Sınıf içindeki her kod içeriden 4 boşluk ile başlamalı. Bir PHP dosyasında bir sınıf olabilir. Sınıf dosyası içine ek kod eklenebilir ancak bu uygun bulunmuyor. Böyle dosyalarda iki boş satır sınıf ile ek PHP kodunu birbirinden ayırmalı. Kabul edilebilir sınıf tanımlaması örneği : Sınıf Üyesi Değişkenler Üye değişkenler takip eden değişken isimlendirme kurallarına göre isimlendirilmeli. Sınıf içinde tanımlanmış her değişken sınıfın en üstünde , herhangi bir fonksiyon tanımlamadan listelenmeli. var construct'ına izin verilmez. Üye değişkenler görünürlüklerini her zaman private,protected veya public constructlarından biriyle tanımlar.Üye değişkenlere direk erişim için onları public yapabilirsiniz ama erişir değişkenler (set/get) kabul gördüğünden bu yöntem uygun değildir. Fonksiyonlar ve Metodlar Fonksion ve Metod Tanımlaması Fonksiyonlar takip eden isimlendirme kurallarına göre isimlendirilmeli. Sınıflar içindeki fonksiyonlar görünürlüklerini her zaman private,protected veya public constructlarından biriyle tanımlanmalı. Sınıflarda olduğu gibi , her zaman büyük parantez fonksiyon isminin altındaki satıra yazılır.("Bir gerçek büyük parantez" formu). Fonksiyon ismi ile fonksiyon argümanları için açılan parantez arasında boşluk bulunmaz. Genel kapsamda fonksiyon kullanmak kesinlikle uygun bulunmuyor. Bir sınıfta kabuledilebilir fonksiyon tanımlaması örneği : NOT: Referans atamasına sadece fonksiyon tanımlamasında izin veriliyor : Çağrı anında referans ile aktarım yapılamaz. Return değeri parantez içine anlınmamalı. Bu okunabilirliğe engel olabilir ayrıca ilerde eğer metod referans ile return yapacak şekilde değişirse kodun çalışmasını durdurabilir. bar); } /** * DOĞRU */ public function bar() { return $this->bar; } }]]> Fonksiyon ve Metod Kullanımı Fonksiyon argümanları virgülden ayıracından sonra bir boşluk bırakılarak yazılır. Üç argüman alan bir fonksiyon için kabul edilebilir bir fonksiyon çağrısı örneği: Çağrı anında referans ile aktarım yapılamaz. Fonksiyon argümanlarını referans ile aktarmak için fonksiyon tanımlamaları bölümüne bakın. Argüman olarak dizileri alabilen fonksiyonlar için fonksiyon çağrısı "array" construct'ını içerebilir ve okunabilirliği artırmak için satırlara ayrılabilir. Bu gibi durumlarda dizi yazım kuralları geçerliliğini korur: Kontrol İfadeleri If / Else / Elseif if ve elseif constructlarına dayanan kontrol ifadelerinde koşulun açılan parantezinden önce ve kapama parantezinden sonra bir boşluk bırakılmalı. Parantezler içindeki koşullu ifadelerdeki operatörler okunabilirliği artırmak için boşluklarla ayrılmalı. Daha geniş koşulların mantıksal gruplandırılmasını geliştirmesi için iç parantez kullanılmalı. Açılış parantezi koşullu ifade ile aynı satırda yazılır. Kapanış parantezi ise her zaman kendi satırına yazılır. Parantezler içindeki herhangi bir içerik dört boşluk bırakılarak yazılmalı. "else" veya "else" içeren "if" ifadeleri için biçimlendirme bu örneklerdeki gib olmalı : PHP kimi durumlarda buradaki ifadelerin büyük parantez kullanmadan yazılmasına izin verir. Kodlama standardında bir fark olmaz ve tüm "if" , "elseif" veya "else" ifadeleri büyük parantez kullanmak zorundadır. "elseif" construct'ı kullanılabilir ama "else if" kombinasyonunun kabul görmesinden dolayı kullanılması uygun görülmemektedir. Switch "switch" construct'ı ile yazılan kontrol ifadelerinde koşulun açılış parantezinden önce ve koşulun kapanış parantezinden sonra bir boşluk bırakılmalı. "switch" ifadesi içindeki tüm içerik içerinden dört boşluk ile başlamalı. "case" ifadesi altındaki her içerik ek olarak içeriden dört boşluk ile başlamalı. switch ifadelerinde default construct'ı asla ihmal edilmemeli. NOT:Bazen break veya return eklemeyerek sıradaki case'e düşen case ifadesi yazmak yararlıdır. Bu gibi durumları hatalardan ayırt etmek için break veya return ihmal edilmiş case ifadelerine "// break intentionally omitted"("//break kasıtlı olarak koyulmadı") yorumu eklenmeli. Satıriçi Belgelendirme Belgelendirme Biçimi Tüm bilgilendirme kısımları ("docblocks") phpDocumentor biçimi ile uyumlu olmalı. phpDocumenter biçimini açıklamak bu belgenin kapsamı dışındadır. Daha fazla bilgi için lütfen ziyaret edin : http://phpdoc.org/ Zend Framework için veya Zend Framework ile çalışan her kaynak kod dosyası her dosyanın üstünde "dosya seviyesinde" ve her sınıfın üstünde "sınıf seviyesinde" bilgilendirme kısmı içermelidir. Aşağıdakiler bilgilendirme kısmı örnekleri : Dosyalar PHP kodu içeren her dosya üst kısmında en az aşağıdaki kadar phpDocumentor tagleri içerecek şekilde bir başlık kısmına sahip olmalı: Sınıflar Her sınıf en az aşağıdaki kadar phpDocumentor tagleri içerecek şekilde bilgilendirme kısmı içermeli : Fonksiyonlar Her fonksiyon ,nesne methodları en az aşağıdaki gibi bilgilendirme kısmı içermeli: Fonksiyonun açıklaması Tüm argümanlar Tüm olası dönüş değerleri Fonksiyonun erişim seviyesi fonksiyon tanımlanırken "public","private" veya "protected" construct'ları ile tanımlandığı için "@access" taginin kullanılmasına gerek yoktur. Eğer fonksiyon/metod kural dışı durum(exception) fırlatabiliyorsa , @throws kullanın: