Cauta rapid aici ↑

Notiunii fundamentale in PHP

Ce este PHP ?

PHP este un limbaj ce ruleaza pe server si din acest motiv i se mai spune si limbaj server side. Probabil ca te-ai gandit ca PHP este un limbaj cu care creezi un program (software). Tehnic PHP nu este un limbaj cu care creezi software pentru ca nu face parte din aceasta categorie, PHP este un limbaj de scripting. Diferenta este ca un limbaj de scripting va fi executat in momentul cand este declansat un eveniment si va rula intreg codul. In timpul cand va fi executat codul PHP acesta va avea o minima interactiune cu utilizatorul sau nici-o interactiune cu utilizatorul.

PHP nu va fi executat pana ce o pagina in care acesta este nu este ceruta. In momentul cand o pagina este ceruta atunci intreg codul PHP va fi executat de sus si pana jos.

PHP este un limbaj ce va trebui interpretat de catre un server si nu are nevoie sa fie compilat spre deosebire de limbajele C si Java care trebuie sa fie compilate pentru ca apoi sa fie interpretate. PHP este executat de catre server exact asa cum este scris iar singura grija pe care trebuie sa o avem este sa ne asiguram ca serverul (interpretorul) de PHP sa gaseasca documentul cu codul PHP.

PHP este creat sa lucreze cu limbajul HTML dar in acelasi timp sa poata genera si cod HTML pe care ulterior il va trimite catre browser. Pana acum stim ca documentele HTML au extensia .html si tot asa documentele PHP vor avea extensia .php. Extensia .php ii va spune serverului ca in interiorul documentului se poate afla cod PHP ce trebuie interpretat inainte de a fi trimis codul rezultat catre browser.

PHP ne va oferi posibilitatea de a interactiona cu utilizatorul pagini ca raspuns la un eveniment declansat cel mai adesea de un formular din codul HTML. Acest formular poate lua mai multe forme si incepand de la un formular de autentificare si pana la un formular prin care poti trimite date catre o baza de date cu ajutorul limbajului PHP.

Sintaxa limbajului PHP este foarte asemanatoare cu cea a limbajelor C, Java si Perl si daca aveti experienta cu acestea atunci nu va va fi foarte greu sa intelegeti limbajul PHP.

Istoria limbajului PHP

Prima versiune a limbajului PHP a aparut in 1994 si a fost scrisa de Rasmus Lerdorf cu scopul de a inlocui limbajul Perl. Versiunea a doua a aparut un an mai tarziu si avea implementat diferite functionalitati prin care se puteau gestiona datele trimise dintr-un formular web. Aceasta versiune a devenit ulterior publica.

La inceput PHP reprezenta acronimul de la Personal Home Page Tools sau mai pe scurt PHP Tools. Aceasta denumire vine de la necesitatea de a-si gestiona pagina web personala. Versiunea 3.0 a limbajului vine cu schimbari substantiale si asta pentru ca intre timp la dezvoltarea limbajului contribuie alti doi programatori, Zeev Suraski si Andi Gutmans. Acestia au rescris cea mai mare parte a limbajului PHP intre anii 1997 si 1998 si i-au schimbat si insemnatatea acronimului devenind astfel PHP Hypertext Preprocessor. Practic prima litera P reprezinta acronimul initial iar urmatoarele litere reprezinta cuvintele adaugate de cei doi programatori si in acest fel devenind Personal Home Page Hypertext Preprocessor.

Versiunea 3.0 reprezenta versiunea din PHP care a facut ca acest limbaj sa fie atat de popular astazi printre programatori. Aceasta versiune se aseamana foarte mult cu restul de versiuni aparute ulterior si desi nu mai este folosita astazi nu ar trebui sa fie un impediment pentru un programator daca s-ar trezi peste noapte sa foloseasca aceasta versiune veche a PHP.

Odata cu versiunea 4.0 limbajul PHP sufera din nou noi modificari si asta pentru ca Andi Gutmans (devenit ulterior Sir) infiinteaza compania Zend, companie cu ajutorul careia va rescrie nucleul limbajului PHP. Scopul principal al versiunii 4.0 este de a facilita scrierea de cod modular si o mai buna intelegere a codului daca alt programator a scris alt cod. Toate acestea vin ca un efect al succesului de care se bucura PHP la acea vreme. Versiunea 4.0 a fost lansata public in luna Mai din anul 2000 si de atunci nucleul limbajului PHP va face referire catre motorul (interpretorul) Zend.

In cele din urma a venit si lansarea versiuni 5.0 a limbajului. Data lansari a fost in Iulie 2004 si vine cu o alta modificare substantiala a limbajului si a motorului Zend. PHP 5 include diferite functionalitati noi printre care o mai buna performanta, o mai buna structurare a limbajului in lucrul cu obiecte si o mai buna conectare cu baza de date.

Fiecare mare versiune a limbajului a venit si cu mici versiuni imbunatatite si la ora la care scriu aceste randuri versiunea PHP 5.5 a limbajului este cea mai folosita la nivel global. Este important sa retineti ca fiecare mare versiune a limbajului nu schimba din temelii ceea ce PHP ofera odata cu versiunea 3.0

De ce sa folosesti PHP ?

Motivele pentru care este bine sa folosesti PHP sunt acelea ca ai descoperit limita pe care ti-o ofera limbajul HTML si vrei mai mult decat iti ofera HTML-ul. Un alt motiv pentru care este bine sa folosesti PHP este ca acesta este open source (sursa libera sau gratuita). Open source inseamna ca poti folosi limbajul pentru studiu, sa il modifici sau sa il folosesti. Orice developer poate imbunatati felul cum PHP lucreaza si trimite pareri despre ce ar trebui imbunatatit.

PHP este un limbaj cross platform si prin asta se intelege ca nu conteaza daca va rula pe un server Windows, Mac sau Linux, toate liniile noastre de cod vor fi executate identic si vor da acelasi rezultat.

Un alt motiv pentru care este bine sa folosesti PHP esta sa stii ca marile site-uri precum Facebook sau Yahoo folosesc PHP ca tehnologie pe server. Totodata nu trebuie sa crezi ca daca PHP este open source asta inseamna neaparat ca nu este la fel de competitiv cu tehnologiile pentru care platesti ca sa le folosesti. PHP a fost creat cu gandul la dezvoltarea web si amintiti-va ca mai sus am spus ca primul rol a fost de a inlocui Perl ca tehnologie folosita pe server si implicit de a gestiona mai bine pagina personala a site-ului web a celui care l-a creat.

Limbajul PHP are o documentatie foarte clara pe site-ul lor oficial www.php.net, site in care veti descoperi o multime de functii care fac lucruri minunate pentru programatori. In cazul in care ai nevoie sa implementezi o functionalitate in aplicatia ta web atunci trebuie sa te intrebi daca nu cumva exista o functie care face aceasta treaba in locul tau si nu mai este nevoie sa scrii aceasta functie. Asadar recomand cu tarie folosirea site-ului lor oficial pentru a descoperi ce face o anumita functie sau sa afli elemente noi legate de limbaj dupa ce vei citi si retine cat mai mult din aceasta pagina.

Instalarea

Limbajul PHP are nevoie de un server (interpretor) de PHP pentru a putea fi interpretat iar acest server va trebui sa fie gestionat de un alt server. De cele mai multe ori va fi un server Apache sau NGNIX. Pentru exercitiu va recomand XAMPP.

In aceasta sectiune nu voi intra in detaliile tehnice cum se poate instala aceste servere pentru ca scopul acestui tutorial este altul si din acest motiv va trebui sa cautati online o modalitate prin care sa faceti ca script-urile voastre sa ruleze.

Incorporarea codului si doua reguli importante in scrierea codului

Incorporarea codului

In PHP avem mai multe posibilitati prin care putem adauga liniile noastre de cod intr-un fisier cu extensia .php. Am sa va arat doar una dintre ele si asta pentru ca este cea mai folosita si va scuteste de situatii neplacute prin care script-ul PHP nu ar fi executat.

Un script PHP incepe cu <?php si se termina cu ?>. In interior vom adauga liniile noastre de cod PHP. Un fisier PHP poate avea continut ce reprezinta o intrega pagina HTML. Putem adauga oriunde intre etichetele HTML cod PHP. Putem adauga cod inaintea intregului cod HTML, dupa codul HTML si cum am spus anterior in oricare loc din etichetele HTML.

Este foarte important sa retineti ca in momentul in care veti adauga cod PHP inaintea codului HTML, atunci trebuie ca <?php sa fie pe prima linie din document, in caz contrar acel script s-ar putea sa nu fie interpretat.

Doua reguli importante in scrierea codului

In PHP fiecare linie de cod trebuie sa se termine cu punct si virgula. Aceasta este regula generala in majoritatea limbajelor de programare iar in PHP aceasta regula este vitala pentru ca in caz contrar serverul ne va arata o eroare.

In PHP spatiile dintre liniile de cod nu sunt importante si putem avea oricate ne dorim, interpretorul nu le va lua in seama.

Comentarii si afisarea unei informatii

Comentarii

In orice limbaj de programare avem posibilitatea de a adauga un text ajutator prin care sa ne facem munca de programator mult mai usoara. In acest fel vom adauga un text pe o linie sau pe mai multe linii prin care vom adauga text care sa ne ajute sa intelegem pe viitor mai usor liniile de cod scrise la acea data. Totodata putem sa facem ca un intreg cod sa fie comentat si in acest fel il vom dezactiva si nu va fi interpretat pana cand ne dorim ca acel cod sa fie interpretat din nou si in acest caz il vom decomenta.

Modalitatea prin care vom comenta o linie de cod sau orice este prin adaugarea a doua caractere slash →//← inaintea oricarei linii de cod sau text.

Modalitatea prin care vom comenta pe mai multe linii de cod o vom face prin adaugarea de un singur slash si imediat caracterul asterisk. Aceasta este zona de start din comentariu si va trebui sa adaugam si zona de sfarsit din comentariu si vom face asta prin adaugarea in mod invers a caracterelor adaugate la zona de start. Asadar un comentariu pe mai multe linii de cod se adauga folosind aceste caractere speciale →/*← si →*/←.

Afisarea unei informatii

Modalitatea prin care vom putea afisa o informatie oriunde in codul HTML foarte rapid este prin folosirea functiei echo(). De cele mai multe ori o vom putea folosi si fara paranteze dar obligatoriu trebuie sa fie un spatiu intre echo si un text pe care vrem sa il afisam. In cele mai multe limbaje de programare un text trebuie adaugat in interiorul a doua ghilimele, fie simple sau duble. Asadar urmatoarea linie de cod ne va afisa textul din interiorul ghilimelelor.

<?php echo 'Hello world!'; ?>

Variabile

Daca ai lucrat cu un limbaj de programare atunci cu siguranta stii ce este si reprezinta o variabila. Daca nu ai lucrat cu un limbaj de programare atunci este vital sa stii ca o variabila este un spatiu de memorie ce poate contine o valoare sau nu. Aceasta valoare se poate modifica pe masura ce liniile de cod sunt executate.

In PHP o variabila va incepe intotdeauna cu semnul →$← si va fi urmata obligatoriu de o litera sau de caracterul special underscore. Apoi o variabila va putea contine alte litere scrise cu majuscule ori minuscule, cifre sau caracterul liniuta ce poate fi interpretat ca si caracter minus (nu va recomand sa folositi acest caracter). Variabilele nu pot contine spatii libere. Toate variabilele sunt case sensitive iar asta inseamna ca o variabila scrisa cu litera mare si apoi cu litera mica vor reprezenta doua variabile diferite.

In PHP exista o lista de cuvinte cheie pe care nu le puteti folosi in declararea variabilelor iar aceasta lista o puteti gasi la acest url http://www.php.net/manual/en/reserved.php.

Dupa cum am spus mai sus, o variabila poate contine o valoare sau nu. In cazul in care nu contine o valoare este bine sa adaugam imediat punct si virgula si in acest fel ii vom spune interpretorului de limbaj PHP ca acea linie de cod se poate termina acolo, in cazul in care vrem ca variabila sa contina o valoare atunci vom separa numele variabilei de valoarea acesteia folosindu-ne de operatorul de atribuire ce este reprezentat de semnul egal → = ←.

Tipul variabilelor

Acum ca am vazut cum putem declara (scrie) o variabila, este timpul sa vedem de cate tipuri pot fi acestea.

Variabile string

Variabilele de tip string sunt declarate folosind ghilimelele simple sau cele duble iar in interiorul acestora vom putea declara incepand de la un string cu lungimea de zero caractere si pana la un string ce poate contine si alte tipuri de variabile, varianta pe care nu o recomand in momentul cand sunteti la inceput de drum cu acest limbaj. Acum este timpul sa vedem cateva variabile de tip string.

<?php $var1 = 'I love PHP'; $var2 = "I love PHP because is easy.<br />"; ?>

Dupa cum se poate vedea, in interiorul ghilimelelor vom putea avea si cod HTML iar acesta va fi interpretat de catre browser. Mai putem avea si cod JavaScript sub forma de text in PHP si nu este nici-o problema de compatibilitate.

Variabile de tip numeric

Variabilele de tip numeric sunt reprezentate de valoarea numerica pe care acestea o pot avea. Aceste valori pot fi reprezentate de valori numerice negative sau pozitive. Mai mult decat atat aceste valori numerice pot avea virgula mobila sau nu. Toate acestea vor putea fi considerate de interpretorul PHP ca fiind variabile numerice.

Totusi nu va recomand sa folositi in operatiile matematice variabile de tip string ce contin valori numerice chiar daca interpretorul va incerca sa converteasca acea valoare sub forma de string la valoare numerica. Motivul este unul cat se poate de simplu si asta pentru ca acel string ar putea contine si un text ce cu siguranta va fi pierdut in urma conversiei.

Variabile matrice

Un alt tip de variabila este reprezentat de o variabila matrice iar intre programatori o vei intalni cel mai adesea ca variabila array iar pe aceasta din urma o voi folosi si eu in continuare. O variabila de tip array va putea fi declarata cu ajutorul unei functii predefinite a limbajului pana la versiunea 5.4 a limbajului. Dupa aceasta versiune va putea fi declara si la fel ca in alte limbaje iar unul dintre acesta este JavaScript.

Variabilele de tip array sunt impartite in doua tipuri. Variabile array indexate dupa pozitia elementelor din interior si variabile indexate dupa pozitia obiectelor din interior iar acestea din urma mai poarta denumirea si de variabile array asociative.

Variabile array bazate pe pozitia elementelor din interior

In urmatorul cod veti putea vedea cum se poate declara acest tip de variabile array.

    	$var_arr1 = array(); // versiunea veche
		$var_arr1 = []; // versiunea noua
    

Acest tip de variabila va putea avea o multime de valori separate obligatoriu prin virgula. Tipul acestor valori pot fi de foarte multe feluri si pe mai multe niveluri. O variabila array va putea contine alte variabile sau valori de tip numeric ori string sau chiar alte variabile array.

$var_arr2 = array(1, 2.5, "PHP", array(5,9,7));

Datele dintr-un array vor putea fi accesate declarand in alta parte a codului numele variabilei array si imediat o pereche de paranteze drepte. In interiorul acestor paranteze vom adauga o valoare numerica reprezentand pozitia valorii din array pe care vrem sa o accesam. O regula importanta in lucrul cu aceste valorii din array este ca numaratoarea incepe de la cifra zero si nu de la unu dupa cum te-ai putea astepta. Asadar prima valoarea va avea indexul zero, a doua valoare va avea indexul unu s.a.m.d.

echo $var_arr2[2]; // va afisa string-ul PHP

In cazul in care vrem sa vedem intreg array-ul in browser intr-un mod frumos aranjat va trebui sa ne folosim de o alta functie a limbajului iar aceasta este print_r() si reprezinta acronimul de la print readable.

print_r($var_arr2);
Variabile asociative

Sintaxa acestui tip de variabila array este asemanatoare cu cea de dinainte iar diferenta o face ca fiecare valoare din interior va avea o valoare asociativa, valoare care va face referinta catre o alta valoare din acelasi grup cu ajutorul caracterelor → => ←.

$var_assoc = array('name' => 'Vali', 'meseria' => 'Developer');

Daca vrem sa afisam o valoare din acest array asociativ atunci va trebui scriem aproape identic ca si la array-ul bazat pe pozitia elementelor si in locul cifrelor vom adauga textul care ne intereseaza si care face referinta catre valoarea ceruta.

echo $var_assoc['meseria']; // va afisa textul Developer

Exista o posibilitate prin care putem declara o variabila asociativa care sa functioneze la fel ca si cea bazata pe pozitia elementelor iar exemplu urmator va arata si cum.

    	$var_a = array(1,2,3);
		$var_b = array(0 => 1, 1 => 2, 2 => 3);
    

Observati cum aceste array-uri functioneaza ? Acum depinde doar de voi si de nevoile pe care le aveti in realizarea proiectelor la care lucrati.

Variabile boolean

O variabila boolean este un tip de program care poate avea doua valori. Aceste valori pot fi true sau false in aceasta forma. Uneori le mai puteti vedea si sub forma de valori numerice de 1 si 0. Cifra unu este pentru true iar cifra zero este pentru false. Este foarte important sa retineti ca valorile pentru acest tip de variabila nu vor fi adaugate in interiorul ghilimelelor pentru ca in acest mod vor fi interpretate ca fiind string. Un alt aspect la acest tip de variabila si pe care vreau sa il retineti este ca scrierea valorilor pentru acest tip de variabila nu conteaza si cand spun asta ma refer la faptul ca aceste valori pot fi scrise cu litere mici sau mari, practic nu conteaza si vor avea aceeasi insemnatate pentru serverul de PHP. Valorile boolean sunt case insensitive.

Acest tip de variabila poate fi folosita in multe situatii iar una dintre ele este prin folosirea unei structuri conditionare despre care va voi spune un pic mai tarziu.

$var1 = true; $var2 = false;

Variabila null

Variabilele de tip null sunt strict reprezentate de prezenta acestui cuvant ca valoare. Acest tip de variabila ne spune ca tipul valori nu este de tip string, numeric, array sau boolean ci este pur si simplu reprezentarea unei variabile ce nu contine nici-o valoare. La fel ca si la variabila de tip boolean si aceasta variabila este case insensitive.

$var_null = null;

Constanta

O constanta reprezinta opusul unei variabile si asta pentru ca pe masura ce liniile de cod sunt interpretate, o constanta isi va pastra valoarea pe care aceasta o are. O alta diferenta intre o constanta si o variabila este prin modul cum o constanta este declarata. O constanta va fi declarata in limbajul PHP folosindu-ne de o functie predefinita a limbajului iar aceasta este define(). Aceasta functie va avea doi parametri separati de o virgula. Primul va fi un string cu numele constantei iar parametrul doi va fi valoarea pe care constanta o va avea.

define("x", 10); echo x; // va afisa numarul 10

Pe langa faptul ca o constanta nu isi poate modifica valoarea care i-a fost atribuita initial, constantele mai au o caracteristica importanta iar aceasta este ca nu pot fi redefinite. Serverul de PHP iti va afisa o eroare.

Structuri conditionare

Structurile conditionare sunt o componenta principala pentru orice limbaj de programare iar PHP nu face exceptie. Aceste structuri ne permit sa rulam un anumit bloc de cod daca conditia din structura conditionara este adevarata.

Structura conditionara if

Sintaxa

Sintaxa este una foarte simpla si va incepe intotdeauna cu literele if si urmate imediat de doua paranteze rotunde in care vom adauga o expresie care daca va fi adevarata serverul PHP va executa blocul de cod de dupa parantezele rotunde si adaugate cel mai adesea intre doua acolade.

    	if(expresie){
        	// bloc de cod
        }
    

In cazul in care expresia nu este adevarata atunci serverul de PHP va ignora blocul de cod existent in interiorul acoladelor ce face parte din structura conditionara if.

Declaratia else if si else

Sintaxa else if

Sintaxa pentru else if este aproape identica ca si declaratia pentru if iar diferenta este ca aceasta va fi adaugata intotdeauna dupa declaratia if si va incepe cu else si urmata cel mai adesea de un spatiu si apoi o alta structura if.

    	if(expresie){
        	// bloc de cod
        }
        else if(expresie){
        	// alt bloc de cod
        }
    

Rolul acestei structuri este ca vom putea pune mai multe conditii in codul nostru si daca una dintre ele este indeplinita atunci blocul de cod dintre acoladele structurii ce a fost indeplinita va fi executat.

Sintaxa else

Sintaxa pentru else este cea mai simpla dintre toate si in momentul cand aceasta este prezenta serverul de PHP va executa blocul de cod dintre acolade daca niciuna dintre conditii nu a fost indeplinita. Structura else va fi adaugata intotdeauna dupa structurile prezentate mai sus.

    	else{
        	// un alt bloc de cod
        }
    

Structura switch

Structura switch este una pe care mai rar o veti intalni in liniile de cod scrise de alti programatori dar face parte din majoritatea limbajelor de programare si este bine sa stiti de ea. Rolul acesteia este de a scrie mai usor si mai simplu un bloc de cod ce este alcatuit dintr-o multime de structuri if, else if si else dar intr-un alt mod si cu cateva cuvinte cheie rezervate ale limbajului.

Sintaxa

    	switch(expresie){
	    case n:
	        code block
	        break;
	    case n:
	        code block
	        break;
	    default:
	        default code block
		}
    
		$a = 3;
		switch($a){
			case 0:
				echo "a este egal cu 0";
				break;
			case 1:
				echo "a este egal cu 1";
				break;
			case 2:
				echo "a este egal cu 2";
				break;
			case 3:
				echo "a este egal cu 3";
				break;
			default:
				echo "a nu are nici-o valoare pe care sa o testez";
		}
	

Importanta cuvantului cheie break

Am vazut anterior cum putem sa afisam un text in cazul in care una dintre cazuri este adevarata. In cazul in care nu am fi avut ulterior declarat cuvantul cheie break atunci structura switch va rula in continuare restul de cod si nu ne dorim asta pentru ca ar fi aratat si restul de text pe care am vrea sa il vedem doar daca conditia respectiva era indeplinita.

Importanta cuvantului cheie default

Acest cuvant spune mai multe decat pot eu sa va zic in acest paragraf si este mai mult decat intuitiv rolul pe care acesta il are. Cu ajutorul acestui cuvant vom putea sa afisam o informatie sau sa rulam un bloc de cod daca niciuna din cazurile de mai sus nu erau indeplinite.

Structuri repetitive

Rolul structurilor repetitive este ca vor fi executate de un numar de ori si in functie de blocul de cod din interior vor returna un rezultat.

Structura repetitiva for

Structura repetitiva for o vom recunoaste prin acest cuvant folosit si la fel ca la structura if va fi urmata de paranteze rotunde si apoi acolade in care vom adauga blocul de cod ce va fi executat de cate ori va fi executata aceasta structura repetitiva for.

Sintaxa

Dupa cum spuneam sintaxa structuri for incepe cu acest cuvant cheie urmat de paranteze rotunde si apoi acolade ce va contine blocul de cod ce va fi executat de cate ori va fi rulata aceasta structura si nu intamplator m-am repetat pentru ca aceasta structura este una dintre cele mai folosite in limbajele de programare.

In interiorul parantezelor rotunde vom avea cel mai adesea trei declaratii separate obligatoriu de punct si virgula. Ultima declaratie nu necesita la sfarsitul ei prezenta caracterului punct si virgula. Prima declaratie este reprezentata de o valoare de inceput, a doua declaratie va fi reprezentata de o valoare de test si in cele din urma a treia declaratie va fi reprezentata de valoarea de inceput care va fi incrementata sau decrementata in functie de ceea ce ne dorim.

    	for(declaratie1; declaratie2; declaratie3){
    		// bloc de cod
        }
    
    	for($i = 0; $i < 10; $i++){
        	echo $i;
        }
    // va afisa 0123456789
    

Nu este momentul acum sa va bateti capul cu aceasta structura si mai ales cu rolul caracterului →<←, caracter ce are rolul cel mai important din structura. Veti afla mai multe ceva mai jos cand va voi prezenta operatorii si tipul acestora.

Structura foreach

Aceasta structura repetitiva este aproape identica cu structura for iar diferenta consta in cuvantul foreach si de modul cum aceasta structura este declarata. Mai mult decat atat structura foreach va avea si un cuvant cheie pe care il va folosi din plin iar acesta este as.

Sintaxa

    	foreach($array as $value){
        	// bloc de cod
        }
    

Dupa cum se poate intelege si din sintaxa, structura foreach va avea ca prim parametru cel mai probabil un array urmat de un spatiu si apoi cuvantul cheie as si apoi inca un spatiu si la sfarsit o variabila ce va fi temporara dar cu care vom retine fiecare valoare din array-ul parcurs, pentru ca acesta va fi scopul pentru care vom folosi aceasta structura cel mai des, vom parcurge array-uri. La fiecare executie a acestei structuri vom face ceva cu respectiva valoare din array si la fel ca si pana acum, o vom afisa in browser.

    	$numbers = array(0,1,2,3,4,5);
        foreach ($numbers as $value){
        	echo $value;
        }
        // va afisa 012345
    

Am vazut mai sus ca putem avea si un alt tip de array iar acesta este un array asociativ. Pentru a putea parcurge un astfel de array si sa afisam valorile din array-ul asociativ va trebui sa adaptam structura foreach la felul cum sunt declarate valorile din interior.

    	foreach($array as $key => $value){
        	// bloc de cod
        }
    

Observam ca acum avem doua variabile temporare si dupa cum spune si numele sunt impartite in chei cu valori, exact cum este si array-ul asociativ. Acum este timpul sa vedem acelasi exemplu de mai sus cu diferenta ca vom face array-ul sa fie unul asociativ si apoi sa ii afisam valorile din interior.

    	$numbers = array(0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5);
        foreach ($numbers as $key => $value){
        	echo $value;
        }
        // va afisa 012345
    

Ce vreau sa retineti la aceasta structura repetitiva este ca numele variabilelor temporare sunt nume arbitrare iar voi puteti sa folositi orice nume veti dori sau puteti sa folositi doar litere pentru aceste variabile temporare. Un alt aspect important la structura repetitiva foreach este ca aceasta este o modalitate mai buna de a parcurge un array si asta pentru simpla si intuitiva structura pe care o are dar si pentru ca aceasta structura odata ajunsa la finalul array-ului se va opri automat spre deosebire de structura for care trebuie sa contina o variabila temporara cu numarul referitor la de cate ori vrem sa rulam o structura for.

Importanta cuvantului cheie continue

Acest cuvant cheie nu vi l-am prezentat si asta pentru ca rolul lui este unul destul de clar. Cuvantul cheie continue va face sa ruleze si restul de cod daca una din cazuri din structura switch este indeplinita. Continue are rolul opus fata de break. Totodata fiecare structura switch sau for o putem interpreta ca avand acest cuvant la sfarsitul blocului de cod din interiorul acoladelor. Sa va dau un exemplu prin care vom face ca structura for sa execute acest cuvant mai repede decat ar trebui si in acest caz o linie de cod nu va fi executata iar serverul de PHP va incepe sa ruleze din nou structura for.

		for($i = 0;$i < 6; $i++){
			if($i == 2){ continue; }
			echo $i;
} // va afisa 01345

Un secret al cuvintelor cheie break si continue

Aceste cuvinte cheie reprezinta numele unor functii in PHP si am vazut cum prezenta acestor cuvinte vor face ca o structura repetitiva sa fie oprita sau sa continue cu o alta repetitie ignorand restul de bloc de cod. Spuneam ca aceste cuvinte cheie reprezinta numele unor functii in PHP. Aceste functii au ca si parametru valoarea 1. Probabil ca va intrebati ce este cu aceasta valoare ? Aceasta valoare este foarte utila cand avem in interiorul unei structuri repetitive o alta structura repetitiva cu acelasi rol si mai exact o structura for in interiorul unei alte structuri for. Aici este partea interesanta. Daca vrem sa oprim sau sa continuam executia structuri repetitive parinte atunci va trebui sa ii declaram un alt parametru functiei break sau continue. Cifra 1 va reprezenta structura din care face parte iar cifra 2 va reprezenta structura parinte din care face parte. Asadar asa vom opri o structura parinte dintr-o structura copil. Acelasi procedeu si daca vom avea trei sau mai multe structuri repetitive una in alta desi aceasta situatie nu am intalnit-o pana acum.

break(2); continue(2);

Structura while, do while

Structura repetitiva while

Aceasta structura este una dintre cele mai simple si este un amestec de conditie if si for doar ca sunt folosite alte cuvinte cheie. Rolul acestei structuri repetitive este de a executa un bloc de cod ori de cate ori expresia este indeplinita. Spre deosebire de structura if care va executa un bloc de cod o singura data, structura while va executa blocul de cod pana ce expresia nu va mai fi indeplinita.

Sintaxa while
    	while(expresie){
        	// bloc de cod
        }
    
    	$a = 1;
        while($a < 5){
        	echo $a; $a++;
        }
        // va afisa 1234
    

Structura do

Aceasta structura este asemanatoare cu declaratia else iar diferenta este ca va fi adaugata inaintea structuri while iar structura while isi va pierde acoladele si implicit blocul de cod din interior. Urmatorul exemplu va afisa acelasi rezultat ca cel anterior.

    	$a = 1;
        do{
        	echo $a;
            $a++;
        }
        while($a < 5)
        // va afisa 1234
    

Operatori

Operatori matematici

Rolul acestor operatori este de a efectua diferite operati matematice sau de a adauga sau scadea o valoare a unei variabile

  • + Adunare
  • - Scadere
  • * Inmultire
  • / Impartire
  • % Modulo
  • ++ Incrementare // adauga la valoarea existenta o unitate ce este egala cu unu
  • -- Decrementare // scade la valoarea existenta o unitate ce este egala cu unu

Operatori de atribuire

  • x = 1 variabila x are valoare 1
  • x += 2 atribuim lui x vechea sa valoare, marita cu 2. Variabila are valoarea 3
  • y = 10
  • y -= 5 scadem din y valoarea 5. Variabila y are valoarea 5
  • z = 2
  • z *= 3 inmultirea cu 3. Variabila are valoarea 6
  • a = 12
  • a /= 4 impartirea prin 4. Variabila are valoarea 3
  • b = 16
  • b %= 5 impartirea modulo 5. Variabila are valoarea 1

Operatori logoci

  • && SI
  • || SAU
  • ! NEGARE

Operatori de comparare

  • == testeaza daca doua valori sunt egale (non strict)
  • === testeaza daca valorile sunt egale si daca tipul valorilor sunt egale (strict)
  • != testeaza daca o valoare nu este egala cu alta valoare (non strict)
  • !== testeaza daca o valoare nu este egala cu o alta valoare si tipul valorilor nu sunt egale (strict)
  • < mai mic decat o valoare
  • > mai mare decat o valoare
  • <= mai mic sau egal cu o valoare
  • >= mai mare sau egal cu o valoare

Operatorul de concatenare

Acest operator este unul dintre cele mai folosite in limbajele de programare si cu el putem lipi sau mai bine spus construi cel mai adesea un string sau o comanda prin care vom interoga o baza de date.

Operatorul de concatenare este reprezentat in PHP de caracterul special →.← si il putem folosi sa adaugam la sfarsitul unei variabile o anumita valoare sau informatie. Il putem folosi oriunde vrem sa concatenam ceva.

    	$nume = 'Vali';
        $prenume = 'Valentin';
        echo $nume . ' ' . $prenume;
        // va afisa Vali Valentin
    
    	$nume_si_prenume = 'Vali';
        $nume_si_prenume .= ' Valentin';
        echo $nume_si_prenume;
        // va afisa Vali Valentin
    

Functii

Functiile sunt unele dintre cele mai folosite caracteristici ale limbajelor de programare si pentru o intelegere cat mai usoara a acestora va trebui sa retineti urmataorea idee. Functiile sunt ca un mic programel care face ceva.

Mai sus am vazut cateva functii predefinite ale limbajului iar acestea nu sunt toate ci sunt de ordinul sutelor si este putin probabil sa le folositi pe toate in liniile voastre de cod. Acum noi nu suntem limitati in a folosi functiile predefinite ale limbajului ci putem sa cream noi insine o functie care va face ce vrem noi si pentru asta vom face cunostinta cu sintaxa acesteia si cu cuvantul cheie function.

Sintaxa

Sintaxa creari unei functi este una foarte simpla si este scrisa in felul urmator.

    	function nume_functie(argument1, argument2... argumentN){
        	// bloc de cod
        }
     

Dupa cum se poate vedea declararea unei functii se face cu ajutorul cuvantului cheie function. Dupa acesta vom avea nevoie sa denumim functia ca mai apoi sa stim ce functie sa apelam. Numele functiei poate incepe numai cu litera sau underscore si poate contine anumite caractere speciale sau cifre. Numele functiei nu poate contine spatii. Numele functiei este case insensitive. Functia odata declarata nu va putea fi declarata din nou. Intre cuvantul cheie function si numele functiei trebuie sa fie obligatoriu un spatiu si asta pentru ca serverul de PHP sa inteleaga ca este vorba de o functie. Se observa ca functia poate avea argumente iar acestea vor fi adaugate in interiorul parantezelor rotunde de dupa numele functiei si separate de virgula daca numarul argumentelor este mai mare de unul. La sfarsit vom avea blocul de cod sau corpul functiei care va face ceea ce ne dorim noi sa faca iar acest bloc de cod va sta obligatoriu in interiorul acoladelor.

In acest moment suntem in masura sa declaram propria functie care va face ceea ce ne dorim iar in exemplul urmator vom declara o functie care va afisa rezultatul unei adunari. Ca si regula nescrisa in programare numele functiei este dat de ceea ce respectiva functie va face.

    	function adunare(){
    		echo 1 + 2;
	     }
    

Acum daca testati acest cod nu veti putea sa vedeti nimic in pagina si asta pentru ca va trebui sa apelam functia.

Apelarea unei functii

Apelarea unei functii se va putea realiza cu ajutorul a catorva modalitati foarte simple iar eu o sa va prezint doar una dintre ele pentru ca o veti intalni foarte des in alte linii de cod scrise de alti programatori si asta pentru ca este abordarea cea mai simpla si eficienta.

Apelarea de care spuneam se face prin adaugarea a doua paranteze rotunde dupa numele functiei si cel mai adesea pe o alta linie de cod. Nu uitati ca va trebui sa va obijnuiti sa adaugati punct si virgula dupa fiecare linie de cod ori declaratie.

adunare();

Spuneam mai sus ca o functie este ca un mic programel care face ceva. Acum ati vazut un exemplu extrem de simplu prin care functia va afisa un rezultat in browser.

Functiile declarate de noi vor face exact ce ne dorim noi si in interiorul acestora vom putea avea si functii predefinite ale limbajului care vor lucra in interiorul acelei functii.

O alta regula nescrisa in programare este DRY si reprezinta acronimul de la Don't Repeat Yourself. Aceasta regula vine si ne motiveaza pe noi sa scriem cod cat mai putin posibil dar cu acelasi rezultat iar functiile sunt cele care vor fi folosite cel mai mult de noi si vor fi puse la microscop si de alti programatori cu experienta.

Pentru ca cel mai probabil sunteti la inceput de drum va voi arata cum puteti face ca functia declarata anterior sa o puteti refolosi in alta operatie matematica. Pentru asta va trebui sa ne folosim de ajutorul argumentelor.

Argumente

Argumentele sunt diferite variabile ce sunt declarate in interiorul parantezelor rotunde ale functiei de dupa numele functiei in momentul cand aceasta a fost declarata. Rolul argumentelor este de a face referinta la valorile pe care functia le va avea in momentul cand aceasta a fost apelata in alt loc din cod.

Este extrem de important sa retineti ca in momentul cand apelam o functie ce in momentul cand a fost declarata i sau atribuit unul sau mai multe argumente, functia apelata va trebui sa contina acelasi numar de argumente sub forma de valori daca nu i sau atribuit valori predefinite ale fiecarui argument in parte in momentul cand functia a fost declarata (aceasta parte o voi explica mai tarziu).

    	function adunare($a, $b){
        	echo $a + $b;
        }
		adunare(1,2);
     

Mai departe puteti apela functia ori de cate ori veti dori si sa ii dati alte valori si in functie de valorile pe care functia le va primi, functia va executa o operatie de adunare asupra celor doua valori ca si argumente. Pentru asta exista acoladele pentru ca in interiorul lor vom avea liniile de cod ce vor face ceea ce numele functiei sugereaza.

Cuvantul cheie return

In PHP si in multe alte limbaje de programare vom intalni cuvantul cheie return. Rolul acestui cuvant este de a obliga functia sa returneze ceva iar acest ceva poate fi de la un simplu nimic si pana la o matrice cu valori. Acest ceva il putem folosi mai tarziu in cod.

In momentul cand o functie intalneste acest cuvant restul de cod prezent de dupa acesta este ignorat. Totusi putem sa conditionam printr-o structura conditionara sau repetitiva momentul cand o functie va intalni acest cuvant prin care functia ve returna o valoare, valoare ce o putem stoca intr-o variabila. Pentru a va arata acelasi exemplu dar cu folosirea cuvantului cheie return va trebui sa modificam functia adunare.

    	function adunare($a, $b){
        	return $a + $b;
        }
		$number = adunare(1,3);
    

In acest banal exemplu variabila number va avea valoarea pe care functia adunare o va returna.

Argumente cu valori de baza

In PHP avem posibilitatea sa setam diferite valori de baza pentru argumentele unei functii. Aceste valori vor putea fi folosite in momentul cand functia apelata nu va avea nici-un argument cu care sa lucreze in cazul in care acesta ii este si scopul.

Modalitatea prin care vom seta o valoare de baza pentru un argument din functie este identica cu declararea unei variabile iar diferenta este ca nu va mai trebui sa adaugam punct si virgula la sfarsit, ba mai mult este interzis.

    	function adunare($a=1,$b=2){
        	return $a + $b;
        }
    

In acest fel putem sa lucram cu valorile de baza ale functiei daca si numai daca nu i-am atribuit o valoare ca si argument corespondent pentru fiecare argument al functiei pentru momentul cand aceasta a fost declarata.

Este important ca in momentul cand ii declarati valori de baza pentru oricare dintre argumente, functia apelata sa primeasca acelasi numar de argumente (sau niciunul) si in ordinea in care acestea au fost declarate, in caz contrar va veti lovi de diferite probleme de logica.

Scopul variabilelor

Probabil ca va intrebati de ce va vorbesc din nou despre variabile in contextul in care vorbesc despre functii. Motivul este unul cat se poate de simplu. Functiile au un mediu al lor si orice variabila declarata in limbajul PHP in interiorul unei functii este considerata ca fiind valabila doar in interiorul acelei functii.

In PHP avem trei tipuri de variabile iar acestea sunt impartite in variabile super globale, variabile globale si variabile locale.

Variabile superglobale

Variabilele super globale in PHP sunt variabilele predefinite ale limbajului si la fel ca si in cazul functiilor predefinite ale limbajului si acestea pot fi folosite oriunde in codul nostru. Variabile precum $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION si $_SERVER sunt variabile super globale.

Variabile globale

Variabilele globale sunt acele variabile ce nu sunt declarate in interiorul functiilor si nu pot fi adaugate in interiorul functiilor decat in anumite conditii.

Variabile locale

Dupa cum spuneam, variabilele locale sunt acele variabile ce sunt declarate in interiorul functiilor. Totusi putem sa adaugam in interiorul functiei o variabila declarata in afara functiei prin folosirea cuvantului cheie global. Acest cuvant va fi adaugat inaintea variabilei declarate in afara functiei dar in interiorul functiei. Practic vom scrie in interiorul functiei pe prima linie din interior cuvantul cheie global si apoi la un spatiu distanta semnul dolar urmat de numele variabilei declarate in afara functiei si fara valoarea pe care aceasta o are.

Variabile predefinite ale limbajului PHP

Cateva randuri mai sus am adus vorba despre variabilele superglobale $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION si $_SERVER. Aceste variabile pot fi folosite oriunde in liniile noastre de cod si vor fi scrise intotdeauna cu litera mare. Aceste variabile sunt variabile de tip array si vor detine diferite informatii cu care putem sa lucram. Numele acestor variabile ne spun cate ceva despre tipul de informatie pe care o detin fiecare in parte.

Variabila $_GET

Aceasta variabila va retine informatia trimisa prin bara de adrese si in PHP avem doua modalitati prin care putem face asta. Cea mai simpla modalitate este prin a adauga aceste valori in bara de adrese si pentru asta va trebui sa stim cum sa scriem acest lucru. Al doilea mod prin care vom putea realiza acest lucru este prin trimiterea datelor dintr-un formular prin metoda GET.

Variabila $_POST

Aceasta variabila va retine informatiile trimise printr-un formular prin metoda POST.

Variabila $_FILES

Aceasta variabila va retine informatiile legate de un fisier trimis cu ajutorul unui formular HTML. Informatii precum numele, tipul si marimea fisierului se vor regasi in aceasta variabila.

Aceasta variabila va stoca fisierul trimis in directorul temporar al serverului si va trebui mutat in directorul unde avem nevoie de el. Pentru asta ne vom folosi de functia predefinita (metoda) move_uploaded_file().

Variabila $_COOKIE

Este mai mult decat sugestiv ce va face aceasta variabila. Aceasta variabila va retine o informatie dintr-un fisier text stocat pe calculatorul utilizatorului.

Variabila $_SESSION

Aceasta variabila va avea informatii legate de sesiunea din acel moment cu browserul utilizatorului. O sesiune are durata de viata atata timp cat respectiva fereastra din browser este deschisa. In momentul cand fereastra browserului este inchisa sesiunea este inchisa.

In PHP exista doua metode folosite la deschiderea si inchiderea unei sesiuni, session_start() si session_destroy().

Variabila $_SERVER

Aceasta variabila este una dintre cele mai folosite si contine o multime de informatii. Incepand de la calea absoluta in sistem, protocolul folosit, metoda folosita (get, post, head, si putt), diferite informatii legate de browserul utilizatorului, adresa IP a utilizatorului si multe altele.

Va recomand sa folositi urmatoarea linie de cod pentru a vedea intreg continutul variabilei $_SERVER. → var_dump($_SERVER);

Erori in PHP

In PHP sunt cateva tipuri de erori cu care te vei intalni cel mai adesea si este foarte important sa le reti cat mai curand.

Erori de logica codului

Primul tip de eroare si la care este cel mai bine sa te gandesti este cel legat de logica codului si ma refer aici ca in browser nu vei intalni informatia pe care o vei dori afisata. In acest caz va trebui sa parcurgi linie cu linie din partea de cod care va afisa o informatie in browser.

Cea mai intalnita problema printre incepatori este ca au uitat sa adauge inca un semn egal intr-o structura conditionara if facand in acest fel diferenta dintre semnul de atribuire a unei valori si semnul de comparare a unor valori. Aceeasi situatie si in cazul compararii cu dublu semn egal si triplu semn egal. La dublu semn egal vom compara valorile iar la triplu semn egal vom compara valorile si tipul valorilor.

O alta problema intalnita este cea prin care iti declari numele variabilelor. Stim ca PHP este un limbaj case sensitive iar o variabila scrisa cu o litera mare este diferita de o alta variabila scrisa cu litera mica. Recomandarea este sa folositi doar litere mici.

Erori de sintaxa

Al doilea tip de eroare este cel legat de sintaxa si o vom recunoaste prin textul afisat in pagina web iar acest text va incepe cu Parse error: syntax error, unexpected.... Cea mai intalnita problema este absenta caracterelor punct si virgula dupa fiecare linie de cod. Amintiti-va ca spuneam mai sus ca limbajul PHP nu tine cont de spatiile libere dintre liniile de cod si din acest motiv putem scrie mai multe linii de cod pe un singur rand (daca acestea sunt foarte scurte) iar cel mai adesea o veti face in cazul unei structuri conditionare switch. Tot la erori de sintaxa este intalnita si absenta caracterelor de inchidere, de delimitare a structurilor limbajului iar aici ma refer strict la inchiderea corpului unei functii, adica acolada de inchidere lipseste. O alta problema des intalnita este cea legata de declararea unei variabile string. Stim ca o variabila string este recunoscuta prin delimitarea informatiei de tip text cu ghilimele simple sau duble. Textul din interior poate contine exact una dintre ghilimele simple sau duble exact ca si cele care delimiteaza continutul text si in acest caz va trebui sa scapam acea ghilimea si sa nu fie confundata cu sfarsitul string-ului. Acest lucru se face prin adaugarea caracterului backslash inaintea ghilimelei cu pricina.

Erorile notice, warning si fatal error

Al treilea tip de eroare este impartit in alte trei subcategori si reprezinta erorile pe care serverul de PHP ni le va afisa pe ecran daca aceasta functie este activata din fisierul de configurare php.ini (display_errors = On si error_reporting = E_ALL), fisier extrem de important pentru serverul de PHP.

In codul PHP putem folosi functiile (metode) predefinita a limbajului pentru a afla daca serverul de PHP va afisa sau nu erorile. → init_set('display_errors', 'On'); error_reporting(E_ALL) // On este declarat ca string iar E_ALL ca si constanta.

Spuneam ca acest tip de erori sunt impartite in trei subcategori si vor incepe intotdeauna cu unul sau doua cuvinte cheie reprezentand tipul de eroare. Aceste cuvinte sunt notice, warning si fatal error.

Erorile notice

Erorile de tip notice sunt reprezentate cel mai adesea de folosirea in cod a unei variabile care inca nu fusese declarata. In acest caz codul urmator va fi executat in continuare. Putem asemana acest tip de eroare ca si cum am primi o atentionare din partea serverului de PHP.

Erorile warning

Erorile de tip warning sunt acel tip de eroare prin care serverul ne spune ca a gasit o problema la o anumita linie de cod dar a putut sa execute codul de dupa problema. Cel mai adesea o vom intalni in cazul in care nu am atribuit acelasi numar de atribute unei functii, nu am scris corect calea catre un alt fisier sau nu avem diferite drepturi sa accesam acel fisier. Putem asemana acest tip de eroare ca si cum am primi o palma din partea serverului de PHP.

Erorile fatal

Acest tip de eroare o veti intalni cel mai adesea in cazul in care o clasa sau o functie nu a fost declarata. Acest tip de eroare nu va mai executa restul de cod de dupa linia de cod unde a intalnit aceasta eroare. Putem asemana acest tip de eroare ca si cum am primi un pumn in fata din partea serverului de PHP.

Ponturi pentru depanarea codului

Mai devreme sau mai tarziu veti ajunge in situatia in care veti lucra cu fisiere in care ati scris voi sau alti programatori codul PHP ori vreti sa implementati o anumita functionalitate in cod. Uitati cateva functii care va vor ajuta sa afisati informatia in browser in cazul in care nu obtineti rezultatul dorit.

  • echo $a // va afisa continutul variabilei $a
  • print_r($a) // (print readable) va printa continutul variabilei $a care cel mai adesea este un array
  • gettype($a) // va afisa tipul variabilei $a
  • var_dump($a) // va afisa tipul si valorile variabilei $a, practic ne va spune tot ce trebuie stiut despre variabila $a
  • get_defined_vars() // ne va afisa toate variabilele declarate (incercati acest cod → print_r(get_defined_vars()) ←)
  • debug_backtrace() // ne va afisa pasii facuti pana in acel moment al codului (incercati acest cod in interiorul unei functi care va afisa un text → var_dump(debug_backtrace()) ←)

Un site web care va pot ajuta sa depanati mai usor liniile voastre de cod scrise in PHP. → https://xdebug.org/

Tehnici utile

Variabile variabile

Variabile variabile nu reprezinta un termen care ar trebui sa te sperie, mai ales daca nu ai auzit de el pana acum. Presupun ca ai cunostinte legate de fundamentele acestui limbaj si stii sa declari o variabila si sa afisezi continutul pe care aceasta il are. Variabile variabile reprezinta modalitatea prin care numele unei variabile este luat de la valoarea unei alte variabile si in acest fel vom afisa continutul unei variabile care isi are numele intr-o variabila ca valoare. Aceasta tehnica implica scrierea de doua ori a semnului dolar.

Sa presupunem ca avem doua variabile string. Prima variabila va avea numele de ana iar cea de a doua va avea numele de anca. Fiecare variabila va avea ca valoare numele celeilante. Acum este timpul sa afisam valoarea unei variabile prin aceasta tehnica si in acest caz va fi continutul variabilei anca.

    	$ana = 'anca';
        $anca = 'ana';
        echo $$ana;// va afisa ana
    

Ceea ce se intampla este in felul urmator si va trebui sa cititi de la dreapta la stanga sau sa ignorati semnul dolar din stanga. Daca nu am avea primul semn dolar, in browser vom avea afisat continutul variabilei ana si vom vedea textul anca. Acum sa presupunem ca acest text este in locul acestei variabile si facem sa apara si semnul dolar pe care l-am ignorat. Asta inseamna ca in browser vom vedea continutul variabilei anca.

Functii predefinite ale limbajului cu care sa lucrezi pe un array

In orice limbaj de programare vom intalni array-uri si functii predefinite ale acelui limbaj care ne vor ajuta sa adaugam un element la inceputul sau la sfarsitului array-ului sau sa scoatem un element la inceputul sau la sfarsitului array-ului. Din fericire denumirea acestor functii este asemanatoare in orice limbaj. In PHP numele acestor functii vor incepe cu array si imediat caracterul underscore.

  • array_shift(); // va inlatura un element la inceputul array-ului
  • array_unshift(); // va adauga un element la inceputul array-ului
  • array_pop(); // va inlatura un element la sfarsitul array-ului
  • array_push(); // va adauga un element la sfarsitul array-ului

Ce vreau sa retineti de la aceste functii este ca vor modifica continutul array-ului cu care lucrati si daca ii atribuiti unei alte variabile o valoare ce reprezinta una dintre functiile mentionate care vor trebui sa contina diferiti parametrii, atunci acea variabila va avea ca valoare un alt array usor modificat de functie sau una dintre valorile acestuia.

    	$a = array(1,2,3);
        $b = array_shift($a);
        print_r($b); // va afisa cifra 1 reprezentand valoarea pe care variabila b o are
    

Acum este timpul sa vedem si alta functie pe acelasi exemplu.

    	$a = array(1,2,3);
        $b = array_pop($a);
        print_r($b); // va afisa cifra 3 reprezentand valoarea pe care variabila b o are
    

In PHP sunt o multime de functii cu care sa lucrezi pe un array iar site-ul www.php.net ofera o multime dintre acestea, unele dintre ele sunt pentru cazuri foarte rare.

Fundamente in setarea datelor si a timpului

Setarea datei si a timpului se face in functie de sistemul de operare pe care lucrezi si ca punct de plecare este reprezentata data de 1 Ianuarie 1970 ora 00.00, data ce reprezinta si inceputul epocii UNIX. Un sistem de operare pe 32 de biti va avea o limita in setarea datei inainte si dupa 1 Ianuarie 1970 ora 00.00 si asta pentru ca va nu va putea calcula date sub luna Decembrie din anul 1902 si nu va putea calcula date peste luna Ianuarie a anului 2037. Un sistem de operare pe 64 biti va putea calcula date cu aria de un miliard de ani.

Functii utile ce returneaza un numar de secunde

In PHP avem cateva functii predefinite cu care sa lucram in cazul in care vrem sa aflam timpul dintr-un moment reprezentat in secunde, sa cream o data in viitor sau chiar sa aflam o data dintr-un string, string reprezentat ca si parametru pentru o functie. Mai jos veti vedea aceste functii.

  • time(); // returneaza un numar reprezentand numarul de secunde trecute de la 1 Ianuarie 1970 ora 00.00
  • mktime($ora, $min, $sec, $luna, $ziua, $anul) // returneaza un numar reprezentand numarul de secunde pana la acea data de la 1 Ianuarie 1970 ora 00.00
  • checkdate(); // va returna true sau false daca acea data exista
  • strtotime($orice_data_string); // va incerca sa returneze o valoare numerica reprezentand numarul de secunde trecute de la 1 Ianuarie 1970 ora 00.00 iar parametrul pot fi unul din acestea → now, 20 August 2010, August 20 2010, +1 day, last Monday

Functii ce vor returna parti dintr-o data sau o data intreaga in format string sau numeric

In PHP avem doua functii pe care le vom folosi cel mai des iar acestea sunt asemanatoare cu cele prezentate anterior. Diferenta intre ele este strict legata de felul cum parametri functiilor vor fi declarati. Pentru a vedea intreaga documentatie pentru aceste doua functii va invit sa cautati pe site-ul oficial (www.php.net). Aceste doua functii sunt prezentate mai jos.

  • date()
  • strftime()

Importanta cuvantului static in interiorul unei functii

Pana in acest moment stim foarte bine diferenta dintre o variabila superglobala, globala si locala iar acum vreau sa va spun mai multe despre variabila locala si rolul pe care cuvantul cheie static il are in interiorul unei functii.

Acest cuvant va fi adaugat inaintea unei variabile declarate in interiorul unei functii. Nu trebuie sa uitati ca va trebui sa adaugati un spatiu intre acest cuvant si variabila in sine. Prezenta acestui cuvant va face ca valoarea acelei variabile sa fie retinuta in momentul cand functia a fost apelata.

Sa presupunem ca avem o functie care va avea declarata in interiorul ei o variabila n cu valoarea zero si binenteles cuvantul static inaintea ei. Pe urmatoarea linie de cod vom afisa valoarea variabilei in browser. La sfarsitul functiei vom incrementa variabila. Acum nu ne mai ramane decat sa apelam functia de cateva ori.

	    function a(){
        	static $n = 0;
            echo $n . '<br />'; $n++;
        }
        a();
        a();
        // ne va afisa cifrele 0 si 1
    

Dupa cum se poate vedea valoarea variabilei a fost incrementata la fiecare apelare a functiei. Mai tarziu vom vedea si un alt rol pe care acest cuvant il va avea.

Referinta catre o alta variabila

In PHP putem sa facem ca valoarea unei variabile sa fie modificata printr-o alta variabila facand ca ambele variabile sa aiba aceeasi valoare. Modalitatea prin care vom face acest lucru se va realiza prin adaugarea dupa semnul de atribuire (un singur egal) a caracterului special ampersand →&← la variabila care va face referinta. Urmatorul pas este sa ii atribuim acestei variabile o alta valoare si in acest fel vom schimba si valoarea primei variabile.

    	$a = 1; $b =& $a; $b = 3;
        echo "a: {$a} | b: {$b}";
        // va afisa a: 3 | b: 3
    

Referinta dintr-un argument al functiei catre o alta variabila

Anterior ati vazut cum o variabila va putea schimba valoarea unei alte variabile printr-o referinta. Acum este timpul sa ducem acest exemplu la un alt nivel si vom face asta catre un argument al unei functii pe care o vom declara.

Sa presupunem ca avem o functie care va avea un singur parametru iar acesta va fi inmultit cu doi in interiorul functiei. Dupa aceasta functie vom declara o variabila globala care va contine un numar oarecare. Dupa ce am declarat aceasta variabila vom apela functia pe urmatoarea linie si ii vom da ca parametru aceasta variabila globala. Pe ultima linie vom afisa cu ajutorul functiei echo valoarea variabilei globale.

    	function a($x){
        	$x = $x * 2;
        }
        $n = 3;
        a($n);
        echo $n;
        // va afisa cifra 3 dupa cum ne asteptam
    

Acum urmeaza partea interesanta pentru ca inaintea parametrului functiei cand aceasta este declarata vom adauga semnul →&← spunandu-i serverul de PHP sa ia in considerare valoarea din variabila catre care se face referinta iar aceasta este una declarata global si care cel mai adesea isi schimba valoarea.

    	function a(&$x){
        	$x = $x * 2;
        }
        $n = 3;
        a($n);
        echo $n;
        // va afisa cifra 6
    

Acest exemplu este identic cu urmatorul iar diferenta se poate vedea cu ochiul liber.

    	function a(){
        	global $n;
            $n = $n * 2;
        }
        $n = 3;
        a();
        echo $n;
        // si aici va afisa cifra 6
    

Introducere in programarea orientata pe obiecte - OOP

PHP este un limbaj de scripting sau mai bine spus un limbaj procedural care are inclus diferite functionalitati cu lucrul pe obiecte. Prima aparitie a acestui concept a aparut in versiunea PHP 4.0 dar abia in versiunea PHP 5.0 avem suport complet pentru acest concept.

Programarea orientata pe obiecte reprezinta un mod prin care iti poti scrie mai simplu si mai usor de inteles liniile de cod. Pentru un site simplu OOP (Object Oriented Programming) adauga o complexitate inutila dar pentru un site complex va adauga o simplitate necesara.

Ce sunt obiectele ?

Obiectele sunt acele entitati care au diferite functii si proprietatii ce definesc acel obiect. Ganditi-va putin la lumea reala si in special la o masina. O masina are caroserie, scaune, geamuri dar si motor, roti, transmisie. Caroseria, scaunele si geamurile masini nu fac mai nimic special, nu fac decat sa compuna corpul masinii pe cand motorul pune in miscare transmisia iar aceasta rotile facand ca masina sa se deplaseze din punctul A in punctul B.

In lumea PHP un obiect poate lua forma unei pagini web, un formular dintr-o pagina web sau o variabila ce instantiaza o clasa (dar despre clase vom vorbi imediat). Componentele unui obiect in PHP sunt diferite variabile si functii ce sunt declarate in interiorul acesteia. Variabila declarata in interiorul unei clase mai poarta denumirea si de proprietate iar o functie declarata in interiorul unei clase mai poarta denumirea si de metoda.

Lucrul cu obiecte aduce o mai buna organizare a codului prin modularizarea acestuia, reutilizarea codului, aduce claritate si reduce complexitatea codului. Lucrul cu obiecte se dovedeste foarte util in momentul cand la un site complex lucreaza mai multi programatori.

Declararea unei clase

In PHP declararea unei clase se face cu ajutorul cuvantului cheie class. Pentru a putea folosi sau instantia clasa mai tarziu va trebui sa ii dam si un nume. Acesta va fi separat de cuvantul cheie class de un spatiu. Imediat dupa numele clasei vom adauga doua acolade (una de deschidere si alta de inchidere) ce vor contine metodele si proprietatile clasei.

		class nume_clasa{
			// bloc de cod
		}
	

La fel ca si in cazul declarari unui array si declararea unei clase este contorizata de catre serverul de PHP si in cazul claselor va retine numele clasei in interiorul functiei predefinite get_declared_classes(). Totodata daca vrem sa aflam daca o clasa a fost declarata putem sa ne folosim de o alta functie predefinita. Aceasta este class_exists() si va avea ca parametru numele clasei respective. Aceasta functie va returna true in cazul in care clasa a fost declarata si false daca clasa nu a fost declarata. Cel mai adesea veti folosi aceasta functie ca si conditie intr-o structura conditionara if.

Declararea metodelor clasei

Declararea metodelor unei clase se face prin scrierea unor functii ca si pana acum si nu trebuie sa uitati ca aceasta functie trebuie scrisa in interiorul acoladelor ce delimiteaza corpul clasei.

    	class nume_clasa{
        	function a(){
            	echo 'Salut din interiorul clasei.';
            }
        }
    

Fiecare nume a unei metode din interiorul unei clase va putea fi accesibila folosindu-ne de metoda get_class_methods() care va avea ca parametru numele clasei tinta. Totodata putem testa daca o clasa contine o metoda anume si vom face asta cu ajutorul metodei method_exists() ce va avea doi parametri. Primul va fi numele clasei iar al doilea va fi numele metodei.

Declararea proprietatilor unei clase

Declararea unei proprietati in interiorul unei clase se face aproape identic cu declararea unei variabile in afara clasei. Diferenta consta in prezenta cuvantului cheie var inaintea variabilei. In acest fel ii vom spune serverul de PHP ca aceasta este o proprietate ce apartine clasei.

    	class nume_clasa{
        	var $number = 1;
        }
    

Instantierea unei clase

Instantierea unei clase reprezinta modalitatea prin care toate proprietatile si metodele clasei vor fi atribuite unei variabile. Aceasta variabila devine in acest fel un obiect sau mai tehnic spus o variabila obiect.

Modalitatea prin care vom instantia o clasa se va face cu ajutorul cuvantului cheie new. Acesta va fi adaugat dupa semnul de atribuire a unei valori variabilei cu pricina si urmat de numele clasei si apoi paranteze rotunde sau nu.

$object = new nume_clasa;

Apelarea unei metode din interiorul variabilei obiect

Apelarea unei metode din interiorul variabilei obiect se face extrem de simplu. Pe o linie de cod vom scrie din nou variabila obiect si imediat caracterul minus si apoi caracterul mai mare decat si dupa aceste doua caractere numele metodei urmata de doua paranteze rotunde reprezentand apelarea metodei.

$object->a();

Rolul cuvantului cheie this

Am vazut cum putem instantia o clasa si sa ii atribuim metodele si / sau proprietatile acesteia unei variabile obiect. Ce facem daca vrem sa refolosim codul unei metode in interiorul altei metode din aceeasi clasa. Cuvantul cheie this ne va ajuta sa simulam instantierea unei clase in interiorul clasei si sa folosim ceea ce o alta metoda face. Acest cuvant va trebui sa aiba inaintea lui semnul dolar pentru ca serverul de PHP sa inteleaga ca este vorba de instantierea clasei.

    	class nume_clasa{
        	function a($x){
            	echo $x * 2;
            }
            function b($y){
            	$this->a($y);
            }
        };
        $object = new nume_clasa;
        $object->b(25);
    

Este vital sa retineti ca folosirea cuvantului cheie this va putea fi folosit doar in momentul cand clasa este instantiata intr-o variabila obiect.

Apelarea unei proprietati din interiorul variabilei obiect

Apelarea unei proprietati din interiorul unei variabile obiect se va realiza aproape identic cu apelarea unei metode. Diferenta consta in absenta obligatorie a parantezelor rotunde. In caz contrar serverul de PHP va cauta o metoda si nu o proprietate in special daca acestea au si acelasi nume.

$object->number;

Programarea orientata pe obiecte in practica

Mostenirea

In toate limbajele de programare cu care am lucrat se foloseste acest concept. Mostenirea ne permite noua programatorilor sa extindem o clasa cu ajutorul altei clase. Cea de a doua clasa va mosteni toate proprietatile si metodele pe care prima clasa le contine. Modalitatea prin care acest lucru este posibil in PHP este prin folosirea cuvantului cheie extends. Acest cuvant este folosit in momentul cand declaram cea de a doua clasa, exact ca in urmatorul exemplu.

    	class nume_clasa{};
        class alt_nume extends nume_clasa{}
    

Aceasta este explicatia cea mai simpla prin care o clasa mosteneste sau extinde functionalitatea unei clase. Partea frumoasa in lucrul cu clase care mostenesc alte clase este ca odata declarate proprietatile si metodele intr-o clasa, acestea pot fi partial sau total modificate cu alte valori. Mai pe scurt putem sa folosim intr-o clasa o proprietate cu o anumita valoare iar in clasa care extinde putem sa ii schimbam valoarea acelei proprietati. Acelasi lucru si in cazul metodelor. In prima clasa va putea returna o valoare iar in cea de a doua clasa va returna o alta valoare. Toate acestea in functie de ceea ce ne dorim sa facem sau de un comportament al unui utilizator pe care noi va trebui sa il anticipam.

Rolul cuvintelor cheie public, private si protected

Metodele si proprietatile unei clase pot fi accesate de oriunde sau doar din interiorul clasei respective sau din interiorul clasei respective si clasele care mostenesc clasa respectiva. Cu ajutorul cuvintelor cheie public, private si protected vom putea realiza aceste lucruri foarte usor.

  • public // de oriunde
  • private // din interiorul clasei respective
  • protected // din interiorul clasei respective si din clasele ce mostenesc clasa respectiva

Nu este cazul sa va ganditi ca un utilizator va putea accesa aceste clase. Nici vorba de asa ceva. Amintiti-va ca PHP este un limbaj ce ruleaza pe partea de server. Aceste cuvinte cheie vor fi pentru noi programatorii care vom lucra cu aceste metode si proprietati ale claselor.

Scopul este unul cat se poate de simplu. Metodele si proprietatile ce vor fi accesate doar in interiorul clasei respective si / sau din interiorul clasei care mosteneste clasa respectiva vor face ceva in interiorul clasei respective. Practic vor fi un suport real pentru metodele si proprietatile care vor putea fi accesibile din afara clasei.

Metodele si proprietatile declarate in interiorul claselor au ca setare de baza sa fie accesibile de oriunde din codul nostru si de cele mai multe ori putem omite cuvantul cheie public dar pentru o buna practica este bine sa il adaugam.

Modalitatea prin care vom putea face ca o metoda sa fie publica, privata sau protejata este prin adaugarea cuvantului cheie cu pricina inaintea cuvantului function.

    	class nume_clasa{
        	private function a(){}
            protected function b(){}
            public function c(){}
        }
    

Acelasi procedeu si in cazul proprietatilor cu mentiunea ca va trebui sa omitem scrierea cuvantului cheie var.

    	class nume_clasa{
        	private $num1 = 10;
            protected $num2 = 20;
            public $num3 = 30;
        }
    

Importanta cuvantului static in interiorul unei clase

Pe langa cele trei cuvinte cheie pe care le-am cunoscut anterior, mai putem folosi si cuvantul cheie static si in acest caz va avea un cu totul alt rol.

Acest cuvant cheie va putea fi folosit singur dar si impreuna cu celelante cuvinte cheie. Rolul acestui cuvant este foarte asemanator cu rolul pe care il are in interiorul unei functii dar in cazul unei clase ne va permite sa simulam instantierea unei clase intr-un alt mod chiar daca acest lucru nu se intampla. Practic vom apela o proprietate sau o metoda din interiorul unei clase in mod static si din moment ce apelarea este facuta in mod static, nu vom putea folosi cuvantul cheie this. Acest mod va necesita si o declarare diferita a felului cum vom accesa o proprietate sau o metoda din interiorul unei clase. Sintaxa este una foarte simpla si va necesita scrierea numelui clasei respective si apoi de doua ori doua puncte → :: ← si la sfarsit numele metodei plus paranteze rotunde sau proprietatea (semnul dolar plus numele proprietatii) pe care vrem sa o accesam.

    	nume_clasa::$a;
        nume_clasa::b();
    

Aceste doua puncte → :: ← scrise de doua ori mai poarta denumirea si de scope resolution operator si va las pe voi sa il traduceti in limba romana.

Un pont pe care vreau sa il retineti este acela ca daca veti declara o proprietate care are sau nu o valoare in clasa a si apoi vom declara alte doua clase (b si c) care vor extinde clasa a si ulterior vom apela static din fiecare clasa aceasta proprietate cu scopul de a-i schimba valoarea, clasa care va extinde ultima (in acest caz clasa c) clasa a va avea intaietate in setarea valorii proprietatii din clasa a.

    	class a{ static $x = 1; }
        class b extends a{}
        class c extends a{}
        b::$x = 100;
        c::$x = 360;
        echo a::$x; // va afisa 360
    

Importanta cuvantului self in interiorul unei clase

Am vazut ceva mai sus cum putem sa instantiem o clasa intr-o variabila obiect. Tot in respectiva sectiune v-am explicat si importanta cuvantului cheie this si ca acesta va putea fi folosit in interiorul clasei doar in momentul cand clasa este instantiata intr-o variabila obiect.

In momentul cand vrem sa obtinem acelasi rezultat in interiorul unei clase fara sa o instantiem ca si in cazul folosi cuvantului cheie this, va trebui sa folosim cuvantul cheie self si fara semnul dolar si se intelege si de ce. Cuvantul cheie this si inaintea lui semnul dolar va face referire la variabila obiect ce instantia clasa respectiva iar cuvantul cheie self va face referire la numele clasei ce ii sunt apelate metodele si proprietatile.

    	class nume_clasa{
        	static $a = 10;
            public function b(){
            	return self::$a * 3;
            }
        }
        echo nume_clasa::b(); // va afisa 30
    

Importanta cuvantului parent in interiorul unei clase care mosteneste

Cred ca in titlu am spus 90% din informatia pe care trebuia sa spun in acest paragraf. Rolul acestui cuvant cheie este ca poate inlocui cuvantul cheie self in interiorul clasei care mosteneste sau extinde o alta clasa si in care sunt apelari statice ale metodelor. Este foarte important sa retineti ca acest cuvant cheie va putea fi folosit doar pentru apelarea unei metode din clasa parinte si nu pentru o proprietate.

__construct si __destruct

Nu intamplator am ales acest titlu mai putin intuitiv. Acestea reprezinta numele a doua functii cu care putem construi sau destructura metodele sau proprietatile unei clase dupa ce clasa in care este declarata este instantiata intr-o variabila obiect. Dintre aceste doua functii doar __construct este cea mai folosita si in 1% din cazuri __destruct.

Cu ajutorul functiei __construct vom putea atribui diferite valori unei proprietati iar acea valoare sa fie folosita ulterior de o alta metoda din cadrul clasei. Practic vom putea tine sub un control strict ce valori vor fi atribuite proprietatilor.

    	class nume_clasa{
        	static $a;
            function __construct(){
            	self::$a = 10;
            }
        }
        $object = new nume_clasa;
        echo nume_clasa::$a; // va afisa cifra 10
    

Acum este timpul sa atribuim o valoare in momentul cand clasa este instantiata. Vom putea face asta prin adaugarea a doua paranteze rotunde dupa numele clasei in momentul instantierii si in interior valoarea respectiva. Functia __construct va trebui sa contina un atribut (reprezentat printr-o variabila) care va retine aceasta valoare.

    	class nume_clasa{
        	static $a;
            function __construct($n){
            	self::$a = $n;
            }
        }
        $object = new nume_clasa(10);
        echo nume_clasa::$a; // va afisa cifra 10
    

Acesta este un exemplu extrem de simplu dar este important sa retineti ideea. In cazul functiei __destruct pot sa spun ca rolul acesteia este de a face opusul functiei __construct.

Clonarea unui obiect

Clonarea unui obiect in PHP este foarte asemanatoare cu declararea unei variabile. Diferenta este data de prezenta cuvantului cheie clone inaintea valori respective.

    	class nume_clasa{};
        $a = new nume_clasa;
        $b = clone $a;
    

Este atat de simplu iar utilitatea este una foarte mare mai ales daca vom dori sa nu ne repetam in cod si vrem sa reutilizam proprietatile si metodele din interiorul clasei respective. Mai mult decat atat putem sa aducem noi insine modificari clasei si apoi acestea se vor vedea in toate obiectele ce instantiaza clasa respectiva.

Compararea obiectelor

Am vazut de atatea ori pana acum cum putem sa instantiem o clasa intr-o variabila obiect si apoi sa clonam respectivul obiect. Acum este timpul sa comparam aceste obiecte. Vom realiza asta cu ajutorul operatorilor dublu egal si triplu egal.

    	class a{
        	static $a = 10;
        }
        $obj1 = new a;
        $obj2 = clone $obj1;
        echo $obj1 == $obj2 ? 'true' : 'false'; // true
        echo $obj1 === $obj2 ? 'true' : 'false'; // false
    

In momentul cand vom compara obiectele intre ele este bine sa retinem ca operatorii dublu semn egal si triplu semn egal vor returna aceste rezultate.

La dublu semn egal

  • referinta // true
  • instantierea cu potrivirea proprietatilor // true
  • instantierea cu atribute diferite // false

La triplu semn egal

  • referinta // true
  • instantierea cu potrivirea proprietatilor // false
  • instantierea cu atribute diferite // false