Uvod u PHP i backend programiranje
Uvod
PHP (skraćeno od "PHP: Hypertext Preprocessor") je skriptni jezik koji se izvršava na strani servera i omogućava dinamičko kreiranje HTML sadržaja (u skladu sa specifičnim zahtevima klijenta), povezivanje sa bazama podataka, kao i obavljanje drugih pozadinskih zadataka na serveru.
PHP je nastao 1994. ili, bolje rečeno, u pitanju je godina kada je danski programer Rasmus Lerdorf započeo razvoj jednostavnog sistema za kodiranje dinamičkih sadržaja za manje web prezentacije (da ne kažemo, "za lične potrebe" - čemu je odgovarao i ondašnji pun naziv jezika: "Personal Home Page").
Međutim, tokom vremena jezik se razvijao (i razvio), i postao je prilično moćan i popularan.
Iako u novije vreme nije u pitanju jedina dostupna serverska tehnologija (ni iz daleka), PHP je često "sledeći prirodan korak" za sve pojedince koji su već savladali HTML, CSS i JavaScript i žele da se posvete izradi ozbiljnijih web aplikacija koje korisnicima ne isporučuju uvek isti sadržaj pri učitavanju određene stranice, već, sadržaj koji nastaje interakcijom korisnika sa serverom.
U prvom članku o PHP-u, pažnju ćemo posvetiti osnovnim postavkama jezika PHP (a pre toga, i osnovnim principima back-end programiranja); u sledećih nekoliko članaka osvrnućemo se ukratko na različite protokole za razmenu podataka, a potom ćemo (u obliku tutorijala), detaljno obrađivati teme koje se tiču svakodnevnih 'zahvata' na strani servera ....
Front-end, back-end, full-stack
Za početak, pre nego što pređemo na tematiku interpretacije skriptnih jezika na serverima i sam PHP, osvrnućemo se ukratko na sveprisutne pojmove "front-end", "back-end" i "full-stack" i (takođe), na mesto koje jezik PHP zauzima u navedenoj klasifikaciji.
Front-end je termin koji se odnosi na projektovanje i izradu vidljivih delova sajtova (odnosno, računarskih programa i informacionih sistema uopšte).
Drugim rečima, u pitanju je dizajn elemenata sa kojima korisnici direktno dolaze u kontakt, pri čemu se vodi računa o logičnom rasporedu i lakoj dostupnosti upravljačkih grafičkih elemenata (ali, vrlo često, i tekstualnih), sve u cilju postizanja što boljeg korisničkog iskustva.
Back-end je termin koji se odnosi na projektovanje i izradu pozadinskih (tj. "nevidljivih") delova sajtova (odnosno programa i informacionih sistema uopšte) i - za razliku od front-end komponenti - u ovom slučaju se ne radi o elementima programa (tj. sajtova), sa kojima se korisnici susreću direktno, već, o procesima koji se tiču pravilne pripreme podataka koji se šalju korisniku, pri čemu se vodi računa o sigurnosti podataka i što efikasnijoj obradi (takođe u cilju postizanja što boljeg korisničkog iskustva).
Shodno navedenom, nije teško zaključiti da su HTML, CSS i JavaScript front-end jezici, PHP je back-end jezik, a izraz full-stack označava kombinaciju front-end i back-end pristupa.
Zarad upoznavanja sa principom funkcionisanja skriptnih jezika koji se izvršavaju na strani servera (i da bismo što bolje razumeli potrebu za takvim pristupom) - napravićemo osvrt na opšte principe učitavanja statičkih i dinamičkih sajtova (i sve izneto ćemo razmotriti na jednostavnim primerima iz svakodnevne prakse).
Učitavanje statičkih sajtova
Kao što je od ranije poznato, browseri interpretiraju HTML stranice preko DOM strukture, a sama struktura DOM stabla generiše se pri učitavanju HTML koda koji (na zahtev klijenta), server šalje klijentu.
Komunikacija između klijenta i servera, pri učitavanju statičke stranice (u ponešto uprošćenom obliku i uz pretpostavku da ne dolazi do grešaka u izvršavanju), ima sledeći tok:
- klijent (browser), pokreće učitavanje HTML stranice * pozivanjem URL-a
- server prima zahtev, priprema HTML stranicu ** i vraća klijentu traženi sadržaj u obliku HTML koda
- browser prima HTML kod, kreira DOM strukturu i prikazuje stranicu u prozoru
Ukoliko učitana stranica nema potrebu za daljom (ili detaljnijom) komunikacijom sa serverom, komunikacija između klijenta i servera prestaje (sve dok je klijent eventualno ne inicira ponovo, pozivanjem istog URL-a, u nekom kasnijem trenutku).
Kao primer statičke stranice, zamislićemo galeriju slika poslovnog prostora koju određena firma drži na svom sajtu (pri učitavanju, sve slike se preuzimaju sa servera i prosleđuju klijentu).
Međutim, šta ako u nekom drugom slučaju (na nekom drugom sajtu), pojam "galerija slika" ne podrazumeva nekoliko slika (koje posetiocu sajta treba da prikažu poslovni prostor, poslovna dostignuća, tim ljudi koji stoji iza poduhvata i sl), već je u pitanju galerija slika u doslovnom značenju - veća kolekcija umetničkih slika (ili fotografija), koje se broje stotinama ili hiljadama?!
Učitavanje dinamičkih sajtova
Pre svega, sasvim je jasno da preuzimanje više stotina slika i prikaz na jednoj HTML stranici, nisu opcije koje dolaze u obzir (u praktičnom smislu), to jest, jasno je da bi učitavanje takvog statičkog sajta bilo u (krajnje povećem (!)) neskladu sa nepisanim pravilima web dizajna, prema kojima je preporučljivo da vreme učitavanja stranice bude manje od dve sekunde.
U praktičnom smislu, funkcionisanje online galerija umetničkih slika podrazumeva da se iz velike kolekcije (koja se čuva na serveru), korisniku preko browsera prikazuje samo određeni podskup slika, a takođe je za očekivati i to da izbor slika vrši sam korisnik.
Sve što smo naveli, podrazumeva pripremu podataka u skladu sa zahtevima korisnika (a ne prosto učitavanje "istog sadržaja svaki put"), i stoga komunikacija između klijenta i servera u takvim okolnostima (i ovoga puta - u ponešto uprošćenom obliku i uz pretpostavku da ne dolazi do grešaka), ima sledeći tok:
- klijent bira parametre pretrage preko padajućih menija ili drugih prigodnih elemenata (parametri mogu biti: ime i prezime autora, raspon datuma u kome su slike nastale, tematika, rezolucija i sl)
- serveru se prosleđuje zahtev za učitavanje stranice (koji sadrži parametre koji su izabrani u prethodnom koraku)
- nakon prijema zahteva, na serveru se obavlja obrada (u bazi podataka traže se podaci o slikama koje zadovoljavaju zadate kriterijume)
- kreira se HTML stranica koja sadrži pronađene slike (tj. kreira se odgovarajući HTML kod sa
<img>
tagovima, i šalje se nazad klijentu) - završni deo komunikacije između klijenta i servera, ne razlikuje se mnogo od prethodnog primera - browser prima HTML kod (koji najverovatnije sadrži i reference za povezivanje sa CSS i JS datotekama - preko kojih su definisani grafički dizajn i UX elementi stranice), kreira se DOM stablo i prikazuje se stranica sa pronađenim slikama
Sada razumemo šta je svrha skriptnog jezika koji se izvršava na serveru, a pošto je ovaj članak posvećen PHP-u (i uz ogradu da nije baš u pitanju "knjiška" definicija), mogli bismo reći sledeće: PHP interpretator je program koji se izvršava na strani servera, interpretira PHP kod iz datoteka koje sajt koristi, generiše HTML kod shodno ulaznim parametrima, i šalje generisani kod browseru klijenta.
To jeste ono što PHP interpretatori uglavnom rade (na većini sajtova), ali, svakako nije i jedino.
Preko PHP-a se takođe mogu pokretati i skripte koje se direktno izvršavaju na serveru (tako da se dejstvo pokrenutih skripti "ne vidi" u browseru).
Smatramo da je došlo vreme da se posvetimo PHP-u i sve navedeno počnemo da isprobavamo u praksi.
Instalacija PHP-a (pokretanje lokalnog web servera)
Budući da smo temi pokretanja lokalnog servera posvetili zaseban članak , nećemo se na ovom mestu previše baviti detaljima, ali, osvrnućemo se ponovo na najvažnije postavke: za kreiranje dinamičkih sajtova preko PHP-a (i isprobavanje primera u ovom članku), potreban je web server - softver koji "osluškuje" mrežni saobraćaj usmeren prema računaru na kome je sajt postavljen (tj. pokušaje drugih računara da pristupe instaliranim sajtovima), i naravno - potrebna je instalacija PHP-a.
Za početak je najpraktičnije koristiti pakete programa kao što su XAMPP i WAMP (pogotovo u slučaju neiskusnijih korisnika). *
Kada su lokalni web server i PHP interpretator pokrenuti (što se dešava, manje-više automatski, po pokretanju programa XAMPP ili WAMP), možemo pokrenuti browser i potom, preko adrese localhost
, pristupati lokalnim sajtovima.
Kreiranje PHP skripti i naredba echo
Za početak, kreiraćemo veoma jednostavnu "hello world" skriptu, pri čemu preporučujemo da za čuvanje skripte koristite jednu od sledeće dve strukture direktorijuma i datoteka (adrese preko kojih se u browseru mogu otvarati sajtovi, takođe su prikazane u kodu):
U skriptu unesite sledeći kod:
Kada se skripta pokrene preko browsera, biće ispisano ....
U najpraktičnijem smislu, glavna svrha serverskih jezika tiče se kreiranja HTML sadržaja (koji se prosleđuje do browsera ili drugih klijentskih softvera), što se u slučaju PHP-a postiže upravo preko komande echo
.
Preko naredbe echo
, znakovne niske mogu se kombinovati sa vrednostima promenljivih, što ćemo videti u sledećem odeljku, i (takođe), budući da smo spomenuli da komanda može vratiti HTML (a ne samo običan tekst), pogledajmo kako se to izvodi na krajnje jednostavan način.
Kreirajte novu PHP datoteku sa nazivom 02_echo_i_html
* (ili direktorijum sa istim nazivom u kome će biti datoteka index.php
), i unesite sledeći kod:
Pri pokretanju stranice, browser prikazuje link (nije više u pitanju 'običan tekst'), i - naravno - na isti način mogu se kreirati i drugi HTML elementi.
Promenljive u PHP-u
Promenljive u PHP-u označavaju se znakom $
, koji stoji direktno ispred identifikatora, i slično kao u jezicima JavaScript i Python, promenljive ne podležu strogoj tipizaciji.
Za isprobavanje, kreirajte novu skriptu i unesite sledeći kod:
Prethodna skripta sadrži i određene delove sa kojima se do sada nismo susretali, i stoga ćemo se detaljnije osvrnuti na opšte principe korišćenja promenljivih u PHP-u:
- promenljive u PHP-u označavaju se uz prefiks
$
, koji uvek mora stajati uz promenljivu (uz svaku pojavu promenljive u kodu) - promenljive (kao što smo već spomenuli), ne podležu tipizaciji, to jest (kao i u programskom jeziku JavaScript), tip promenljive se određuje dinamički (pri izvršavanju skripte)
- u naredbi
echo
, kao operator spajanja niski koristi se.
(tačka) - što predstavlja jedan od načina za ispis vrednosti promenljivih * - takođe, vidimo da se za prelazak u novi red može koristiti HTML tag
<br>
(break), ** baš kao i kada se piše "običan HTML u običnoj HTML datoteci" - kada je potrebno da se u ispisu pojave znaci navoda, može se koristiti escape sekvenca
\"
(na taj način, PHP interpretator pravi razliku između navodnika koji treba da se pojave u ispisu, i navodnika koji određuju levu i desnu granicu niske)
Varijante kombinovanog ispisa
Već smo videli (na delu), osnovni mehanizam konkatenacije (tj. spajanja niski) ....
.... međutim, moguće je (a reklo bi se, i mnogo zgodnije), koristiti i drugi pristup, koji podrazumeva da se promenljiva navodi direktno unutar niske:
U jednostavnim primerima kakve prikazujemo u uvodnom članku, koristićemo (ipak) prvi pristup, koji smatramo preglednijim za početno upoznavanje, a šablonskim niskama ćemo uskoro posvetiti detaljan članak.
Kontrolne strukture
U programskom jeziku PHP, naredbe grananja i petlje mogu se koristiti upravo onako kako smo navikli i u ostalim "C-olikim" programskim jezicima (što ćemo prikazati kroz nekoliko uobičajenih primera) ....
Grananja (if-else, switch)
Za primer if
grananja, uzećemo ugnežđeni if
koji proverava da li je uneta vrednost pozitivna, negativna, ili nula:
Za switch
, primer će biti kod koji proverava da li uneta cifra pripada binarnom brojevnom sistemu:
(Sve funkcioniše na jednostavan i dobro poznat način.)
Petlje (while, do-while i for)
Osnovna while
petlja takođe se zapisuje na poznati način (što ćemo prikazati na primeru skripte za ispis brojeva od 1 do 10):
Prisutna je naravno i konstrukcija do-while
:
.... a rezultujući ispis će biti isti kao i u prethodnom primeru.
Za kraj odeljka prikazaćemo i for
petlju (još jednom, ne zaboravite znak $
ispred naziva svake promenljive):
(Ispis je isti kao i u prethodna dva slučaja.)
Funkcije u PHP-u
Veći i složeniji delovi koda koji se često ponavljaju, mogu se zapisati u obliku funkcija (baš kao i u ogromnoj većini drugih programskih jezika).
Funkcije za rešavanje specifičnih zadataka možemo definisati sami, a tipski zadaci se mogu obavljati korišćenjem ugrađenih funkcija.
Definisanje korisničkih funkcija
Zarad definisanje PHP funkcija, ispred naziva funkcije navodi se rezervisana reč function
, a u zagradama se navode parametri.
Za primer ćemo definisati jednostavnu funkciju koja vraća najveću od dve unete vrednosti ....
.... posle čega se funkcija može i poz(i)vati:
Kao što smo već nagovestili, za uobičajene/svakodnevne zadatke, uz instalaciju PHP-a dolazi i velika biblioteka sa funkcijama različitih namena ....
Ugrađene funkcije
Pomenućemo u nastavku nekoliko najčešće korišćenih funkcija za rad sa tekstualnim i brojčanim podacima (dok ćemo se sa ostalima postepeno upoznavati u narednim člancima).
strlen - Provera dužine niske
Za proveru dužine niske koristi se funkcija strlen
, pa (primera radi), ako pokrenemo sledeću skriptu ....
.... dobićemo sledeći ispis:
str_replace - Zamena dela niske
Za zamenu određenog tekstualnog obrasca drugom niskom, koristi se funkcija str_replace
, koja prima tri argumenta:
- tekstualni obrazac koji se traži unutar određene niske
- nisku koja sadrži tekst kojim će biti zamenjen prethodno navedeni tekstualni obrazac (ukoliko bude pronađen)
- nisku unutar koje se obavlja pretraga, tj. zamena (niska može biti zadata unapred, unutar navodnika, a može se predati i identifikator promenljive koja sadrži nisku)
Uzmimo kao primer sledeću skriptu ....
.... koja pri pokretanju proizvodi sledeći ispis:
Osvrnimo se i na to, da sledeći kod ....
.... neće dovesti do izmene niske $s
, jer funkcija str_replace
ne vrši direktnu izmenu niske koja je predata kao 3. argument, već kreira i vraća novu nisku (koju je potrebno povezati sa određenom promenljivom zarad dalje obrade).
abs - Apsolutna vrednost broja
Funkcija abs
vraća apsolutnu vrednost unetog broja.
Pokretanje sledeće skripte ....
.... proizvodi sledeći ispis:
rand - Generisanje nasumične brojčane vrednosti
Funkcija rand
generiše (pseudo)nasumične celobrojne vrednosti.
Kada pokrenemo gornju skriptu, dobićemo sledeći ispis (zapravo, bolje je reći da smo mi dobili takav ispis kada smo pisali članak, a šansa da ponovo dobijemo istovetnu vrednost - ni izdaleka nije velika ):
Ukoliko je potrebno ograničiti raspon mogućih vrednosti koje funkcija rand
vraća, navode se dva argumenta koji predstavljaju donju i gornju granicu:
Ovoga puta dobijamo i drugačiji ispis:
(Kao što ste verovatno pretpostavili, primer koji smo videli simulira bacanje kocke za igru.)
sqrt - Kvadratni koren broja
Funkcija sqrt
vraća kvadratni koren brojčane vrednosti koja se predaje kao argument.
U sledećem primeru ....
.... kreira se ispis koji se odnosi na kvadratni koren broja 2:
Upoznaćemo se ukratko i sa osnovnim principima korišćenja klasa i objekata (za primer ćemo uzeti vrlo jednostavnu klasu, ali, klasa će biti korektno zapisana i kompletirana).
Klase i objekti u PHP-u
Upotreba klasa i objekata u PHP-u, gotovo se nimalo ne razlikuje u odnosu na druge C-olike OOP jezike (principi su veoma slični, kao i sintaksa, ali, mestimično postoje sitnije razlike). *
Za početak, potrebno je pripremiti klasu (za primer ćemo uzeti jednostavnu klasu koja sadrži podatke o osobama).
Pošto je klasa Osoba
uredno definisana, mogu se kreirati objekti klase, i mogu se pozivati pripadajuće metode:
.... pri čemu dobijamo sledeći ispis:
Budući da su polja klase (ime
, prezime
i adresa
) deklarisana kao javno dostupni elementi klase, prethodna skripta može se dopuniti na sledeći način:
Pri pokretanju skripte, ovoga puta dobijamo i opširniji ispis:
Kombinovanje PHP i HTML kodova
Pošto se polako približavamo kraju uvodnog izlaganja o PHP-u, osvrnućemo se na lepu i korisnu ideju (koju smo naveli na početku), koja se tiče toga kako se - unutar iste PHP datoteke - HTML kodovi mogu kombinovati sa PHP kodovima.
Ideja se može shvatiti lako, preko jednostavnog primera.
Kreirajte datoteku sa ekstenzijom *.php
i unesite sledeći kod:
Blok PHP koda (u gornjem primeru), nalazi se unutar HTML tagova, ali, to ni u kom slučaju ne ometa izvršavanje PHP koda.
Datoteka se interpretira na sledeći način:
- budući da je ekstenzija datoteke
*.php
, uključiće se PHP interpretator - delove datoteke koji nisu uokvireni "PHP zagradama", interpretator će tretirati kao običan HTML
- kada se pojavi 'otvarajuća PHP zagrada' (niska
<?php
), interpretator počinje da izvršava PHP kod (što, u gornjem primeru, za krajnji rezultat ima generisanje HTML koda) - kada se pojavi 'zatvarajuća PHP zagrada' (niska
?>
), interpretator se vraća na tumačenje HTML-a
Prikazani pristup nudi veoma visok nivo fleksibilnosti (što ćemo još bolje moći da sagledamo u narednim člancima).
Pozivanje spoljnih skripti (include, require)
Kada su u pitanju "lepe i korisne" ideje, za sam kraj uvodnog članka osvrnućemo se na funkcije koje omogućavaju korišćenje programskog koda iz postojećih datoteka, što (kako u PHP-u, tako i inače), predstavlja pristup koji programe i skripte čini znatno preglednijim.
Za uvoz spoljnih datoteka, u PHP-u se mogu koristiti četiri različite funkcije: include
, include_once
, require
i require_once
.
Ukoliko se definiše skripta funkcije.php
, sa sledećim sadržajem ....
.... u drugim skriptama može se pozivati komanda include
(ili neka od preostale tri funkcije koje smo prethodno naveli) ...
.... što praktično proizvodi isti efekat kao da je sadržaj datoteke funkcije.php
'ručno kopiran' u drugu datoteku (bez PHP zagrada):
Kao što verovatno i sami pretpostavljate, u gornjem primeru se podrazumevalo da skripta funkcije.php
postoji (na navedenoj putanji).
Međutim, ukoliko skripta koju uvozimo ne postoji - a pri tom se u nastavku pozivamo na delove koda iz navedene skripte - doći će do greške u izvršavanju (glavne) skripte!
U situacijama (kao što je gornji primer), kada izvršavanje ostatka skripte zavisi od uspešnog učitavanja spoljne skripte, potrebno je koristiti funkciju require
, koja - u slučaju da je sve u redu sa učitavanjem - radi isto što i funkcija include
, ali - ukoliko dođe do greške - obustavlja dalje izvršavanje skripte.
Poruka korisniku tipično se prosleđuje preko (dodatne) funkcije - die
(koja ujedno prekida izvršavanje skripte):
Pošto smo na početku naveli četiri 'varijacije' funkcije za uvoz spoljne skripte - pri čemu u sva četiri slučaja postoji pokušaj kopiranja spoljne datoteke - osvrnućemo se na razlike, koje se mogu podeliti (najprostije rečeno), na razlike između funkcija include
i require
, i razlike između verzija funkcija sa sufiksom ili bez sufiksa _once
.
Razliku između funkcija include
i require
, već smo objasnili, ali, napravićemo kratak osvrt i na ovom mestu (zarad preglednosti):
include
iinclude_once
- izvršavanje funkcije ne dovodi do obustavljanja izvršavanja ostatka skripte ukoliko dođe do greške pri kopiranju sadržaja spoljne skripterequire
irequire_once
- izvršavanje funkcije dovodi do obustavljanja izvršavanja ostatka skripte ukoliko dođe do greške pri kopiranju sadržaja spoljne skripte
Razlike između verzija sa sufiksom _once
i bez sufiksa, su sledeće:
include
irequire
- spoljna skripta se kopira bezuslovnoinclude_once
irequire_once
- pre pokušaja kopiranja, proverava se da li je spoljna datoteka već kopirana i - ako spoljna datoteka jeste kopirana - neće biti kopirana ponovo
Sledeći koraci ....
Posle opšteg uvoda u PHP, bavićemo se (u narednim člancima), tehnikalijama koje se tiču korišćenja PHP-a za pokretanje 'pozadinskih procesa' na web serverima.
Neke od tema biće:
- prosleđivanje podataka serveru preko HTML forme
- povezivanje sa MySql bazama podataka
- kreiranje formi za prijavu korisnika i registraciju korisničkih naloga
- validacija korisničkog unosa
- korišćenje nizova, klasa i objekata ....
U sledeća dva članka, bavićemo se verovatno najuobičajenijim zadacima u web programiranju: obradom podataka koji su prosleđeni preko URL-a, i prosleđivanjem podataka serveru preko HTML forme ....