Днес почетох този пост във veselin.bg, пробвах в един коментар да събера най-основните “стандарти” по който пиша PHP код. Обаче коментарът доста набъбна и реших да го направя като пост.
В PHP за разлика от повечето (да не кажа всички) програмни езици няма точно установен стандарт структориране и писане на кода. Донякъде това се дължи на самата история на езика и това, че написан на PHP3 код може да върви дори и на PHP6. От друга страна PHP се води най-лесния за учене език, точно защото каквото и да напишеш все ще ти излезе резултат. Тази страна на PHP колкото и позитиви да има, като цяло според мен е грешка на самия език и придава малко статус “аматьори” на PHP програмистите му.
В послените години започват да се оформя що годе няколко стандарта на писане, но като цяло поне според мен докато PHP5.3 – PHP6 не започне да се ползва масово нещата няма много да се променят.
Основния начин да се започне да се работи по стандарт е да се работи с някой PHP framework, защото всички те си имат свой достатъчно добре дефинирани “стандарти” и самия framework ви кара да пишете по неговия стандарт за да изглежда кода ви добре. И тъй като никой PHP framework неможа да ме спечели, аз си направих мой. Който вече от 1 година се ползва във всички проекти които правя за Pixeldepo ( и които са на PHP разбира се ) и съм страшно доволен от това как работи. В неговите coding conventions съм “взаимствал” доста идеи, главно от Zend Framework и CodeIgniter.
Именуване на променливи и функции и методи.
Променливите и методите ми са със CamelCase, фунцкиите са с подчертавки. Което е малко старанно за повечето хора, но поне според мен има известна логика ( иначе нямаше да пиша по този начин де
). Самия PHP, като език ако се погледне дългия списък със фунцкии ще се види че основно те са с почертаване и когато се ползва фунция инстиктивно знам че е такава. Докато класовете (повечето от тях) използват CamelCase стандарт подобно на Java и когато се работи с класове изглеждат някак естествено. По принцип използвам много малко фунции и обикновенно те са просто wrapper/shortcut към някой клас.
Не използвам долни черти за разделянето на private променливи фунции. Пример за променлива / фунция / метод
$name = '';
$totalPrice = "";
function url_for($params){ /* ... */ }
class Foo {
public function isValid(){ /* ... */ }
}
Именуване на класове
Начина на именуване на класовете в Zend Framework, ми допадна най-много, от висички останали които бях гледал в различни PHP-та. Общо взето идеята е в името на класа да се съдърже “namespece” му. И същевременно класа да се намира в директория, пътя на която отговаря на това име. Примери:
// намира се в ActiveRecord/Plugin/Attachable.php
class ActiveRecord_Plugin_Attachable {}
// намира се в Model/Validation/Errors.php
class Model_Validation_Errors {}
// намира се в Tool/Script/Genererate/Applition.php
class Tool_Script_Generate_Application {}
Това е много ползено за _autoload на класове и доста ще улесни бъдеща интеграцията на PHP5.3 – PHP6 namespace-овете. Само да вметна, че доста хора не го знаеха за autoload, най-добре да се ползва spl_autoload.
Като тук проблема с абстрактните класове го решавам, като ако класа е абстрактен се кръщава Base. Тъй като Zend имаха проблем със класове като Zend_Controller_Plugin_Abstract, който в щеше да стане просто клас Abstract от PHP6 и щеше да е в namespace Zend\Controller\Plugin. А Abstract е ключова дума и неможе да има клас който се казва така. При мен такъв клас се казва просто Base.
С подобна структура на класовете е много удобна и въпреки че много хора казват, че с такива имена писането става трудно. Има доста техники с който се избягва писането на целите имена. Като пример ще дам моята script функция която изпълнява script класове.
script('generate:model'); // Прави клас Tool_Script_Generate_Model го изпълнява
script('db:dump:data'); // Прави клас Tool_Script_Db_Dump_Data и го изпълнява
// като могат много лесно се добавят плъгини:
script('your:custom:script'); // Това е клас Tool_Script_Your_Custom_Plugin
В заключение…
Основната идея на стандартите е не само вие да може да си разчетете кода след 1-2 месеца, но и други хора да могат да работят над него. Също така е важно и да не ви е толкова срам от него след време, което рядко ще стане, но е важно да се опита. Kода да изглежда естествено в средата в която работите било то PHP / Ruby / Java и т.н. За PHP това не е лесно, защото самия език не изглежда естествено понякога.
За стандарти за писане лично аз препоръчвам тези на Zend Framework и донякъде тези на CodeIgniter. Ако пишете изцяло собствени неща, ако не пишете по стандартие на системата в която сте.
To be continue…
Това е тема с продължение, която най-вероятно утре ще продължа
Тъй като исках да напиша още за коментари / гетъри и сетъри / php файлове плюс няколко други неща, ще има още един пост.
Ако имате някви коментари и / или съвети може да ги споделите. Също така ще се радвам и да чуя и по какви стандарти пишете и вие.

August 17th, 2009 at 10:50 pm
Част от конвенциите наподобяват джавешките – но и концепцията на фреймуърците е подобна в Java EE платформата, така или иначе. Без да правя директна съпоставка, че колегите от Java екипа ще ме замерват с камъни.
Все пак смятам, че именуването е най-малкият проблем. Мен ме притеснява главно липсата на структура на проект. Отделял съм доста време да търся best practices и да разглеждам готови решения, докато се спра на CodeIgniter-а. Няма лошо малкият ти проект да се състои от всичко на всичко 1 файл, но реалните практики никога не са такива и е добре да се приближаваме към design patterns, приети изобщо по света.
С две думи, наличието на framework-ове като CodeIgniter и CakePHP ме карат да виждам смисъл в писането на PHP.
August 17th, 2009 at 11:10 pm
За структура съм напълно съгласен, за мен най-големия проблем преди беше да знам кое в коя папка трябва да бъде. Tова което един добър framework трябва да прави е да насочва програмиста или програмистите които го ползват кое къде трябва да бъде.
Като Директорийната структура на Rails ми допада доста повече от тези на повечето php frame-ове.