BluePink BluePink
XHost
Servere virtuale de la 20 eur / luna. Servere dedicate de la 100 eur / luna - servicii de administrare si monitorizare incluse. Colocare servere si echipamente de la 75 eur / luna. Pentru detalii accesati site-ul BluePink.
The future is now

Introducere in Clase PHP

Cand incepi sa lucrezi cu PHP, iti dai seama ca sunt multe locuri in care trebuie sa scrii aceasi bucata de cod. Unii dintre voi probabil s-au prins ca aceasta se poate rezolva cu o functie, asta economisind ceva timp atunci cand veti vrea sa refolositi codul. Pur si simplu declarati o functie si ii spuneti acelei functii ce informatie vreti sa foloseasca. Metoda este similara celei de mai jos:
function Functia_Mea ( $variabila ){
// Foloseste $variabila aici :
echo $variabila ;
}
Si apoi doar apelezi functia atunci cand ai nevoie de ea:
Functia_Mea ( "Salut, bine ai venit pe site" );
si functia va afisa la iesire "Salut, bine ai venit pe site "

Ei bine, dupa un timp se vor aduna prea multe functii si te vei aglomera. Folosind Clase PHP, poti incepe sa pui acele functii in niste "cutii" unde sunt stocate si folosite. Clasele PHP s-au dovedit a fi foarte valoroase, atunci cand sunt gandite si cand e scris codul bine. Va voi face o introducere in Clase si va voi da cateva exemple unde pot fi folosite. Sper ca la sfarsitul acestui tutorial te vei gandi sa implementezi niste clase proprii economisind astfel timp in viitoarele proiecte.

Dar haideti sa lasam vorbaria si sa incepem sa ne stocam functiile in interiorul Claselor.

Structura Clasei

Cand va ganditi la clase v-as incuraja sa va ganditi ca la "codul din spate". Codul va fi stocat in spatele site-ului, iar in fata va fi un bloc de cod foarte usor de inteles. Voi pune toate rutinele complicate in clasa ta, iar scriptul care foloseste acea clasa va fi mai usor de inteles pentru ca va avea un cod "curat". Acesta nu este singurul motiv pentru care poti folosi clasele, dar este motivul pentru care eu le folosesc.

OK, sa aruncam o privire pe clasa:
<?
class Clasa_mea {
     var $email ;
// folosim o functie fara variabile
function verifica_email (){
         if( ereg ( "^.+@.+\..+ $ " , $this -> email ))
             return ( true );
         else
             return ( false );
     }
// Folosim o functie cu variabile
function scoate_imag ( $cevahtml ){
$cevahtml = preg_replace ( "/(<img)(.*?)(>)/si" , "" , $cevahtml );
         return $cevahtml ;
     }
}
?>

Clasa de mai sus a fost compusa din 2 functii simple. Vom analiza functiile pentru a intelege despre ce este vorba aici.

Mai intai trebuie sa declaram o clasa:

class Clasa_mea {

Vom crea niste variabile ce pot fi folosite in oricare din functiile din interiorul clasei fara sa trebuiasca sa fie specificate pentru fiecare functie. Vom face asta prin "var $nume_var" ,priviti mai jos pentru exemplul $email pe care il vom folosi.
var $email ;

In continuare, sa analizam prima functie. Functia aceasta este valideaza mail-ul introdus de utilizator. Cauta text in ambele parti ale simbolului "@" care este structura unei adrese de email. Aceasta functie va prelua variabila $email definita in scriptul nostru care apeleaza clasa si verifica validitatea email-ului. Daca adresa de email trece de aceasta verificare si este o adresa valida, vom returna "TRUE" ,altfel vom returna "FALSE" . Voi explica asta putin mai tarziu.
// folosim o functie fara variabile
function verifica_email (){
         if( ereg ( "^.+@.+\..+ $ " , $this -> email ))
             return ( true );
         else
             return ( false );
     }

Uitandu-va la functia de mai sus, ati remarcat ca am folosit " $this->email " $this-> e un constructor special indica in interiorul clasei catre o variabila sau o alta functie. La inceput am definit var $email ,acum avem $this->email . Veti vedea cum sa atribuiti o valoare lui $this->email cand vom folosi "efectiv" scriptul ce apeleaza clasa .

Nota: puteti de asemenea folosi in interiorul unei functii dintr-o clasa, o alta functie ce se afla in aceeasi clasa. Doar introduceti $this->numele_functiei($vars); si functii din interiorul aceleiasi clase se pot folosi reciproc.

Pentru a va da un exemplu ca puteti pune aproape orice doriti in interiorul unei clase, am facut aceasta clasa "cu scop general" ce poate fi utilizata in mai multe scopuri. Mai jos veti vedea o functie pe care am introdus-o in aceasta clasa, functie care elimina tag-urile unei imagini dintr-un string (sir de caractere). Am vrut sa va arat aceasta clasa si pentru ca este o metoda diferita de a apela functia, aceasta functie va accepta o variabila ca parametru si trebuie sa aiba acea variabila definita atunci cand o apelezi. Voi explica si acest lucru mai incolo. Iata functia mai jos:
// Folosim o functie cu variabile
function scoate_imag ( $cevahtml ){
$cevahtml = preg_replace ( "/(<img)(.*?)(>)/si" , "" , $cevahtml );
         return $cevahtml ;
     }

Acum, inchidem clasa noastra si suntem gata s-o folosim!
}

Sa numim acest fisier: "clsClasa_Mea.php" si sa vedem cum il vom folosi in pagina urmatoare.

Folosirea acestei Clase in Scripturile voastre PHP

Primul lucru pe care trebuie sa-l facem este sa includem clasa. Nu este mare lucru, doar includeti-o folosind:
<?
include "Clasa_Mea.php" ;

Acum putem incepe distractia :) Avem clasa noastra inclusa in script si trebuie sa initializam un obiect pe care sa-l atribuim unei variabile. Iata cum se face:
$clasa_mea = &New Clasa_Mea ;

Am creat un obiect numit $clasa_mea si acum putem accesa elementele din interiorul clasei Clasa_Mea pe care am creat-o mai devreme. Astea fiind facute, avem variabila "$email" ce sta degeaba in Clasa_Mea, asa ca ii vom atribui o valoare:
$clasa_mea -> email = "tu@undeva.com" ;

Tineti minte ca puteti face: $clasa_mea->email = $_POST['email']; sau orice vreti cu ea.

Sa rulam functia verifica_email in interiorul clasei Clasa_Mea:
$verifica_email = $clasa_mea -> verifica_email ();
if(! $verifica_email ){
     echo "Adresa de email nu este valida!" ;
} else {
     echo "Adresa de email este valida!" ;
}

Tot ce am facut este sa atribuim o variabila functiei verifica_email() si apoi am facut niste verificari de erori pe baza acelei variabile. Tineti minte ce a spus mai devreme, daca verifica_email returneaza TRUE , adresa continuta in variabila $email pe care i-am spus s-o verifice a trecut testul, daca nu a trecut testul va returna FALSE. Privind instructiunea if de mai sus, vei vedea ca daca un "!" sau "Eroare" este detectat pe sirul de caractere din $verifica_email ,vom afisa "Adresa de email este valida!".

Haideti sa ne uitam cum folosim functia scoate_imag. Intai vom crea un string cu HTML in interior.
$html_vechi = '<strong>Am o imagine aici: <img src="/imaginea_mea.jpg" height="100" width=" 200" >' ;

Acum ca avem $html_vechi si stim ca are o imagine in interiorul HTML-ului, sa scoatem acea imagine afara si sa returnam rezultatul:
$html_nou = $clasa_mea -> scoate_imag ( $html_vechi );
echo "Aici este html-ul vechi $html_vechi <br /><br />" ;
echo "Aici este html-ul nou $html_nou <br /><br />" ;

Cand veti privi $html_vechi si $html_nou, veti vedea ca imaginea a fost eliminata cu succes.

Daca ai inteles ce s-a intamplat pana acum, felicitarile mele, tocmai ai invatat notiunile elementare ale claselor! Daca nu, te sfatuiesc sa mai citesti acest tutorial inca o data. Il vei intelege pana la urma.

Asa cum am spus mai devreme, clasele s-au dovedit a fi foarte eficiente. Ele sunt calea catre "Object Oriented Programming" sau "Programarea Orientata pe Obiecte" - OOP. Cu OOP puteti economisi foarte mult timp si puteti crea o arhiva de obiecte sau clase pe care le puteti folosi mereu.

Sesiuni in PHP

In mod normal, o variabila locala declarata intr-o pagina .php este valabila doar in acea pagina, daca nu intervenim intr-un fel pentru a o transfera si pe alte pagini unde avem nevoie de ea. Modalitatile de pastrare a informatiilor pe tot parcursul aplicatiei sunt:
- variabile globale
- sesiuni
- cookies
- transferul variabilelor locale prin forme sau in header-ul unei alte pagini

Ce este o sesiune?
O sesiune reprezinta una din caile de a pastra datele de lucru ale unei aplicatii atunci cand se face transferul de la o pagina la alta. PHP foloseste in mod nativ sesiuni, asa cum fac si limbajele ASP si ColdFusion. Lucrul cu sesiuni nu este complicat. Fiecare sesiune trebuie declarata la inceputul paginii, cu ajutorul functiei:

start_session();

Aceasta functie face ca PHP sa inregistreze un identificator unic al sesiunii (ID), iar acel identificator este trimis utilizatorului printr-un cookie. Totodata, pe server se creaza un fisier care va retine valorile variabilelor folosite in aceasta sesiune. Fisierul are numele la fel cu identificatorul ID al sesiunii. Apoi trebuie declarata variabila (sau variabilele) cu care lucram in cadrul acestei sesiuni. Pot fi create oricate variabile.

session_register('sesiunea_mea');

Variabila $sesiunea_mea poate fi o variabila simpla sau un tablou (array). Exemplu:

$sesiunea_mea = "Lucian";     // variabila simpla

sau

$sesiunea_mea["id"] = 1; // cazul unui array
$sesiunea_mea["nume_utilizator"] = "Lucian";
$sesiunea_mea["adresa"] = "Str.Florilor nr.14"; // etc.

Variabilele definite in acest mod pot fi folosite pe toate paginile unei aplicatii, definite pe un domeniu dat, atat timp cat cookie alocat acelei sesiuni este activ (nu expira). Folosirea sesiunilor este o cale mult mai usoara de lucru decat sa transferam variabilele de la pagina la pagina. In php.ini pot fi setate diferite valori pentru parametri legati de sesiune cum ar fi (dupa semnul egal am pus valorile implicite) :

session.cookie_path = "/";
session.cookie_domain = "";
session.cookie_lifetime = "0"; // valoarea 0 inseamna ca cookie pentru sesiune e valabila pana cand browserul se va inchide.
session.name = "PHPSESSID";

si altele .
Exista posibilitatea ca un utilizator sa nu accepte setarea de cookies pe computerul sau. In acest caz, pentru identificarea unei sesiuni se poate folosi identificatorul acesteia. Putem adauga acest identificator in stringul care apleaza o pagina:

<a href = "pagina_mea.php?<?=SID?">Click catre pagina mea</a>

<?= este un mod mai scurt de a scrie comanda echo. <?= se poate folosi cu orice variabila, nu doar cu sesiuni. Un identificator PHPSESSID arata ca o insirurire aleatoare de caractere alfanumerice:

PHPSESSID = 02993ab99sac988da9753330af72201

Daca PHP este compilat cu optiunea enable-trans-id, atunci identificatorul sesiunii este adaugat automat la fiecare pagina. Iata un exemplu de definire al unei sesiuni:

<?
session_start();
session_register("variabila_mea");
$variabila_mea = "Aceasta este cursul online de PHP";
?>

$variabila_mea va putea fi folosita apoi pe toate paginile aplicatiei respective.

Observatie importanta:
Variabilele definite in sesiuni pot fi folosite intr-o pagina doar dupa ce a fost executata comada session_start(); Aceasta comanda ii spune PHP-ului sa verifice daca exista o sesiune si atunci sa foloseasca variabilele acelei sesiuni ca variabile globale. Functiile session_start(), ca si setcookie()  trebuie folosite intotdeauna chiar la inceputul fisierului . Daca se trimite altceva catre browser inainte de folosirea lor atunci vor exista erori la folosirea sesiunii sau a cookie-urilor.

Utilizarea referintelor in PHP

In mod prestabilit, argumentele transferate unei functii PHP sunt transmise prin valoare, ceea ce inseamna ca valorile argumentelor sunt copiate si functiile utilizeaza copii ale valorilor argumentelor lor, nu argumentele in sine. Ca o consecinta, o functie PHP nu poate modifica valorile argumentelor sale. Acest fapt este in general util, deoarece astfel functiile devin mai usor de inteles daca se limiteaza la a returna o valoare, fara a modifica valori.
Totusi, puteti stabili ca o functie sa aiba posibilitatea de a modifica valoarea unui argument, specificand ca argumentul sa fie transferat prin referinta. Cand un argument este transferat prin referinta, valoarea sa nu este copiata; functia lucreaza cu valoarea argumentului si are libertatea de a modifica acea valoare. Pentru a specifica faptul ca un argument urmeaza a fi transferat prin referinta, argumentul va fi prefixat cu un caracter ampersand (&) (mai cunoscut ca AND). Puteti atasa acest prefix la argument in antetul functiei sau in apelul la functie. Iata un exemplu care prezinta apelul prin valoare si apelul prin referinta:
function prin_valoare($x)
{
$x = 1;
}
function prin_referinta(&$x)
{
$x = 1;
}
$y = 0;
prin_valoare($y);
echo "<br>\$y=$y";
$y = 0;
prin_valoare(&$y);
echo "<br>\$y=$y";
$y=0;
prin referinta($y);
echo "<br>\$y=$y;
Daca rulati acest script, veti obtine urmatoarele date de iesire:
$y=0
$y=1
$y=1
Retineti ca scriptul contine doua functii, si anume prin_valoare() si prin_referinta(). Fiecare functie preia un singur argument, denumit $x. Antetul functiei prin_referinta() specifica faptul ca argumentul sau este transferat prin referinta; argumentul functiei prin_valoare() este transferat prin valoare, in conformitate cu practica prestabilita folosita in limbajul PHP. Fiecare functie incearca sa modifice valoarea argumentului sau. Primul paragraf al programului invoca functia prin_valoare(), transferand argumentul prin valoare. In consecinta, functia lucreaza cu o copie a argumentului sau, iar valoarea variabilei $y nu se modifica. Cel de-al doilea paragraf al programului invoca de asemenea functia prin_valoare(); cu toate acestea, foloseste un caracter ampersand pentru a determina transferul prin referinta al valorii variabilei $y. In consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 in 1. Cel de-al treilea paragraf al programului invoca functia prin_referinta(). Antetul functiei respective foloseste un caracter ampersand pentru a specifica faptul ca valoarea argumentului sau este transferata prin referinta. In consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 in 1.
Prin utilizarea referintelor se evita suprasarcina de copiere a valorilor argumentelor si implicit se obtine o viteza mai mare de executie a programului. Cu toate acestea, programele devin astfel mai dificil de inteles, iar referintele sau apelurile prin referinta pot cauza erori de program. Cel mai indicat este sa evitati referintele, acolo unde este posibil, si sa definiti functii care returneaza valori, si nu functii care modifica valorile propriilor argumente.
Tutoriale PHP Part V