Professional Documents
Culture Documents
<?php
class persoana {
var $nume;
}
?>
Obs:Variabilele/datele din interiorul unei clase se numesc proprietati deci in exemplul de mai sus
proprietatea clasei persoana este var $nume
Pas 5:
Functia constructor (setter)-preia valorile trimise din programul
principal.
Functia de afisare(getter)-livreaza valorile stocate in variabile
Transitional//EN"
Obs:
In cele ce urmeaza trebuie sa se retina
urmatoarele:
Functii=metode
Variabile=proprietati
Pt ca aceasta este terminologia programarii
OOP.
Exista multe constructii OOP, din ideea ca muli programatori pot lucra la un proiect ...
Sa luam un exemplu:
//extends este cheia pentru a permite mostenirea.
class angajati extends persoane {
function __construct($angajati_name) {
}
}
<?php
class persoane{
// adaugarea de proprietati in mod explicit unei clase este optionala dar indicata
var $nume;
function __construct($persoane_nume) {
$this->nume = $persoane_nume;
}
public function get_nume() {
return $this->nume;
}
//protected methods and properties restrictioneaza accesul la aceste elemente.
protected function set_nume($new_nume) {
if (nume != "Jimmy Two Guns") {
$this->nume = strtoupper($new_nume);
} }}
// 'extends' este cuvantul cheia care permite mostenirea ( inheritance)
class angajati extends persoane {
protected function set_nume($new_nume) {
if ($new_nume == "Stefan Sucks") {
$this->nume = $new_nume;
}}
function __construct($angajati_nume) {
$this->set_nume($angajati_nume);
} } ?>
Obs: set_nume () este diferit n clasa "angajati" fata de clasa printe: "persoan".
persoana::set_nume($new_nume);
Codul de mai sus are menirea de a accesa metoda set_nume () din clasa printe "persoan.
<?php
class persoana {
var $name;
function __construct($persoane_nume) {
$this->nume = $persoane_nume;
}
public function get_nume() {
return $this->nume;
}
//protected methods and properties restrict access to those elements.
protected function set_nume($new_nume) {
if (nume != "Jimmy Two Guns") {
$this->nume = strtoupper($new_nume);
}}}
// 'extends' is the keyword that enables inheritance
class angajati extends persoana {
protected function set_nume($new_nume) {
if ($new_nume == "Stefan Sucks") {
$this->name = $new_nume;
}
else if($new_nume == "Johnny Fingers") {
persoana::set_nume($new_nume);
}}
function __construct($angajati_nume) {
$this->set_nume($angajati_nume);
} }?>
Exemple:
O clasa este tiparul, ea descrie cum ar trebui sa fie obiectele, ce sa faca si ce sa contina acestea.
Deci o clasa ar putea arata asa:
elefant.php
class Elephpant {
public $colour;
public function dance() {
echo "elephpant dances!\n";
}
Un obiect, pe de alt parte, este o instaniere real a clasei - sau un lucru real, cu valori i
comportamente. In exemplul de mai jos, $ele este obiect:
include('elephpant.php');
$ele = new Elephpant();
Se poate inspecta $ele folosind comanda print_r cu scopul de a verifica dac acesta este, de
fapt, un obiect ale clasei Elephpant,astfel:
include('elephpant.php');
$ele = new Elephpant();
print_r($ele);
Mostenirea
Este declarata deja clasa Elephpant si se doreste sa se declare o clasa
Penguin.
Ambele mostenesc
clasa Animal care este clasa parinte, si arata astfel:
class Animal{
public $type = "animal";
public function dance()
{
echo $this->type . " dances!\n"; }}
Clasa Animal are o propritate "type",
i o metod dance().
Se utilizeaz proprietatea de type n metoda dance()pentru a crea ieirea,
se foloseste $this pentru a se face referire la obiectul curent.
n PHP, $this este un cuvnt cheie special care se refer la obiectul curent din
interiorul propriei sale clase.
Acum se poate crea o clasa Penguin care mosteneste de la clasa generala
Animal, prin utilizarea cuvintului cheie extends pentru a desemna ca se extinde
clasa parinte x:
Mostenire simpla
Mostenire simpla
C
Mostenire simpla-nu
este valabila in PHP
Modificatori de acces
Proprietatea type este setata in clasa, dar poate sa fie setata la alta valoare din
pagina principal astfel:
$tux->type=giraffe inainte de a intreba daca danseaza.
Cateodata acesta este comportamentul dorit cateodata nu este dorit acest
comportament. Modificatorii de acces au rolul de a permite sau nu modificarea
proprietatile in afara clasei. In exempele anterioare s-a folosit modificatorul de acces
public. Pentru a nu se putea modifica valoare proprietatii type din afara clasei at
aceasta proprietate va devein privat in clasa Penguin, astfel:
class Penguin extends Animal {
Codul urmator este un exemplu de a seta din afara clasei o proprietate type private, rezultatul
obtinut este: include('animal.php');
include('private_penguin.php');
$tux = new Penguin();
// change the type
$tux->type = "linux penguin";
// make tux dance
$tux->dance();?>
Eroarea aparuta: Fatal error: Access level to Penguin::$type must be public (as in class Animal)
in C:\xampp\htdocs\oop\private_penguin.php on line 2
Aceasta eroare apare deoarece se doreste sa se setez din index_private_penguin.php care este
programul main, proprietatea privata $type declarata in clasa Penguin, ceea ce nu se poate.
Daca este privata o proprietate ea nu se schimba in main.
Instantierea unei clase se face prin operatorul "new", avand urmatoarea forma
generala:
$nume_variabila = new nume_clasa();
Variabila "$nume_variabila" contine o referinta la clasa "nume_clasa". In exemplul
anterior:
$cont=new ContBancar();
In continuare se apeleaza metodele clasei respective, asta se face prin operatorul de
referinta "->" ca mai jos:
$nume_variabila->Metoda1();
Variabila apeleaza metoda cu numele "Medoda1()", care apartine clasei "nume_clasa".
In
exemplul
anterior:
$cont->creaza_depozit(100);
si
$cont->obtine_balanta()
Stergerea instantelor unei clase se face simplu prin apelarea functiei:
unset($nume_variabila);
Dupa aceasta stergere, orice apel de genul "$nume_variabila->Metoda1();" va fi
semnalat ca eroare.
Obs: metoda obtine_balanta() obtine accesul la valoarea proprietatii obiectului, dar nu
modifica valoarea acestuia. O astfel de metoda se numeste metoda de obtinere sau
accesor. Metoda precum creaza_depozit() se numeste metoda de configurare.
Utilizarea mostenirii
<?php
include contBancar2.php;
class ContCurent extends ContBancar2
{
var $cec_nr;
function ContCurent($id,$nume,$suma,$cecnr)
{
$this->cont_id=$id;
$this->nume_posesor=$nume;
$this->balanta=$suma;
$this->$cec_nr=$cecnr;
}
function incasare_cec($cecnr,$suma)
{
$this->balanta= $this->balanta -$suma;
}
function obtine_balanta()
{
return $this->balanta;
}}
In exemplu se foloseste instructiunea include pt a se optine acces la definitia clasei
parinte, dar clasa parinte si cea copil se pot defini si in acelasi fisier.
Cuvantul cheie extends stabileste identitatea clasei ContCurent drept clasa copil.
- se folosese in cadrul instructiunii class
Clasa copil defineste o proprietate $cec_nr care contine numarul filei initiale a
urmatorului carnet de cecuri care va fi emis
-defineste un constructor si 2 metode : incasare_cec() si obtine_balanta()
-mai include proprietatile si metodele definite in clasa parinte:
$cont_id,$nume_posesor si $balanta precum si metoda:creaza_depozit();
-constructorul atribuie valori proprietatiilor mostenite dar si proprietatiilor
definite in clasa copil.
Instructiuni care creaza un obiect ContCurent si care invoca metode asupra acestuia:
$cont= new ContCurent(12,Pop Vasalie,111,11111);
$cont->incasare_cec(121,250);
$cont->creaza_depozit(350);
echo Balanta curenta:.$cont->obtine_balanta();
Obs: metoda creaza_depozit este definita in clasa parinte dar se invoca ca si cand s-a
creat in clasa copil. Deci, metodele mostenite nu necesita un tratament de natura
speciala.
Redefinirea metodelor
In unele cazuri o clasa extinsa include o metoda care nu este adecvata pt o clasa care
in alte conditii poate fi derivata pt a obtine o clasa copil. In loc de a defini noua clasa fara
referire la clasa existenta se poate redefini metoda inadecvata.
<?php
class ContBancar3
{ var $cont_id;
var $nume_posesor;
Var $balanta=1;
function ContBancar3($id,$nume,$suma)
{ $this->cont_id=$id;
$this->nume_posesor=$nume;
$this->balanta=$suma; }
function inchide_cont()
{ $suma=$this->balanta;
$this->balanta=1;
return $suma;}}?>
In exemplu se invoca metoda definita de clasa copil nu cea creata in clasa parinte. In
acest context metoda definita de clasa parinte a fost anulata(redefinita) de catre
metoda definita de clasa copil.
<?php
class ContEconomii extends ContBancar3
{
function inchide_cont($zile,$rata)
{
$suma=$this->balanta*$rata*($zile/360);
$suma=$suma+$this->balanta;
$this->balanta=1;
return $suma;
}
}
$cont=new ContEconomii(103,"Filipoiu Zanfir",2000);
echo "Filipoiu Zanfir primeste ".$cont->inchide_cont(20,0.08);
?>
Invocarea corecta:
<?php
Prin specificarea numelui clasei, urmat semnul :: se poate indica programului PHP sa
invoce metoda definita in clasa parinte, nu cea definita in clasa copil.
Tablouri de obiecte
-este un tablou ce face referire la obiecte.
-se creaza o clasa parinte si 2 copil. Clasele copil vor face referire la constructorul clasei
parinte, reutilizand in mod eficient caracteristica furnizata de clasa parinte.
-la instantierea claselor copil se stocheaza referintele intr-un tablou->tablou de obiecte.
Tabloul va fi parcurs si se va instanta functia afisare a clasei parinte pt a vizualiza datele
tabloului.
Calcule_drept.php :
<?php
class Calcule
{
var $lungime;
var $latime;
function Calcule($lungime,$latime)
{
$this->lungime = $lungime;
$this->latime = $latime;
}
function area()
{
return $this->lungime*$this->latime;
}
function perimeter()
{
return ($this->lungime + $this->latime)*2;
}
}?>
$this este un dreptunghi(adica un obiect) cu metodele
perimetru si aria si proprietatiile $lungime si $latime
Constructori
-se apeleaza la crearea unui obiect;
-realizeaza in general operatii utile de initializare, de ex: stabilirea atributelor de pornire sau
crearea de alte obiecte necesare obiectului
-pana in php5 aveau acelasi nume cu numele clasei;
-in php5 are un nume special __construct()
-pt a se realiza compatibilizarea PHP va cauta o functie care sa detina acelasi nume cu numele
clasei in caz ca nu gaseste _construct()
-se poate apela manual;
-rolul sau principal este sa se apeleze automat cand se creaza un obiect.
Ex: de declarare a unei clase cu un costructor:
class expclasa
{
function __construct($parametru)
{
echo Constructorul apelat cu parametrul $parametru;
}
}
Obs:PHP 5 accepta supraincarcarea functiilor adica pot exista mai multe functii cu acelasi nume
dar cu numar diferit de tipuri sau parametrii se revine
Destructori
-este opusul unui constructor si a fost introdus in PHP5
-poate contine anumite functionalitati care sa se execute inainte de distrugerea clasei.
Distrugerea clasei se va face atunci cand toate referintele la ea au fost eliminate sau au iesit din
domeniul de valabilitate.
-trebuie sa detina numele __destruct().
-nu accepta parametrii
Instantierea clasei
-dupa ce s-a creat o clasa se creaza un obiect adica o anumita individualitate care este un
membru al acelei clase.
Procedeu ce poarta denumirea de instantiere a unei clase sau crearea unei instante .
-un obiect se creaza folosind cuvantul cheie new urmat de numele clasei care se va instanta de
obiect urmat sau nu de parametrii.
Exemplu de creare a unei clase
Clasele care se pot folosi in dezvoltarea WEB pot contine pagini, componente de
interfete utilizator, liste de cumparaturi, categorii de produse sau clienti, tratare de
erori.
Obiectele sunt instante ale acestor clase.
Un exemplu de utilizare a claselor si a avantajelor mostenirii:
Se creaza o clasa Pagina avand ca rol principal limitarea de cod HTML necesar crearii
unei pagini noi=> Pagina este creata de o clasa ceea ce ar trebui sa restranga
libertatea de creare a ei si permite adaugarea de functionalitati noi in timp scurt.
Avantaje:
1. Modificarea elementelor paginii unui site se face intr-un sg loc(se adauga un buton)
2. Identificarea paginii care este vizualizata;
3. Continut prestabilit dar care se poate modifica ca ex: titlul, metaetichetele
4. Inlocuirea elementelor standard (butoanele standard cu alte butoane)
Elemetele care au o probabilitate mare de modificare se declara ca atribute ale clasei:
de exemplu: continutul, titlul, cuvintele cheie si butoanele unei pagini.
Operatiile: afisarea si formatarea continutului in pagina.
Se creaza un fisier numit clasapagina.inc care se va introduce in toate fisierele php care
alcatuiesc site-ul.
Functia isURLCurrentPage($url) determina daca URL unui buton indica pagina curenta cu
ajutorul functie strpos() cu care se poate testa daca URL-ul dat este continut in una din
variabilele de configurare ale serverului. Daca sirul din $url se afla in variabila superglobala
$_SERVER*PHP_SELF+ instructiunea strpos($_SERVER*PHP_SELF+ ,$url) va returna un
numar in caz contrar va returna false.