Connect with us

Cześć, czego szukasz?

Internet Maker

Formatowanie kodu PHP

Wśród bogactwa skryptów PHP dostępnych w sieci znaleźć można najprzeróżniejsze przykłady. Od galerii fotografii, przez fora dyskusyjne, po rozbudowane aplikacje klientów pocztowych. Jeżeli chcesz dołączyć do grona twórców, których skrypty cieszą się powodzeniem, powinieneś ułatwić odbiorcom analizę twoich skryptów. Jednym z kroków w tym kierunku jest stosowanie jasnych reguł formatowania kodu.

Formatowanie kodu

Reguły formatowania kodu źródłowego programów wpływają na czytelność i niejednokrotnie pozwalają uniknąć błędów programistycznych. W poszukiwaniu jasnych zasad, jakie powinno się stosować, pisząc skrypty w języku PHP, należy w pierwszej kolejności odwiedzić strony projektu PEAR. Pod adresem http://pear.php.net/manual/en/standards.php znajdziesz dosyć dokładny opis wymagań nakładanych na kod rozpowszechniany w ramach projektu PEAR. Zasady te są oparte w znacznej mierze na standardzie ustanowionym przez książkę pt. \”Język C\” autorstwa Briana Kernighana oraz Denisa Ritchiego.

Ponieważ opis formatu zawarty we wspomnianym dokumencie nie jest kompletny (tj. nie porusza wszystkich zagadnień dotyczących programowania w PHP), trzeba się posłużyć dodatkowymi źródłami.

Dobrym rozwiązaniem jest analiza kilku wybranych aplikacji napisanych w PHP i cieszących się uznaniem środowiska programistów PHP. Aplikacjami takimi są między innymi phpBB, SquirrelMail, Tiki-wiki, Mambo czy typo3. Wprawdzie format wymienionych programów jest bardzo niespójny, ale analiza wybranych fragmentów w połączeniu ze standardami kodowania PEAR pozwoli na rozstrzygnięcie wszystkich wątpliwych kwestii.

Zagadnienia ogólne

Format pliku

Podstawowe wymagania dotyczą formatu pliku. Skrypty sformatowane zgodnie z zaleceniami projektu PEAR powinny być zakodowane jako iso-8859-1. Oznacza to, że polskie znaki diakrytyczne należy zapisywać w postaci {stala}\\xb1{/stala}, na przykład w napisie \”żółć\”:

echo \"\xbf\xf3\xb3\xe6\";

Ponadto znaki złamania wiersza należy zapisywać w formacie {stala}u*ix{/stala}, czyli jako znaki LF o kodzie ASCII 10 (znaki {stala}\\n{/stala}).

Długość linii kodu

Kto wie, czy nie najtrudniejszym problemem do rozwiązania jest ustalenie zasad łamania wiersza. Świadczy o tym chociażby fakt, że główne pakiety zawarte w bibliotece PEAR (z PEAR oraz DB na czele) stosują bardzo często wiersze o monstrualnej długości sięgającej nawet kilkuset znaków! Ten sam zarzut dotyczy zresztą wielu innych pakietów i aplikacji, w tym wszystkich wcześniej wymienionych: phpBB, SquirrelMail, Tiki-wiki, Mambo i typo3.

Długość wiersza nie powinna przekraczać 80 znaków. Przemawiają za tym dwa powody. Po pierwsze, analiza wiersza, który nie mieści się cały na ekranie, jest utrudniona. Po drugie, jeśli ktoś zechce kod o długich liniach wydrukować, efekt będzie godny pożałowania!

Tabela 1 przedstawia liczby znaków w wierszu, jakie zmieszczą się na wydruku. Ze wzrostem wielkości kroju czcionki oraz marginesów liczba ta oczywiście maleje. Stosując czcionkę wielkości 10 punktów i margines mniejszy niż 2,5 cm można na stronie zmieścić od 80 niemalże do 100 znaków.

Warto dodać, że do wydruku kodu programów komputerowych stosuje się czcionkę nieproporcjonalną, czyli taką, w której każdy znak ma stałą szerokość, na przykład Courier. Użycie czcionki proporcjonalnej, jak na przykład Arial, Verdana czy Times New Roman, powoduje, że wcięcia kodu oraz białe znaki są niezauważalne, zaś cały kod wygląda po prostu źle.

Tabulatory kontra spacje

Do wcinania kodu należy stosować znaki spacji. Tabulatory są znakami zależnymi od bieżącego kroju czcionki. Wcięcia wykonane tabulatorem mogą ulec zmianie w przypadku zmiany wielkości czcionki. Standardy kodowania biblioteki PEAR zalecają stosowanie czterech spacji do wcinania kodu.

Średnik i wiele instrukcji w jednym wierszu

Średnik kończący instrukcje formatuje się tak, jak w zwykłym tekście, przyklejając do poprzedzającego go napisu:

echo \'ala\';
$i++;
$a = $b - 1;

Podobnie postępujemy, gdy średnik pojawi się wewnątrz bardziej złożonej instrukcji, na przykład {stala}for{/stala}:

for ($i = 0; $i < $ile; $i++) { 
    ;
}

Pamiętaj, aby nie zapisywać kilku instrukcji w jednej linijce:

$a = 5; $b = 3;

Powyższe uwagi możesz również z powodzeniem zastosować do komentarzy. Nie należy umieszczać komentarzy w tej samej linii, co komentowany kod. Zamiast:

$a = $b + $c; // suma liczb

pisz:

// suma liczb
$a = $b + $c;

Puste linie w kodzie skryptu

W skrypcie dopuszczalne są puste linie zwiększające czytelność. Wewnątrz metod, funkcji oraz instrukcji sterujących stosuj wedle uznania pojedyncze puste linie. Oddzielając większe partie kodu, na przykład klasy czy zmienne globalne od stałych, możesz stosować podwójne puste linie. Unikaj natomiast potrójnych pustych linii oraz dłuższych przerw w kodzie skryptu.

Format kodu PHP

Otwarcie kodu php

Kod PHP otwieraj, stosując wyłącznie znaczniki {html}{/html}. Dzięki temu skrypty będą bardziej niezależne od konfiguracji PHP. Znacznik {html}{/html} nie stosuje się wcięcia.

Rezygnacja z opcji {stala}short_open_tag{/stala} wymusza także rezygnację ze skróconego zapisu instrukcji echo: {html}{/html}.

Komentarze

PHP zezwala na stosowanie komentarzy znanych z języka C, z C++ oraz powłoki u*ixowej-bash:

{stala}/* komentarz w C */{/stala}
{stala}// komentarz w C++{/stala}
{stala}# komentarz w shellu{/stala}

Standardy kodowania PEAR odradzają stosowanie komentarzy rozpoczynanych znakiem {stala}#{/stala}. Bez względu na wybrany rodzaj komentarzy pamiętaj o tym, aby tekst komentarza był wcięty podobnie jak komentowane instrukcje:

for ($i = 0; $i < $ile; $i++) { 
    // Czy $i jest parzyste? 
    if ($i % 2 == 0) { 
        /*
        * $i jest parzyste
        */
        echo $i; 
        ... 
    }
}

Operatory

Operatory języka PHP możemy podzielić na trzy grupy: operatory dwuargumentowe, operatory jednoargumentowe oraz operatory specjalne.

Do operatorów dwuargumentowych zalicza się między innymi instrukcję przypisania, operatory arytmetyczne {stala}+{/stala}, {stala}-{/stala}, {stala}*{/stala}, {stala}/{/stala} oraz operatory logiczne {html}>{/html}, {html}<{/html}, {html}>={/html} oraz {html}<={/html}. Operatory te otaczamy z każdej strony co najmniej jedną spacją:

$a = 3;
$b -= 5;
$c = $a + $b;
$d = ;

W przypadku serii podobnych instrukcji, zastosuj większą liczbę spacji, by otrzymać kod wyrównany pionowo:

$plk            = file(\'a.txt\');
$liczba_wierszy = count($plk);
$wynik          = array();

Pełne zestawienie operatorów, które powinno się otaczać znakami spacji, jest zawarte w tabeli 2 (następna strona). Zwróć uwagę, że język PHP pozwala na stosowanie operatorów logicznych znanych z języka Pascal: {stala}and{/stala}, {stala}or{/stala} oraz {stala}xor{/stala}. Najlepiej na wstępie zdecydować się na stosowanie jednego rodzaju operatorów. My korzystamy z zestawu {stala}&&{/stala}, {stala}||{/stala} oraz {stala}^{/stala} lub {stala}and{/stala}, {stala}or{/stala} i {stala}xor{/stala}. W większości aplikacji i bibliotek pisanych w PHP przeważa użycie operatorów języka C.

Drugą grupę, operatory jednoargumentowe, formatuje się, \"przyklejając\" do operandu. Na przykład:

$i++;
$bialy = !$czarny;
$plk = @file_get_contents(\'dane.txt\');
$ile = (int)$wiek;

Pełna lista operatorów jednoargumentowych została zawarta w tabeli 3 (nastepna strona).

Trzecią grupę operatorów stanowią operatory specjalne. Należą do nich nawiasy kwadratowe {stala}[{/stala} oraz {stala}]{/stala} dotyczące tablic, operator do tworzenia obiektów new, oraz przecinek umożliwiający wykonanie wielu instrukcji. Warto w tym miejscu omówić także formatowanie odwołania do pól i metod obiektów i klas {html}->{/html} oraz {stala}::{/stala}, strzałkę {html}=>{/html} występującą w definicji tablic oraz instrukcji {stala}foreach{/stala} jak również referencje {stala}&{/stala}. Formalnie, elementy te nie są operatorami, ale ich format jest zbliżony do formatu operatorów.

Po operatorze new należy umieścić jedną spację. Format ten różni się od formatu pozostałych operatorów jednoargumentowych (tabela 3). Jednakże ze spacji tej nie możesz zrezygnować, gdyż otrzymasz w ten sposób błąd:

$obj = newTStudent();

Nawiasy kwadratowe, stosowane przy tablicach formatuje się niemalże tak, jak nawiasy w zwykłym tekście - są one przyklejone do objętego tekstu:

$a[2] = $a[$i * 2 - 1];

Jedyną różnicą jest to, że po nazwie tablicy nie umieszczamy spacji.

Podobnie sprawa wygląda z operatorem {stala},{/stala}. Przecinek następuje po uprzedzającym go tekście, z kolei po nim umieszcza się pojedynczą spację:

for ($i = 0, $ile = count($tab); $i < $ile; $i++) { 
    ...
}

Zwróć uwagę, że powyższy zapis będzie prowadził do długich wierszy. Zawsze możesz go zastąpić pisząc:

$ile = count($tab)
for ($i = 0; $i < $ile; $i++) { 
    ...
}

Zwróć uwagę na:
  • otwarcie kodu PHP, wcięcia, puste linie, komentarze
  • stosowanie napisów, odwołania do liter napisów
  • instrukcje wyjścia {stala}echo{/stala} oraz {stala}print{/stala}, złożoną instrukcję {stala}if{/stala}
  • operator {stala}?:{/stala}, operatory pascalopodobne {stala}or{/stala}, {stala}and{/stala} i {stala}xor{/stala}
  • długie wyrażenia, długie nagłówki funkcji oraz długie wywołania funkcji

Strzałka występująca w instrukcji {stala}foreach{/stala} oraz w definicji tablic podlega tym samym zasadom, co operatory dwuargumentowe:

$a = array(\'one\' => \'adin\');
foreach ($t as $k => $v) {

Operator {html}&{/html} do tworzenia referencji podlega takiemu samemu formatowaniu, jak operatory jednoargumentowe:

$a = &$b;
$a = &new MyClass();

function &getMe($a, &$b)
{
}

Pełne zestawienie operatorów specjalnych zawarte jest w tabeli 4.

Nawiasy grupujące i operatory {stala}?{/stala} i {stala}:{/stala}

Omawiając operatory, należy wspomnieć o nawiasach występujących w wyrażeniach. Nawiasy należy formatować, przyklejając je do objętych nimi zapisów: {stala}(wyrażenie){/stala}, na przykład:

$a = (3 + 4) * 5;
lub
$a = ((3 + 2) / (5 - 1)) * (((3 + 4) * 5) + 11);

Ostatnim, niewymienionym dotychczas operatorem, jest operator selekcji {stala}?:{/stala}. Pełni on tę samą rolę, co instrukcja {stala}if{/stala}:

$c = $a > $b ? $a : $b;

Znaki {stala}?{/stala} oraz {stala}:{/stala} powinny zostać otoczone pojedynczymi spacjami. W przypadku otrzymania dłuższych linii lepiej użyć instrukcji {stala}if{/stala}.

Instrukcje sterujące

Instrukcje sterujące języka PHP mogą być zapisywane na dwa sposoby. Pierwszy sposób wywodzi się z języka C i polega na użyciu nawiasów klamrowych, na przykład:

if ($a >= 0) {
    echo \'Liczba nieujemna\';
} else {
    echo \'Liczba ujemna\';
}

Drugi sposób - nazywany notacją alternatywną - różni się od pierwszego tym, że w miejscu otwierającej klamry pojawia się dwukropek, zaś zamykająca klamra jest zastąpiona jednym z napisów: {stala}endif{/stala}, {stala}endwhile{/stala}, {stala}endfor{/stala}, {stala}endforeach{/stala} lub {stala}endswitch{/stala}. Na przykład:

$i = 1;
while ($i <= 10):
    echo $i;
    $i++;
endwhile;

My na wstępie rezygnujemy z alternatywnego zapisu instrukcji sterujących i pozostaniemy wyłącznie przy notacji języka C.

Drugą zasadą jest stosowanie nawiasów klamrowych nawet wówczas, gdy są one zbędne. Zamiast:

if ($a < 0)
    $a = -$a;

piszmy:

if ($a < 0) {
    $a = -$a;
}

Do formatowania instrukcji sterujących stosuj zasady zawarte w książce Kernighana i Ritchiego (w żargonie format ten bywa nazywany Kernighan-Ritchie). Klamra otwierająca instrukcji sterującej znajduje się w tej samej linii co początek instrukcji, zaś zamykająca - w tej samej kolumnie co pierwszy znak instrukcji:

if () {
    ;
}

while () {
    ;
}

foreach () {
    ;
}

Dodatkowo, nawiasy obejmujące warunek instrukcji są otoczone z każdej strony przez pojedynczą spację, zaś po klamrze kończącej całą instrukcję nie ma średnika.

Format instrukcji if został przedstawiony na listingu 1. Wszystkie listingi dotyczące instrukcji sterujących zawierają znak średnika, wskazujący wcięcie zagnieżdżonych instrukcji.

if () { 
    ;
}

if () { 
    ;
} else { 
    ;
}

W przypadku skomplikowanych, wieloczłonowych instrukcji {stala}if{/stala} należy wybrać jeden z dwóch dostępnych wariantów. Pierwszy stosuje dwa słowa kluczowe {stala}if{/stala} oraz {stala}else{/stala}, a drugi - pojedyncze słowo kluczowe {stala}elseif{/stala}. Szczegóły przedstawia listing 2.

//wariant stosujący jedno słowo kluczowe
if () {
    ;
} elseif () {
    ;
} elseif () {
    ;
} else {
    ;
}

//wariant stosujący dwa słowa kluczowe
if () {
    ;
} else if () {
    ;
} else if () {
    ;
} else {
    ;
}

Wszystkie pętle dostępne w języku PHP zostały przedstawione na listingu 3.

while () {
    ;
}
do {
    ;
} while ();
for (; ; ) {
    ;
}

for ($i = 0; $i < $ile; $i++) {
    ;
}

foreach ($t as $v) {
    ;
}

foreach ($t as $k => $v) {
    ;
}

Listing 4 przedstawia dość kontrowersyjną instrukcję {stala}switch{/stala}.

switch () {
case 1:
    ;
    break;

case 2:
    ;
    break;

default:
    ;
    break;
}

Pomimo zaleceń zawartych w standardach kodowania PEAR, wszystkie pakiety PEAR stosują wcięcie w odniesieniu do słów {stala}case{/stala}:

switch () {
    case 1:
        break;

    case 2:
        break;

    default:
        break;
}

Wypada jeszcze dodać, że format instrukcji {stala}declare{/stala} jest identyczny jak format instrukcji {stala}while{/stala}:

declare () {
    ;
}

oraz że średnik następujący po instrukcjach {stala}break{/stala} oraz {stala}continue{/stala} jest do nich przyklejony:

{stala}break;{/stala}
{stala}continue;{/stala}

Ostatnia uwaga dotyczy instrukcji {stala}return{/stala}. Nie stosuj nawiasów otaczających zwracaną wartość. Zamiast:

return(true);

pisz:

return true;

Dołączanie kodu

Kod dołączaj do skryptu, stosując instrukcje {stala}include{/stala}, {stala}include_once{/stala} oraz {stala}require_once{/stala}. Pamiętaj, że są to instrukcje, a nie funkcje. Zatem nie stosuje się nawiasów otaczających nazwę dołączanego pliku:

require_once \'user.class.php\';
include_once \'a.inc.php\';

W przypadku wielokrotnego dołączania jednego pliku do skryptu stosuj instrukcję {stala}include{/stala}:

include \'tabela.inc.php\';

Wywołanie funkcji

Nie umieszczaj odstępu pomiędzy nazwą funkcji, nawiasem otwierającym i pierwszym parametrem. Wewnątrz listy parametrów obowiązują takie same reguły jak w tekście. Po znaku przecinka umieszcza się spację, a sam przecinek następuje bezpośrednio po poprzednim argumencie.

$zm = myFun($a, $b, $c);

Definicja funkcji

Zasady formatowania parametrów występujących w definicji funkcji są identyczne jak w przypadku wywołania. Klamry otaczające ciało funkcji powinny zostać umieszczone w oddzielnych liniach w pierwszej kolumnie kodu:

function myFun($a, $b, $c)
{
    return $a + $b + $c;
}

Definicja klasy

Klasy należy formatować, stosując konwencję zbliżoną do definicji funkcji:

class A
{
    ....
}

Pamiętaj, aby nawiasy klamrowe, otaczające treść klasy umieszczać w osobnych liniach w tej samej kolumnie, co litera c słowa kluczowego {stala}class{/stala}.

Nazewnictwo

Stałe

Nazwy stałych należy pisać dużymi literami. Do oddzielania wyrazów stosuj znak podkreślenia. Do nazwy stałej dołączaj również przedrostek określający pakiet, w którym stała została zdefiniowana, na przykład:

CHESS_CLIENT_PORT
TEXT_WORD_SEPARATORS

W podanych przykładach wyrazy {stala}CHESS{/stala} oraz {stala}TEXT{/stala} stanowią nazwy pakietów. Jedynym wyjątkiem są stałe {stala}true{/stala}, {stala}false{/stala} oraz {stala}null{/stala}, których nazwy pisze się małymi literami.

Zmienne globalne

Nazwy zmiennych globalnych powinny się rozpoczynać od prefiksu {stala}_NAZWAPAKIETU_{/stala}, na przykład:

$_CHESS_username
$_TEXT_active

Pozwoli to na uniknięcie zdublowania nazwy zmiennej w poszczególnych pakietach.

Klasy

Nadając nazwy klasom, staraj się, aby były one jasne i nie zawierały skrótów. Nazwa klasy powinna rozpoczynać się dużą literą. W celu zawarcia informacji o hierarchii klas stosuj znak podkreślenia:

Log
Net_Finger
HTML_Upload_Error

Składowe prywatne należy poprzedzać prefiksem {stala}_{/stala}:

var $_nazwa_pliku;

Funkcje i metody

Przy nazywaniu funkcji i metod stosuje się zasadę \"wielbłądzich garbów\" (ang. camel caps). Oznacza to, że nazwę funkcji rozpoczyna się zawsze małą literą, zaś każdy kolejny człon (tj. wyraz, skrót lub fragment wyrazu) literą dużą. Ewentualnie nazwę funkcji można poprzedzać prefiksem pakietu:

connect()
getData()
buildSomeWildget()
XML_RPC_serializeData()

Nazewnictwo plików

Pliki zawierające klasy najlepiej nazywać nazwą klasy, nadając im rozszerzenie {stala}.class.php{/stala}, na przykład: {stala}Smarty.class.php{/stala}. Można ewentualnie pominąć człon {stala}.class{/stala} w nazwie pliku {stala}DB.php{/stala}.

Każdą klasę należy zapisać w osobnym pliku lub też zgrupować w jednym pliku kilka klas współpracujących ze sobą.

Plikom zawierającym stałe, zmienne globalne oraz funkcje nadawaj rozszerzenie {stala}.inc.php{/stala}, ewentualnie pomijając człon .inc: {stala}walidacja.inc.php{/stala}, {stala}function.eval.php{/stala}.

Przykładowe adresy URL

Zgodnie z dokumentem RFC 2602, poprawnymi przykładowymi adresami URL są adresy zawierające jedną z następujących nazw domenowych: example.com, example.org lub example.net. Na przykład:

{stala}http://www.example.org/skrypt.php?{/stala}
{stala}imie=Jan&nazwisko=Nowak{/stala}
{stala}email:ktos@example.net{/stala}

Spójność formatu

Wymagania wymienione powyżej są w znacznej mierze oparte na wielokrotnie wspomnianym już dokumencie \"Standardy kodowania biblioteki PEAR\". Zagadnienia nieporuszone przez standardy (m.in. kilka operatorów, puste wiersze, wcinanie komentarzy) oparłem na własnych przyzwyczajeniach oraz na kodach aplikacji wymienionych we wstępie.

Zwróć uwagę na pewien ważny aspekt formatowania kodu, a mianowicie jego spójność. Może się zdarzyć tak, że części zasad nie zaakceptujesz i pozostaniesz przy stosowaniu własnych rozwiązań. Dla przykładu formatowanie referencji możesz chcieć zapisywać w postaci: {stala}$a =& $b;{/stala}.

W takiej sytuacji powinieneś konsekwentnie stosować jeden z zapisów. Bałaganiarstwem jest pisanie:

$a =& $b;
...
$a = &$b;

A bałaganiarstwo nigdy nie popłaca.

Jeśli z jakichkolwiek powodów zdecydujesz się na krótkie otwarcie PHP oraz wcięcia przy użyciu tabulatorów, wówczas w całym skrypcie (czy też we wszystkich skryptach w przypadku większych projektów), musisz konsekwentnie stosować wybrane rozwiązanie.

Szczególnym przypadkiem są instrukcje echo oraz print. Składnia języka PHP zezwala na następujące siedem rozwiązań:

{stala}echo \'a\';{/stala}
{stala}echo\'a\';{/stala}
{stala}echo(\'a\');{/stala}
{stala}print \'a\';{/stala}
{stala}print\'a\';{/stala}
{stala}print(\'a\');{/stala}
{stala}echo \'a\', \'b\', \'c\';{/stala}

Warto wybrać i stosować wyłącznie jedno z nich. Ja osobiście jestem przyzwyczajony do instrukcji {stala}echo \'a\';{/stala}.

Podobnie rzecz się ma w odniesieniu do napisów. Przykładowe rozwiązania w tym względzie mogą wyglądać następująco:

{stala}echo \' tekst \';{/stala}
{stala}echo \" tekst \";{/stala}

{stala}require_once \'a.inc.php\';{/stala}
{stala}require_once \"a.inc.php\";{/stala}

{stala}echo \' tekst \' . $a . \' TEKST \' . $b;{/stala}
{stala}echo \" tekst $a TEKST $b\";{/stala}

Najczęstszym rozwiązaniem spotykanym w kodach popularnych aplikacji jest stosowanie apostrofów zawsze tam, gdzie cudzysłów nie jest konieczny, na przykład:

echo \' tekst \';
require_once \'a.inc.php\';

Ponadto stosując rozwiązanie zawierające konkatenację napisów:

{stala}echo \' tekst \' . $a . \' TEKST \' . $b;{/stala}

otrzymujesz możliwość skrócenia długości wierszy.

Patrząc na formatowanie kodu nieco szerzej, bezpiecznym wyjściem jest stosowanie zasady zawartej w specyfikacji języka HTML. Zasada ta odnosi się do programów generujących i analizujących kod HTML i brzmi: \"Generuj kod jak najbardziej rygorystycznie zgodny z pewnymi (np. powyższymi) wytycznymi, zaś analizując cudze programy, stosuj jak najbardziej liberalne podejście\".

Problemy z życia wzięte

Głównym problemem, jaki napotkasz przy formatowaniu rzeczywistych fragmentów kodu, będzie długość linii. W wielu sytuacjach możliwe jest przeformatowanie kodu, tak aby jego wiersze miały długość nieprzekraczającą 80 i kod był ciągle czytelny. Jednakże są i takie przypadki, kiedy każdy będzie bezsilny.

Analizując np. plik {stala}Smarty.class.php{/stala} w wersji 1.516 (dystrybucja 2.6.10 pakietu Smarty), w linii 229 znajdziesz definicję pola {stala}$security_settings{/stala}. Kod ten można znacznie lepiej sformatować, stosując do długich wywołań funkcji konwencję zbliżoną do instrukcji sterujących:

nazwaFunkcji(
    ....
    ....
    ....
);

Listing 5 przedstawia skrócony i ujednolicony zapis definicji pola {stala}$security_settings{/stala}.

var $security_settings  = array(
    \'PHP_HANDLING\'    => false,
    \'IF_FUNCS\'        => array(
        \'array\',
        \'list\',
        \'isset\',
        \'empty\',
        \'count\',
        \'sizeof\',
        \'in_array\',
        \'is_array\',
        \'true\',
        \'false\',
        \'null\'
    ),
    \'INCLUDE_ANY\'     => false,
    \'PHP_TAGS\'        => false,
    \'MODIFIER_FUNCS\'  => array(\'count\'),
    \'ALLOW_CONSTANTS\' => false
);

Podobnie postąpić należy z monstrualnym nagłówkiem funkcji {stala}register_object(){/stala} z linii 716. Nagłówek ten po zastosowaniu powyższego rozwiązania przyjmie postać:

function register_object(
    $object,
    &$object_impl,
    $allowed = array(),
    $smarty_args = true,
    $block_methods = array()
) {
    ...
}

Natomiast instrukcja return z linii 950 zwracająca wynik działania funkcji {stala}call_user_func_array(){/stala} może zostać zapisana jako:

return call_user_func_array( 
    $this->cache_handler_func, 
    array( 
        \'clear\', 
        &$this, 
        &$dummy, 
        $tpl_file, 
        $cache_id, 
        $compile_id, 
        $exp_time 
    )
);

W analogiczny sposób sformatuj wywołanie funkcji {stala}smarty_core_write_compiled_include(){/stala} w linii 1421 (oryginalna linia ma niemalże 200 znaków długości) - listing 6.

smarty_core_write_compiled_include(
    array_merge(
        $this->_cache_include_info,
        array(
            \'compiled_content\' => $_compiled_content,
            \'resource_name\'    => $resource_name
        )
    ),
    $this
);

Długie warunki instrukcji {stala}if{/stala} czy {stala}while{/stala} możesz zapisywać, stosując konwencję:

if (
    ...
) {
    ...
} else {
    ...
}

Linia 1694 po zastosowaniu powyższego rozwiązania przyjęłaby postać pokazaną na listingu 7.

if (
    ($string{0} == \"\'\" || $string{0} == \'\"\')
    && $string{strlen($string)-1} == $string{0}
) {
    return substr($string, 1, -1);
} else {
    return $string;
}

Podsumowanie

Trud włożony w przyzwyczajenie się do zasad formatowania kodu PHP, opisanych w dokumentacji biblioteki PEAR, z pewnością się opłaci. Na format kodu warto zwrócić uwagę od początku nauki języka. Unikniesz wtedy konieczności przestawiania się z jednego formatu na inny.

Jeśli którąkolwiek z zasad uznasz za zbędną lub zechcesz stosować własne wypracowane rozwiązanie, pamiętaj o zachowaniu spójności i konsekwencji.

Nazewnictwo w programach komputerowych stanowiło podstawę rozprawy doktorskiej Charlesa Simonyi\'ego pt. \"Meta-Programming: A Software Production Method\". Praca ta ustanowiła szeroko rozpowszechniony standard nazewniczy znany jako notacja węgierska. Jest ona dostępna na stronach MSDN pod adresem: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvsgen/html/HungaNotat.asp.

Szerszy opis adresów URL, w tym wspomnianych example.org, znajdziesz natomiast w dokumencie RFC 2606 pt. \"Reserved Top Level DNS Names\".

Zgłębiając formatowanie kodu w językach, opartych o składnię języka C, warto odwiedzić witrynę programu astyle: http://sourceforge.net/projects/astyle/. Służy on do automatycznego przeformatowania kodu programu w języku C. Z dołączonej dokumentacji dowiesz się o różnych stylach formatowania programów w języku C.

Ćwiczenia przedstawione w artykule są dostępne na stronie domowej autora pod adresem http://www.gajdaw.pl.

Może cię też zainteresować

Internet Maker

PHP zdobył przed laty popularność jako język skryptowy do tworzenia stron internetowych. Wzięła się ona z pewnością stąd, że jeszcze kilka lat temu nie było alternatywy dla szybkiego, prostego...

Internet Maker

To już trzecie wydanie książki Andrzeja Kierzkowskiego, tłumaczącej nie tylko podstawy języka PHP 5, ale także zawierającej wiele praktycznych ćwiczeń. Autor od lat pisze książki dotyczące programowania w tym języku,...

Internet Maker

Język PHP jest wykorzystywany najczęściej do tworzenia skryptów pracujących na tekście. Jednak dzięki dołączonej do PHP bibliotece GD, możliwa jest łatwa praca na grafice – od prostej obróbki po rysowanie...

Internet Maker

Symfony to jeden z najlepszych dostępnych obecnie frameworków w języku PHP. Dzięki jasnej strukturze oraz generatorom kodu przygotowanie kompletnej aplikacji WWW zajmuje kilku minut. Artykuł opisuje krok po kroku...