tekoms-doo

Brzina - pouzdanost - kvalitet

Osnove objektno orijentisanog programiranja u PHP-u sa primerima

English

osnove-objektno-orijentisanog-programiranja

 

Nivo: Osnovni

Ključne reči: objekti, klase, funkcija construct, atributi, nasleđivanje klasa (extends)

Veoma često pojam koji se danas javlja kod programiranja jeste Objektno orijentisano programiranje (OOP) gde za razliku od proceduralnog programiranja struktura web strane je drugačija ali je izlazni rezultat isti – web strana ili web aplikacija koja se renderuje u Browseru. Objektno orijentisano programiranje je način programiranja koji omogućava grupisanje varijable i funkcije u klase.

Ovaj kratak tutorijal opisaće osnove OOP-a i to na primeru jednog jednostavnog web sajta od par strana i Kalkulatora gde je cilj da se vidi jednostavnost strukture web strane koja se prikazuje preko objekata.

OBJEKAT JE „KUĆA“ A KLASA JE „PROJEKAT KUĆE“

 

Jednostavnije rečeno, KLASE možemo posmatrati kao projekat kuće (osnova sprata sa prostorijama) dok je OBJEKAT kuća izgrađena na osnovu tog projekta, odnosno klase. Sa druge strane, na osnovu tog istog PROJEKTA KUĆE (odnosno klase) može se izgraditi neka druga KUĆA (odnosno objekat 2) itd.
Takođe, možemo postojeći PROJEKAT KUĆE (klasu) modifikovati tako što ćemo dodati još neke „prostorije“ i na osnovu toga izgraditi neku treću KUĆU (odnosno objekat 3) itd. Jednostavan primer web sajta preko OBJEKTA upravo to i pokazuje – u jednoj KLASI ćemo „PROJEKTOVATI“ kompletan sajt (varijable, template web strane) i na osnovu toga „gradimoOBJEKAT.

Preporučuje da se OOP uči kada se dobro savlada proceduralno programiranje u PHP–u gde se jednostavno piše sintaksa koda, red po red, koje potom server procesuira. Naravno, pre toga se smatra da imate dovoljno znanja iz osnove web programiranja odnosno rada u HTML-u i CSS-u. Naredne vežbe će podrazumevati da imate prethodno navedena znanja i samim tim odmah ćemo se bazirati na prikaz osnove rada u OOP-u.

osnove-objektno-orijentisanog-programiranja

 

 

VEŽBA 1 - JEDNOSTAVAN WEB SAJT PREKO KLASA I OBJEKATA

Objekat – predstavlja entitet koji jer jasno definisan – poput objekata u prirodi – sto, stolica, kuća, auto itd. Pa tako i u programiranju taj objekat biće jednostavno – web strana (to je ona KUĆA sa početka teksta).

Klasa - sa druge stane, klasa predstavlja mesto gde daje opis objekata po pitanju određenih funkcija (to je PROJEKAT KUĆE sa početka teksta). Drugim rečima, u klasi se definišu određene operacije (funkcije, varijable itd) koje se zatim pozivaju preko objekata i kao rezultat se daje ispis podataka.

Kako to konkretno funkcioniše ...

Kako to konkretno funkcioniše daćemo na primeru jednostavnog web sajta, podrazumevajući, da imate neko predznanje iz web programiranja kao što je rad u HTML-u, CSS i osnove rada u PHP-u. Svaki sajt ima neke delove u svojoj konstrukciji koji se ponavljaju na svakoj strani na primer – osnovna konstrukcija div tag-ova, header (gde je logo), footer. Ti delovi mogu se jednostavno definisati kao šablon (template) u kome će se menjati sadržaj – odnosno tekstovi.

Za početak kreiraćemo stranicu koju ćemo snimiti pod nazivom "html-template.php" . Ta strana predstavlja HTML kod gde je konstrukcija web strane sa svim potrebnim stilovima čiji se linkovi nalaze u Head sekciji i sve se nalazi unutar varijable $strana . CSS fajl koji stilizuje konstrukciju web strane nalazi se u folderu css. Konstrukciju web strane može stilizovati po želji. Ovde je jedna jednostavna web konstrukcija sastavljena od DIV tag-ova i nije cilj da se previše baziramo na HTML i CSS tako da je svedeno na minimum. Akcenat je na implemenataciji klasa i formiranje objekata.

Kao što se vidi komplet statična konstrukcija web stane (template) se "skladišti" u jednoj varijabli $strana=' ';

Međutim, u delovima Template-a nalaze se određene varijable koje skladište podatke – odnosno deo stranice koji nije template i koji se menjaju prema vrsti stranice. U ovom primeri to su tri varijable:
.$title.
.$navigacija.
.$tekstovi.
.$footer.

Naravno, sadržaj tih varijabli ćemo u nastavku definisati. Snimite fajl, ubacite u folder "Objekto-orijentisano-programiranje-primer" a potom taj folder prebacite u WAMP da bi kasnije mogli preko Local Hosta mogli da testiramo render web strane preko Browser-a.


             
<?php 
                
$strana='

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<link href="images/aplikacija_icon.png" rel="icon"/>
<title> '.$title.' </title>
<meta name="keywords" content="Osnove objektnog programiranja u PHP-u, klase, objekti, na primeru web sajta" />
<meta name="description" content="Osnove objektnog programiranja u PHP-u na primeru iz prakse." />
<link href="css/stilovi.css" rel="stylesheet" type="text/css" />
</head>

<body>

<h1 style="text-align:center;"> Primer 1 - jednostavan web sajt preko klasa i objekata </h1>

<div class="glavni_div_tag">

  <div class="header">
    <img src="images/tekoms-logo.png" width="380" align="left" alt="neki-tekst">
    <p style="text-align:right; color:#333; margin-top:0;"> <strong> Online kursevi web programiranja </strong> <br> www.tekoms.co.rs </p>
  </div>
   
  <div class="navigacija">
    '.$navigacija.'
  </div>
  
  <div class="sadrzaj"> 
    '.$tekstovi.'
  </div>
  
  <div class="clear" style="clear:both"></div>
  
  <div class="footer">
    '.$footer.'
  </div>
  
</div>

</body>
</html>

';

?>


Definisaćemo tri stranice (tri fajla) gde će svaka imati varijable koje imaju određeni sadržaj odnosno kreirati stranice ...

navigacija.php

Komplet HTML kod koji daje strukturu navigacije je u stvari uskladišteno sve unutar varijable $navigacija . Linkovi u navigaciji generišu link koji predstavlja uslov "ako je Web strana = nečemu".



<?php
$navigacija='
<div class="menu menu-vertical">
	<a href="index.php">Home</a>
	<a href="index.php?web_strana=O_nama">O nama</a>
	<a href="index.php?web_strana=Usluge">Usluge</a>
	<a href="index.php?web_strana=Proizvodi_i_oprema">Proizvodi i oprema</a>
	<a href="index.php?web_strana=Kontakt">Kontakt</a>
</div>
';
?>                
                

tekstovi.php

Sadržaj svake strane (tekst, slike) je uskladišten u varijabli koja nosi naziv same strane $Usluge, $Proizvodi itd.


<?php

$O_nama='
<h1 style="margin-top:0;"> O NAMA </h1>
<p> <img src="images/image_1.png" width="125" align="right" class="slika" /> Ovde ide tekst o firmi.</p>
';

$Usluge='
<h1 style="margin-top:0;"> USLUGE </h1>
<p> <img src="images/image_2.png" align="right" width="125" class="slika" /> Ovde ide neki tekst oko USLUGA </p>
';

$Proizvodi_i_oprema='
<h1 style="margin-top:0;"> PROIZVODI </h1>
<p>Ovde ide neki tekst za stranicu PROIZVODI</p>
';

$Kontakt='
<h1 style="margin-top:0;"> KONTAKT </h1>
<p>Ovde ide neki tekst za stranicu KONTAKT</p>
';

?>


footer.php

Komplet HTML kod koji daje sadržaj footer-a uskladišten je unutar varijable $footer



<?php
$footer='
<p style="text-align: center;"> OBUKE | TEKOMS </p>
';
?


Definisaćemo fajl naziva klase.php gde upisujemo klase kao ključni elemente OOP-a. Klasa se nalazi unutar PHP bloka, ima svoj naziv (web_sajt) i počinje i završava se vitičastom zagradom . Unutar vitičastih zagrada ide funkcija naziva varijable_web_sajta gde se nalazi NIZ VARIJABLI koje smo prethodno definisali u KORAKU 2. Takođe, tu se nalazi sintaksa koja uključuje (include) Template stranicu i naravno preko komande Echo daje se ispis varijable $strana koja je u stvari komplet HTML konstrukcija web strane



<?php
class web_sajt {
    function varijable_web_sajta ($title, $navigacija, $tekstovi, $footer)
	{ 
    include ('html-template.php');
    echo $strana;
    }
}
?>

Na kraju ostaje da sve svi elementi generišu u jednu stanicu (index.php) u kojoj će se sve skripte obraditi i kao izlaz dati render web strane u Browseru. Komplet strana je unutar PHP bloka. Kod počinje uključivanjem (include) ranije navedenih fajlova – klasa, navigacija. U nastavku koda ide definisanje da je ključ filtriranja stranica $ title_clear" odnosno tu se skladišti sve ono što se dobije (GET) iza termina web_strana . U nastavku, IF uslov koji poredi da li je link generisan odnosno da se iza reči web_strana nešto nalazi od uslova. Ako se ne nalazi odnosno if ($title_clear ==NULL) ispisuje se tekst u nastavku odnosno tekst koji ide na početnu stranu. Ukoliko nije, ispisuje se tekst ali ne bilo koji, nego onaj tekst koji se nalazi u varijabli koja je jednaka TITLE . Kraj koda predstavlja kreiranje OBJEKTA koji poziva KLASU odnosno poziva se funkcija varijable_web_sajta .



<?php
error_reporting(0);
include ('klase.php');       
include ('navigacija.php'); 
include ('tekstovi.php');       
include ('footer.php'); 
  
$title_clear=$_GET['web_strana'];     
if ($title_clear==NULL)         
{  
   $title_clear='Objektno orijentisano programiranje';   // OVO JE TITLE - NASLOV U HTML-U
   $tekstovi=' 
   
   <h1> Objektno orijentisano programiranje na primeru web sajta </h1>
   <hr> 
   <p> Ono što ćete danas retko naći jeste objašnjenje načina kako funkcioniše <strong> objektno-orijentisano programiranje (OOP)</strong> ili bar osnove <strong> na konkrentom primeru </strong>. Ovde je pokazana primena pojmova <strong> klasa i objekata </strong> kao osnova  OOP-a i njihova implementacija na primeru jednostavnog web sajta. </p>
   <p> Čim se shvati suština na jednostavnom primeru veoma lako se stečeno znanje može implementirati na kompleksnije aplikacije. </p>
   
   ';               
}
else             
{
$tekstovi=$$title_clear;
$title = str_replace("_"," ",$title_clear);  
}

$objekat = new web_sajt();   
$objekat -> varijable_web_sajta($title, $navigacija, $tekstovi, $footer); 

?>


Na kraju sajt izgleda ovako. Dizajn je veoma jednostavan i cilj nije bio da se previše vežba bazira na dizajniranju nego da se na veoma jednostavnom primeru prikaže kako sajt može da se programira i preko objekata i klasa. Ovakav način web programiranja možete veoma lako implementirani u Vaša buduća rešenja.

 

VEŽBA 2 - FUNKCIJA CONSTRUCT, ATRIBUTI, METODE, EXTENDS (NASLEĐIVANJE)– PRIMER KALKULATORA PREKO KLASA

Nastavak pokazuje još neke pojmove koji se javljaju kod OOP-a, odnosno Atribute i Metode, ali na konkretnom primeru jednostavnog KALKULATORA. Atributi se smeštaju u klase i predstavlju tzv. "elemente" PROJEKTA KUĆE sa početka vežbe – na primer prostorije dnevna soba, kuhinja itd. U ovom slučaju to su polja za unos brojeva koja čine KALKULATOR.

Zadatak je da se isprogramira kalkulator koji će unosom dva polja davati rezultat površina trougla i površina trapeza. To znači da je potrbno definisati dve klase gde će svaka klasa imatu svoju matematiku za izračunavanje površine sa istim podacima.

Početak koda počinje definisanjem naziva klase (povrsina_trougla) gde se smeštaju atributi (elementi "projekta") i metode
- funkcija koja "konstruiše" ta polja - CONSTRUCT
- funkcija koja skuplja atribute i obrađuje ih u matematiku
- funkcija koja daje ispis rezultata

Nastavak koda daje novu klasu class povrsina_paralelograma extends povrsina_trougla što znači da se tu sadrži nova matematika ali koja i dalje ima podatke od ranije, drugim rečima, to je klasa koja NASLEĐUJE neke elemente prethodne klase a to su polje_1 i polje_2. Novo stvorena klasa isto preko metoda KONSTRUIŠE ko učestvuje u kalkulaciji, definiše se nova funkcija „kalkulacija2“ sa novom matematikom koja množi brojeve iz dva polja (a x h je površina paralelograma).



<?php
class povrsina_trougla { // IME KLASE GDE SU DEFINISANA POLJA I MATEMATIKA 
// Atributi - polja koje učestvuju u kalkulaciji
private $polje_1;
private $polje_2;
// Metode - fukncija koja pravi KONSTRUKCIJU - preko komande THIS definiše "ko učestvuje u kalkulaciji" i samu kalkulaciju 
function __construct($polje_1, $polje_2) {
$this->polje_1 = $polje_1;
$this->polje_2 = $polje_2;
}
public function kalkulacija() {    					// Kalkulacija koja skuplja ATRIBUTE I matematički ih obrađuje 
return ($this->polje_1 * $this->polje_2) / 2 ;		// Matematika koja radi proračun (b x h) / 2
}
public function __toString() {     // Funkacija koja radi ISPIS svih polja i rezultat kalkulacije 
return " POVRŠINA TROUGLA IZNOSI: ($this->polje_1 * $this->polje_2) / 2 = ".$this->kalkulacija()." m2 ";
}
}
?>


<?php
class povrsina_paralelograma extends povrsina_trougla { // KLASA GDE SE NASLEĐUJE SVE IZ PRETHODNE KLASE SA DODATNIM IZMENAMA
// Atributi - polja koje učestvuju u kalkulaciji
private $polje_1;
private $polje_2;
// Metode - fukncija koja pravi KONSTRUKCIJU - preko komande THIS definiše "ko učestvuje u kalkulaciji" i samu kalkulaciju 
function __construct($polje_1, $polje_2) {
$this->polje_1 = $polje_1;
$this->polje_2 = $polje_2;
}
public function kalkulacija2() {    			// Kalkulacija koja skuplja ATRIBUTE I matematički ih obrađuje 
return ($this->polje_1 * $this->polje_2); 		// Matematika koja radi proračun (b x h)
}
public function __toString() {     // Funkacija koja radi ISPIS svih polja i rezultat kalkulacije 
return " POVRŠINA PARALELOGRAMA IZNOSI: ($this->polje_1 * $this->polje_2) = ".$this->kalkulacija2()." m2 ";
}
}
?>


Na kraju ostaje da se fajlu index.php ubaci formular sa poljima i naravno kreira NOVI OBJEKAT koji poziva sasvim drugu klasu iz fajla klase.php . Početak koda definiše jednostavan formular sa 2 polja i dugmetom SUBMIT. Važno je napomenuti da polja imaju nazive kao i klasa (polje_1, polje_2) U nastavku poziva se funkcija koja po učitavanju stranice poziva "povrsina_trougla" i dalje se definiše IF USLOV koji "kaže" Posle klika na SUBMIT formular preko komande GET (DOBIJA) link gde se porede dobijena polja (GET).. Ako je uslov TAČAN (kliknut je SUBMIT naziva REZULTAT i ako je GET (dobijen) sadžaj polja (polje_1, polje_2) KREIRA SE OBJEKAT ($rezultat) u kome se smešta KLASA sa svojim elementima posle čega se ispisuje rezultat u formi kako je dato u samoj klasi "povrsina_trougla" . Po istom principu se daje i rezultat 2 koji prikuplja sadržaj polja (polje_1, polje_2) i sve se smešta u $rezultat2 gde se definiše novi objekat "povrsina_paralelograma". Na kraju idu dva reda sa ECHO komandama koja rade ispis dve varijable odnosno dva rezultata koji pozivaju svaki svoju matematiku definisanu u svojim klasama.



<div style="margin:auto; width:900px;">
    <h1 style="text-align:center;"> Primer 2 - jednostavan kalkulator preko klasa i objekata </h1>
    <h2 style="text-align:center;"> Površina trougla i paralelograma </h2>
    
  <form method="GET">   
    <p style="text-align:center">
    <strong><span style="text-align:center;"><img src="images/trougao.jpg" width="250" align="absmiddle" /><img src="images/paralelogram.jpg" alt="" width="293" align="absmiddle" /></span></strong></p>
    <p style="text-align:center"><strong> a =</strong> 
      <input type="text" name="polje_1" /> 
      <strong>h =</strong> <input type="text" name="polje_2" /> = <input type="submit" name="Rezultat" value="Rezultat">
    </p>
    </form>
    
    <?php
    function __autoload($povrsina_paralelograma) {
    }
    if (!isset ($_GET['Rezultat'])) {
    }
    else 
    {
    $polje_1 = $_GET['polje_1'];
    $polje_2 = $_GET['polje_2'];
    
    // Konstruisanje instance klase naziva "polja_formulara" klikom na dugme gde se dobija (GET) rezultat
    if (!isset ($_GET['povrsina_paralelograma'])) {
    $rezultat = new povrsina_trougla ($polje_1, $polje_2);
    $rezultat2 = new povrsina_paralelograma ($polje_1, $polje_2);
	echo "<p style='color:red; font-weight:bold; text-align:center;'>".$rezultat."</p>";
	echo "<p style='color:red; font-weight:bold; text-align:center;'>".$rezultat2."</p>";
    }
    }
    ?>

</div>

Jednostavna 2 polja formulara gde se unosom brojeva i klikom na dugme "rezultat" ispod kalkulatora prikazuje rezultat prema različitim matematikama koje se nalaze u klasama. Ovo je jednostavan primer koji se dalje može razraditi po pitanju same kalkulacije (na primer proračuna rate za kredit, površina i mnogo toga gde i klasi polja_formulara definišete matematiku).

Na kraju vežba 1 i 2 izgledaju ovako.

 

PREUZMITE IZVORNI KOD

ZAKLJUČAK

Važno je savladati suštinu razmišljanja kod OOP-a gde malo se postavljaju drugačije elementi koji čine neki sajt. Kod klasičnog web programiranja ide se logikom da se piše red po red kojom se definiše konstrukcija web strane, sadržaj, linkovi itd. Preko OOP-a vi vašu web konstrukciju delite na nekoliko fajlova koji su Statični (TEMPLATE) i DINAMIČKI (varijable) dok preko KLASA definišete "KAKO DA SE PONAŠAJU" kada se komplet sve include-uje u index.php odnosno u OBJEKAT. U KLASE smeštate podatke koji učestvuju u obradi kao i funkciju koje te podatke obrađuju. Implementacijom kreirate OBJEKAT koji poziva klasu o kao rezultat daje se ispis podataka.