Codul PHP, ca de altfel orice cod-sursa scris in alte limbaje de programare, poate fi avea o multitudine de forme, in functie de stilul de programare al fiecaruia. Pentru a face acest cod usor de citit si de inteles, este foarte important sa se respecte o serie de conventii.
Scrierea de cod clar si care sa respecte standarde bine-cunoscute este benefica atat pentru autorul codului (in special atunci cand va trebui sa opereze modificari), cat si pentru alti programatori care vor avea acces la cod (programatorii noi vor intelege mai usor un cod-sursa scris bine).
Mai jos sunt prezentate cateva din cele mai uzuale conventii respectate de o mare parte a programatorilor.
Organizarea codului PHP 0
Este general acceptat ca organizarea codului in mai multe fisiere si directoare este primul pas in a avea un proiect usor de mentinut si de modificat. Unele limbaje de programare, cum este Java, impun reguli stricte referitoare la plasarea fisierelor sursa in directoare. In PHP insa, nu exista restrictii iar programatorii sunt liberi sa-si organizeze codul cum vor. Aceasta libertate poate avea insa si dezavantaje: permite anumitor programatori sa construiasca proiecte neingrijite.
De aceea este nevoie sa fie respectate cateva reguli legate de organizarea codului.
Mai multe fisiere sursa
Separati codul PHP in mai multe fisiere, in functie de ceea ce face fiecare portiune de cod. Folositi cat de multe fisiere auxiliare aveti nevoie - este mai bine ca un fisier sa fie concis, sa contina cod putin si usor de citit, decat sa aiba sute de linii de cod greu de urmarit. Mai mult, numele fisierelor trebuie sa fie sugestive si conforme cu destinatia acestora.
Exemplu de fisiere ce pot exista intr-un proiect:
- config.php - contine configurari, definiri de constante sau variabile globale
- auth.php - verificari de acces, autentificare si altele
- db.php - ofera acces la baza de date
- util.php - defineste functii utilitare
- search.php - defineste functii de cautare
- log.php - defineste functii pentru loguri
- index.php - fisier principal ce le include pe toate celelalte
Aceasta lista nu este nici completa, nici restrictiva; in functie de proiect, fiecare isi poate defini oricate fisiere crede de cuviinta. Important este ca ele sa fie justificate iar codul continut sa aiba legatura cu destinatia lor (spre exemplu, nu ar fi tocmai potrivit ca o functie de cautare in baza de date sa fie scrisa in fisierul config.php).
Gruparea in directoare
Odata cu crearea mai multor fisiere apare si nevoia de a le grupa in mai multe foldere in functie de destinatia lor. Este mai usor de gasit un fisier si de inteles destinatia acestuia atunci cand face parte dintr-un director cu un nume sugestiv.
Exemplu de structura a directoarelor dintr-un proiect PHP:
config/
|- site.php
|- db.php
utils/
|- auth.pgp
|- db.php
|- util.php
|- log.php
|- search.php
pages/
|- about.php
|- portfolio.php
|- contact.php
|- search.php
admin/
|- users.php
|- posts.php
data/
|- portfolio.xml
|- products.xml
resources/
|- site.css
|- logo.png
|- favicon.png
index.php
Separarea fisierelor PHP de alte resurse
In exemplul de mai sus se poate vedea ca exista foldere separate pentru fisiere non-PHP. Este important ca toate aceste fisiere sa nu fie puse in aceleasi directoare cu fisierele PHP din mai multe considerente: organizare, securitate, flexibilitate in configurarea serverului web, etc. Incercati pe cat posibil sa tineti fisierele sursa separate de alte resurse statice.
Formatarea codului sursa 0
Un factor decisiv care poate face diferenta intre un cod-sursa clar si un cod-sursa greu de inteles il reprezinta stilul de programare. Este adevarat ca fiecare programator are propriul stil de a scrie cod, dar respectand regulile general-acceptate de formatare a codului, atunci riscul de a scrie cod prost si chiar de a face greseli scade considerabil.
Exista mai multe conventii referitoare la forma codului sursa, iar cele mai intalnite sunt prezentate mai jos.
Identificatori
Identificatorii se refera la numele variabilelor, constantelor, functiilor si alt altor elemente definite de utilizator. Folosirea unei strategii consecvente de alegere a numelor face codul mai lizibil si reduce riscul de a introduce erori, de aceea este de evitat folosirea diferitelor tipare in cadrul aceluiasi proiect.
In functie de tipul de identificator, exista conventii diferite.
- Variabilele. Identificatorii de variabile vor incepe intotdeauna cu litera mica si vor fi reprezentativi pentru ceea ce reprezinta variabila (de exemplu: $varsta, $total, $suma si nu $v, $t sau $s). Numele scurte, de o litera, sunt acceptate doar in cazul iteratiilor ($i, $j, $k), doar ca variabila temporara ce reprezinta lungimea unui sir ($n, $m) si doar pentru a exprima exceptiile ($e). In cazul in care numele variabilei este format din mai multe cuvinte, este indicat ca aceasta sa adopte forma "Camel case": $sumaMaxima, $numeleUtilizatoruluiLogat, $fisierulCeVaFiSters, etc. Sunt intalnite si formele de separare prin underscore, dar nu sunt indicate deoarece fac numele sa fie mai lungi: $numar_de_copii, $versiune_browser, etc.
- Constantele. Identificatorii constantelor sunt scrisi doar cu majuscule iar partile componente se separa prin underscore: MARIME_FISIER, NUMAR_MAXIM_PERMIS, NUME_SITE, etc.
- Functiile. Identificatorii de functii urmeaza aceleasi reguli ca cei de variabile.
- Clasele si interfetele. Identificatorii de clase urmeaza aceleasi reguli ca cei de variabile, cu diferenta ca prima litera este tot timpul majuscula. Exemple de nume de clase: Categorie, Produs, FacturaProforma, etc.
Identare
Toate liniile din interiorul unui bloc trebuie identate cu un tab in plus fata de identarea curenta. Acest lucru ajuta la identificarea usoara a instructiunilor care fac parte din blocul respectiv si fac codul mai lizibil.
Exemplu de cod-sursa cu identare (recomandat):
if($conditie) {
echo "Tutorial PHP in limba romana";
$var = 1;
if($altaConditie) {
echo "Tutorial PHP";
} else {
echo "Ghid PHP";
}
} else {
exit;
}
Exemplu de cod-sursa fara identare (nerecomandat):
if($conditie) {
echo "Tutorial PHP in limba romana";
$var = 1;
if($altaConditie) {
echo "Tutorial PHP";
} else {
echo "Ghid PHP";
}
} else {
exit;
}
Paranteze
Exista situatii cand folosirea parantezelor nu este obligatorie, dar cu toate acestea, este recomandat ca acestea sa fie folosite chiar si acolo unde nu sunt necesare, pentru a spori lizibilitatea. Mai mult decat atat, folosirea acoladelor la instructiunea if elimina confuziile legate de ce instructiuni se executa pe fiecare ramura.
Exemplu de situatie unde folosirea parantezelor rotunde ajuta la marirea lizibilitatii codului:
// recomandat
$a = ($b = 2);
$x = (isset($varsta) ? ($varsta + 18) : 18);
if( ($a > 1) && ($b > 2) && ($c == 3) ) {
echo "Tutorial PHP";
}
// nerecomandat
$a = $b = 2;
$x = isset($varsta) ? $varsta + 18 : 18;
if( $a > 1 && $b > 2 && $c == 3 ) {
echo "Tutorial PHP";
}
Spatii albe si linii noi
In limbajul PHP spatiile albe si randurile libere nu influenteaza evaluarea codului. Astfel pot fi inserate oricate spatii sau linii noi in codul sursa pentru a-l face mai usor de urmarit si inteles. Folosirea lor tine de fiecare programator, dar o recomandare uzuala este ca elementele unei expresii compuse sa fie separate printr-un spatiu alb, iar instructiunile care fac lucruri diferite sa fie separate prin randuri noi.
Exemplu de folosire a spatiilor in expresii:
// recomandat
$a = $n - 1;
if( ($a > 1) && ($b > 2) && ($c == 3) ) {
echo "Tutorial PHP";
}
// nerecomandat
$a=$n-1;
if(($a>1)&&($b>2)&&($c==3)){
echo "Tutorial PHP";
}
Exemplu de folosire a liniilor noi:
echo "php.punctsivirgula.ro - "
echo "Tutorial PHP"
// randul nou separa instructiunile echo de instructiunea if
if( isset($limba) ) {
echo " in limba romana";
}
Lungimea liniilor
Pentru a mentine codul sursa vizibil pe toate tipurile de monitoare este indicat ca liniile sa nu depaseasca 80 de caractere. Orice linie mai lunga de aceasta limita va deveni greu de urmarit.
Instructiuni de control
Partile componente ale instructiunilor de control if-else, while si do-while, trebuie scrise pe linii diferite, chiar si atunci cand contin doar o instructiune. De asemenea folosirea acoladelor este incurajata pentru ca reduce riscul de a introduce erori in cod.
// recomandat
if($conditie) {
echo 'True';
} else {
echo 'False';
}
while($i > 0) {
echo $i++;
}
// nerecomandat
if($conditie) echo 'True'; else echo 'False';
while($i>0) echo $i++;
Comentarii
Comentariile ce contin explicatii scurte si care se intind pe cel mult o linie sau doua pot fi delimitate de // sau #. Acestea sunt de obicei folosite pentru a descrie destinatia unei variabile sau actiunea instructiunilor imediat urmatoare. Comentariile mai elaborate ce descrie un algoritm sau o procedura trebuie delimitate de /* si */.
Este recomandat ca toate comentariile sa fie scrise, pe cat posibil, pe randuri noi si nu la sfarsitul instructiunilor sau in interiorul lor.
// recomandat
// datele din formular
$date = $_POST['email'];
// validam datele introduce se utilizator
if( !empty($date) ) {
echo 'Valid';
}
// nerecomandat
$date = $_POST['email']; // datele din formular
if( !empty($date) ) { // validam datele introduce se utilizator
echo 'Valid';
}
Comentariile sunt utile in orice portiune a codului sursa si este chiar indicat sa fie folosite ori de cate ori este nevoie. Trebuie evitate insa comentariile inutile ce nu aduc nici o informatie noua sau care sunt folosite pentru a descrie o constructie evidenta.
Exemple de comentarii inutile:
// initializam variabila
$a = 1;
// verificam daca $a este definita
if(isset($a)) {
// afisam $a
echo $a
}
Practici de programare web 0
Mai jos sunt prezentate cateva practici utile oricarui programator sau dezvoltator web.
Descrierea codului
Scrieti cat mai multe comentarii in care sa explicati ce anume va executa codul sursa. O practica utila este ca la inceputul fiecarui fisier sa fie descris succint continutul si functionalitatea fisierului. De asemenea, toate functiile a caror functionalitate nu este evidenta trebuie descrise printr-un comentariu.
Separarea ideilor
Impartiti problemele mari in parti mai mici ce pot fi implementate prin functii. Daca o functie devine prea mare (codul sursa se intinde pe cateva zeci sau sute de linii) atunci inseamna ca este prea complexa si ca este un candidat bun la impartirea in mai multe functii mai simple.
De asemenea, este bine ca functionalitatile asemanatoare sa fie separate, fizic, in fisiere diferite.
Separarea design-ului de logica de business
O practica des intalnita in programarea web consta in separarea codului de prelucrare a datelor de cel responsabil cu afisarea lui. Acest lucru ofera o flexibilitate mai mare, in special in situatia in care trebuie aplicate schimbari in oricare din cele doua parti. De asemenea, permite programatorilor web sa lucreze oarecum independent de designerii web.
Exista mai multe modalitati prin care se poate realiza efectiv aceasta separare: fie folosind un sistem de sablonare (ce foloseste template-uri), fie separand pur si simplu instructiunile de afisare de restul codului sursa. Prima varianta implica o complexitate mai mare si devine utila doar pentru proiectele de mari dimensiuni, in timp ce varianta a doua poate fi aplicata in orice proiect de orice dimensiuni.
Un exemplu de separare este ilustrat mai jos:
11 && $h < 18 ) {
$mesaj = "Buna ziua";
} elseif( $h >= 18 ) {
$mesaj = "Buna seara";
}
// cod de afisare
print <<
Tutorial PHP - php.punctsivirgula.ro
$mesaj, $nume!
Azi este: $data
Nimic de afisat.
Adauga un comentariu la aceasta sectiune.