Uvod u PHP Marijan Šuflaj FER, 2018
Sadržaj PHP Općenito Sintaksa Osnove Kontrola toka Zadatci Resursi
Općenito Naziv od PHP Hypertext Preprocessor Obično koristi ekstenziju.php Tipovi su dinamički Trenutno je aktualna verzija 7.2 Biti će spomenute promjene u odnosu na starije verzije Ozbiljno se razvija i poboljšava
PHP interpreter Portabilan Nema prevodenja u strojni kod Izvorni se kod pretvara u opcode Interpreter izvodi opcode po opcode Mogući problemi?
Poslužitelj Razne implementacije poslužitelja Mi ćemo raditi s Apache internet poslužiteljem U našem je slučaju PHP modul Apachea Postoje i druga sučelja za povezivanje s PHP-om
Interakcija
Model izvodenja Svaki zahtjev počinje s poznatim stanjem Okolina je izolirana od ostalih zahtjeva Postoje rijetki slučajevi kada to nije istina Nema nativnu podršku za višedretvenost
Tipovi podataka Osnovni integer - cijeli brojevi double - realni brojevi boolean - logička vrijednost true ili false null - predstavlja ništa Napredni string - niz znakova array - polje object - instanca razreda resource - resurs poput otvorene datoteke
Osnove sintakse Interpretira se kod nakon posebne oznake <?php Moguće je označiti kraj PHP koda pomoću?> Sve se izvan navedenih oznaka direktno prosljeduje na izlaz Kraća oznaka koja ispisuje rezultat izraza je <?=...?> <?= 1;?> ispisuje 1
Zadatak 1 Stvorite datoteku prva.php Spremite u nju sljedeći sadržaj Bok, mene je <?= "interpretirao";?> <b><?php echo "PHP";?></b>. Pokrenite skriptu na poslužitelju Postoje li tamo PHP oznake?
Komentari // Ja sam komentar u jednoj liniji # Ja sam takoder komentar u jednoj liniji /* Ja se mogu protezati kroz više linija */ /** * Komentar tipa PHPDoc */
Varijable Nije potrebno posebno deklarirati Stvara se kod prvog pridjeljivanja vrijednosti Korištenje varijable koja ne postoji vraća upozorenje i stvara ju U imenu se varijable razlikuju mala i velika slova Tip je varijable tip podatka koji je pohranjen u nju Može se promijeniti tijekom izvodenja programa Ispred imena mora biti $ Predlažemo cammel način imenovanja ($ovojeprvavarijabla, $ovojedrugavarijabla) Moguće promijeniti tip varijable ili izraza pomoću (tip) (int) ili (string) $foo = 42;
var dump() Funkcija ispisuje detalje o varijbli (varijablama) Više o funkcijama kasnije Ispisuje rekurzivno Korisno kod traženja grešaka Dodatak Xdebug uljepšava ispis Potrebno posebno instalirati
var dump() - primjer var_dump(1, 2.); var_dump(true, false, null, "PHP");
Memorijski model Varijabla predstavljena strukturom zval Velike promjene u odnosu na PHP5 16 bajtova github.com/php/php-src/.../zend types.h#l179 struct _zval_struct { zend_value value; /* i još dosta toga */ }; typedef struct _zval_struct zval;
Memorijski model - nastavak Sama vrijednost predstavljena strukturom zend value 8 bajtova github.com/php/php-src/.../zend types.h#l159 typedef union _zend_value { zend_long lval; double dval; zend_string *str; zend_array *arr; zend_object *obj; zend_resource *res; zend_reference *ref; /* i još neki */ } zend_value;
Memorijski model - nastavak // $foo = zval(type=is_long, value=5) $foo = 5; // $foo = zval(type=is_long, value=5) // $bar = zval(type=is_long, value=5) $barar = $foo; // $foo = zval(type=is_long, value=6) // $bar = zval(type=is_long, value=5) $foo = 6; // $foo = zval(type=is_undef) // $bar = zval(type=is_long, value=5) unset($foo);
Aritmetičke operacije Operandi se automatski pretvaraju u potreban tip PHP podržava izraze poput "25" * 4 Ukoliko operacija prelazi raspon integera koristi se double
Primjer //Dva cijela broja var_dump(1 + 1); var_dump(6 / 3); var_dump(6 / 4); //PHP_INT_MAX je konstanta var_dump(php_int_max); var_dump(php_int_max + 1);
Pridjeljivanje vrijednosti i reference Operator = kopira sadržaj desnog izraza u lijevu varijablu ukoliko se ne radi o objektu Copy on write - koristi se referenca do prve izmjene Posebna referenca unutar PHP interpretera Reference je na varijable moguće zatražiti ručno Reference unutar korisničkog prostora Tiho stvara referenciranu varijablu ukoliko ona ne postoji Prije verijze 7.0 bile su dosta skupa operacija u nekim slučajevima
Primjer $foo = 1; $bar = $foo; $foo = 2; var_dump($foo, $bar); $foo = 5; $bar = &$foo; $foo = 7; var_dump($foo, $bar);
Nizovi znakova - string Puno moćniji nego u C-u Mogu imati nul bajt Dohvaćanje duljine niza u konstantnom vremenu Zapis na dva načina Unutar jednostrukih navodnika Ne podržava ubacivanje varijabli Ne podržava posebne znakove Unutar dvostrukih navodnika Podržava ubacivanje varijabli Podržava posebne znakove
Primjer var_dump("ovo je string", 'Kao i ovo'); $foo = "Bok"; var_dump("$foo, kako ste?\nja sam dobro"); var_dump('$foo, kako ste?\nja sam dobro');
Nizovi znakova - nastavak Moguće pristupiti pojedinom znaku ukoliko se radi o ASCII znaku Pristup na razini bajta a ne znaka Rezultat tipa string Ne postoji poseban tip za jedan znak Spajanje stringova pomoću operatora. ili dvostrukih navodnika
Primjer $foo = "Foo"; var_dump($foo[2]); $bar = " i još bar"; var_dump($foo. $bar); //Nije bas čitljivo pa nije ni preporučljivo var_dump("$foo$bar"); //Malo čitljivija varijanta var_dump("${foo}${bar}");
Ispis echo Jezični konstrukt Prima više argumenata odvojenih zarezom Ima povratnu vrijednost print Jezični konstrukt Ispravno pozvati s ili bez zagrada Ima povratnu vrijednost printf Kao i u jeziku C
Primjer echo 1; echo "<br>"; print 2; printf("<br>%d<br>", 3); echo 4, "<br>", 5, "<br>"; var_dump(print 1);
PHP / ne-php kombiniranje Korisno za veće blokove Performantnije Lakše je čitati izvorni kod
Primjer 2 + 2 je <?php echo 2 + 2;?><br> Zgodno, zar ne?
Operatori usporedbe Labava usporedba (== i!=) Podatci se pretvaraju u isti tip Ukoliko su stringovi s obje strane numeričkog oblika, pretvaraju se u broj "10" == "1e1" vraća true Stroga usporedba (=== i!==) Provjerava tip i vrijednost Preferirajte stroge usporedbe Više informacija u službenoj dokumentaciji secure.php.net/manual/en/types.comparisons.php secure.php.net/manual/en/language.operators.comparison.php
Primjer var_dump(1 === 1); var_dump(1 == true); var_dump(1 === true); var_dump("10" == "1e1"); var_dump("10" === "1e1");
Uvjetno izvodenje // koristi se labava usporedba if ($foo) {} // suprotno od prethodne linije if (!$foo) {} // string == string if ($foo == "vjestina") {} // varijabla $foo definirana? if (isset($foo)) {} // sadržaj varijable veći od 1 if ($foo > 1) {} // logički operatori kao u C-u if ($foo && $bar) {}
Uvjetno izvodenje - nastavak Postoje else if i elseif Nije potrebno pisati { i } Često nije čitljivo Preporuka je uvijek pisati vitičaste zagrade Postoji ternarni operator $rezultat = $uvjet? $akoistina : $akolaz Dva dodatna uvjetna operatora $rezultat = $akojeizrazistina?: $inaceovaj $rezultat = $akovarijablapostoji?? $inaceovaj
Primjer var_dump('1' === '1'? 'istina' : 'laž'); var_dump(0?: 'bok'); var_dump($foo?? 'foo ne postoji');
Grananje - switch Slično kao i u C-u Koristi labavu usporedbu Podržava nizove znakova
Primjer switch ("php") { case "java" : var_dump("java"); break; case "php" : var_dump("php"); break; }
Petlja for for ($i = 0; $i < 10; $i++) { echo $i, "<br>"; }
Petlja while $i = 0; while ($i < 10) { echo $i, "<br>"; $i++; }
Petlja do while $i = 0; do { echo $i, "<br>"; $i++; } while ($i < 10);
Alternativni zapis Nudi se za if, for, while, foreach i switch O foreach-u više kasnije Umjesto vitičastih zagrada koriste se : s endif, endfor, endwhile, endforeach i endswitch respektivno secure.php.net/manual/en/control-structures.alternativesyntax.php
Primjer <?php /* Preporuka koristiti zapis s : i ispis pomoću <?= */?> <table> <?php for ($i = 1; $i <= 5; $i++) :?> <tr> <?php for ($j = 1; $j <= 5; $j++) :?> <td><?= $j * $i;?></td> <?php endfor;?> </tr> <?php endfor;?> </table>
break i continue for ($i = 0; $i < 100; $i++) { for ($j = 0; $j < 100; $j++) { if ($j % 2) { continue; } else if ($j > 10) { break 2; } echo $j, "<br>"; } }
Zadatak 2 Stvorite novu datoteku tablica-mnozenja.php Napišite program za ispis tablice množenja od jedan do deset Koristite <table border="1">
Zadatak 3 Stvorite novu datoteku ponavljanje.php Prebrojite sva ponavljanja znakova a, b i c ispred znaka z Za varijablu sadržaja Abecedanejdedozjerimaž treba ispisati 4
Resursi nikic.github.io/2015/05/05/internal-value-representation-in- PHP-7-part-1.html nikic.github.io/2015/06/19/internal-value-representation-in- PHP-7-part-2.html