PHP (skriptovací jazyk)

Všeobecný prehľad

PHP bolo inšpirované jazykmi podporujúcimi procedurálne programovanie. Najviac vlastností prebralo od jazyka C a jazyka Perl. V neskorších verziách bolo rozšírené o možnosť používať objekty.
Jedna zo zaujímavých vlastností PHP je, že umožňuje oveľa viac ako bežný skriptovací jazyk. Vďaka modulárnemu návrhu možno PHP používať aj na vývoj aplikácii s užívateľským rozhraním (GUI).
PHP dokáže spolupracovať s relačnými databázami, ako napríklad MySQL, Oracle, IBM DB2, Microsoft SQL Server, PostgreSQL alebo SQLite, pričom si stále zachováva jednoduchú a priamočiaru syntax. PHP beží na takmer všetkých najrozšírenejších operačných systémoch, vrátane UNIXu, Linuxu, Windows či Mac OS X. Spolupracuje s najrozšírenejšími webovými servermi.
Architektúra Linux-Apache-MySQL-PHP (zaužívaná skratka LAMP) a takisto Windows-Apache-MySQL-PHP (WAMP) sa stali veľmi obľúbenými v internetovom odvetví.

História

PHP bolo pôvodne navrhnuté ako niekoľko skriptov v jazyku Perl, neskôr prepísaných do jazyka C. Autorom bol Rasmus Lerdorf v roku 1994. O rok neskôr svoje skripty zverejnil pod názvom "Personal Home Page Tools". Kombináciou s ďalším jeho programom Form Interpreter vzniklo PHP/FI. Zeev Suraski a Andi Gutmans, dvaja izraelskí vývojári prepísali syntaktický analyzátor (parser) v roku 1997 na novšiu verziu, ktorá sa stala základom PHP 3. Krátko po zverejnení verzie PHP 3 bola spustená aj oficiálna stránka. V roku 1999 sa Suraski a Gutmans opäť pustili do prepísania jadra, už pod názvom Zend engine. Založili spoločnosť Zend Technologies, ktorá sa odvtedy podieľa na ďalšom vývoji PHP. V máji 2000 bolo vydané PHP 4, ktorého jadro tvoril nový Zend Engine 1.0. 13. júla 2004 bola vydaná verzia PHP 5, s jadrom „Zend Engine II“, obsahujúca nové rysy ako napr. vylepšená podpora objektovo orientovaného programovania, PHP Data Objects extension a ďalšie.

Použitie

PHP je skriptovací jazyk, ktorý je špeciálne navrhnutý na tvorbu web stránok bežiacich na webovom serveri. Všetok PHP kód je vykonávaný pomocou PHP runtime, aby dynamicky vytvoril obsah na webovej stránke. Taktiež môže byť využitý na skriptovanie z príkazového riadku alebo klientovo orientované aplikácie s grafickým rozhraním. PHP môže byť nasadené na väčšine Webových serverov, operačných systémov a platformách a môže sa používať v spojení s mnohými relačnými databázami.  Mnoho webhostingov ponúka podporu PHP pre svojich klientov. PHP je zadarmo dostupné a PHP Group poskytuje úplný zdrojový kód pre používateľov, aby ho mohli dotvárať, meniť a rozširovať pre ich vlastné použitie.  
PHP sa primárne správa ako filter, ktorý má na vstupe súbor, alebo prúd dát obsahujúci text a/alebo PHP inštrukcie a na výstupe prúd dát najčastejšie vo forme HTML. Od PHP verzie 4 PHP  parser kompiluje vstup aby vyprodukoval bajt kód pre spracovanie pomocou Zend Engine, ktorý poskytuje zvýšený výkon v porovnaní s jeho interpretermi v minulosti.
Aj keď PHP bolo pôvodne vytvorené na tvorbu dynamických webových stránok, v súčasnosti sa primárne zameriava na skriptovanie na strane servera a je podobné ostatným serverovo orientovaným skriptovacím jazykom, ktoré klientovi poskytujú dynamický obsah z webového servera. Medzi tieto jazyky patrí napríklad ASP .NET od spoločnosti Microsoft, JavaServer Pages od Sun Microsystems alebo mod_perl. PHP pritiahlo produkciu mnohých frameworkov, ktoré poskytujú stavebné bloky a návrh štruktúry pre podporu rýchleho vývoja aplikácií. Niektoré ako CakePHP, Symfony, CodeIgniter, Yii Framework a Zend Framework ponúkajú vlastnosti podobné iným frameworkom pre webové aplikácie.
LAMP architektúra sa stala populárnou vo webovom priemysle ako spôsob vývoja webových aplikácií. Písmeno „P“ v tomto balíku bežne zastáva PHP po boku s Linux, Apache a MySQL, avšak môže odkazovať aj na Python, Perl, alebo kombináciu všetkých troch. Podobné balíky sú taktiež dostupné pre Windows a OS X, pričom ich názvy sú WAMP a MAMP, kde prvé písmená reprezentujú operačný systém. Hoci PHP a Apache sú súčasťou Mac OS X základnej inštalácie, používatelia týchto balíkov vyhľadávajú jednoduchšiu inštaláciu, ktorá je jednoduchšie aktualizovaná.  
Od apríla 2007 viac ako 20 miliónov internetových domén malo webový servis hostovaný na serveroch s inštalovaným PHP a mod_php bolo zaznamenané ako najpopulárnejší Apache HTTP Serverový modul. PHP je používané ako serverovo orientovaný programovací jazyk na 75 % zo všetkých web stránok, ktorých serverovo orientovaný programovací jazyk je známy, a PHP je najpoužívanejší open source softvér v spoločnostiach. Množina systémov na správu webového obsahu napísané v PHP zahŕňa MediaWiki, Joomla, eZ Publish, SilverStripe, WordPress, Drupal a Moodle. Všetky webové stránky vytvorené pomocou týchto nástrojov sú napísané v PHP, zahŕňajúc požívateľskú časť Wikipédie, Facebook a Digg.

Bezpečnosť

Okolo 30 % všetkých zraniteľností zaznamenaných v National Vulnerability Database sú spojené s PHP. Tieto zraniteľnosti sú spôsobené nedodržaním pravidiel praktického programovania. Technické chyby samotného jazyka alebo jeho základných knižníc nie sú také časté (okolo 1 % zo všetkých chýb v roku 2008). Keďže programátori robia chyby, niektoré jazyky obsahujú kontrolu chýb na automatické zisťovanie nedostatočnej validácie vstupu, ktorá vedie k mnohým problémom. Takáto funkcia je vyvíjaná aj pre PHP, ale jej zahrnutie a vydanie bolo v minulosti niekoľkokrát zamietnuté.
Existujú však pokročilé ochranné záplaty ako napríklad Suhosin a Hardening-Patch, ktoré sú špeciálne navrhnuté pre prostredia webhostingu. 
PHPIDS pridáva bezpečnosť ľubovoľnej PHP aplikácii pre ochranu proti intruze. PHPIDS deteguje útoky založené na cross-site scripting (XSS), SQL injection, header injection, directory traversal, spúšťanie vzdialených súborov, remote file inclusion, a denial-of-service (DoS).

Optimalizácia rýchlosti

Zdrojový kód PHP je skompilovaný za behu na vnútorný formát, ktorý môže byť vykonaný prostredníctvom  PHP engine. Aby sa urýchlil čas vykonávania a nemusel sa kompilovať zdrojový kód vždy keď sa pristupuje k web stránke, môžu byť PHP skripty taktiež nasadené v spustiteľnom formáte použitím PHP kompilera.   
Optimalizátory kódu sú zamerané na vylepšenie výkonu skompilovaného kódu redukovaním jeho veľkosti, odstránením nadbytočných inštrukcií a vykonávaním iných zmien, ktoré môžu znížiť vykonávací čas. Pri PHP sú často príležitosti na optimalizáciu kódu. Príkladom optimalizátora kódu je PHP rozšírenie eAccelerator.
Ďalším prístupom k redukovaniu kompilačného zaťaženia pre PHP servery je použitie opcode cache. Opcode cache funguje na základe odchytávania skompilovanej formy PHP skriptu v zdieľanej pamäti aby predchádzala nadmernému parsovaniu a kompilovaniu kódu pri každom spustení skriptu. 
Aby sa zaručila najväčšia efektivita opcode caching a optimalizácia kódu môžu byť skombinované, keďže modifikácie sú vzájomne nezávislé (sú vykonávané v rozdielnych častiach kompilácie).

Dátové typy

PHP ukladá celé čísla v rozsahu závislom od platformy (64 alebo 32 bitov) ako celé číslo so znamienkom ekvivalentne k typu long v jazyku C. Celé čísla bez znamienka sú v istých situáciách konvertované na hodnoty so znamienkom, čím sa odlišuje od iných programovacích jazykov. Premenné typu celé čísla môžu mať určené používanie desiatkovej, osmičkovej a šestnástkovej notácie. Desatinné čísla sú taktiež zoradené podľa rozsahu závislého od platformy.  Môžu používať notáciu desatinných čísel, alebo dve formy vedeckej notácie. PHP má prirodzený booleovský typ, ktorý je podobný prirodzenému booleovskému typu v Jave a C++. Pri použití booleovskej konverzie pravidiel sú nenulové hodnoty interpretované ako pravda a nula je interpretovaná ako nepravda tak ako aj v Perl-e a C++. Prázdny (null) dátový typ je reprezentovaný ako premenná, ktorá nemá hodnotu. Jej jediná hodnota, ktorú môže nadobudnúť je NULL. Premenné typu „resource“ reprezentujú odkazy na prostriedky z externých zdrojov. Tieto sa zvyčajne vytvárajú funkciami z konkrétneho doplnku a môžu byť spracované iba funkciami z rovnakého doplnku. Príkladom môžu byť súbory, obrázky a databázové zdroje. Polia môžu obsahovať elementy hocakého typu, ktorý PHP dokáže spracovať, vrátane zdrojov, objektov a taktiež aj ďalších polí. Poradie je zachované v listoch hodnôt a v hashoch s hodnotami a kľúčmi, pričom sa môžu navzájom prelínať. PHP taktiež podporuje reťazce, ktoré môžu byť použité s jednoduchými úvodzovkami, dvojitými úvodzovkami, nowdoc alebo heredoc syntaxou. 
Štandardná PHP knižnica sa pokúša riešiť bežné problémy a implementuje efektívne rozhrania pre dátové prístupy a triedy.

Objekty

Základná funkcionalita objektovo orientovaného programovania bola pridaná v PHP 3 a vylepšená v PHP 4. Zaobchádzanie s objektmi bolo kompletne prepísané v PHP 5, keď bolo zároveň rozšírené o nové funkcie a vylepšené z hľadiska výkonnosti. V predošlých verziách PHP bolo k objektom pristupované ako k hodnotovým typom. Nedostatkom tejto metódy bolo to, že celý objekt bol skopírovaný, keď bola hodnota priradená, alebo posunutá ako parameter nejakej metóde. V novom prístupe sú objekty odkazované podľa rukoväte a nie podľa hodnoty. PHP 5 predstavilo súkromné a chránené premenné a metódy objektu, spolu s abstraktnými triedami, konečnými triedami, abstraktnými metódami a konečnými metódami. Taktiež predstavilo štandardný spôsob deklarovania konštruktorov a deštruktorov podobných ako v iných objektovo orientovaných jazykoch ako napríklad C++ a aj štandardný model spracovávania chyby. Okrem toho PHP 5 pridalo rozhrania a povolilo implementáciu viacerých rozhraní. Existujú špeciálne rozhrania, ktoré objektom dovoľujú  interakciu so systémom runtime. Objekty implementujúce prístup k poľu môžu byť použité so syntaxou poľa a objekty implementujúce iteráciu alebo agregáciu iterácie môžu byť použité s konštrukciou foreach. Neexistuje žiadna funkcia virtuálnych tabuliek v jadre, takže statické premenné sú počas kompilácie späté s menom namiesto s referenciou.
Ak vývojár vytvorí kópiu objektu pomocou rezervovaného slova clone, Zend engine skontroluje, či bola definovaná  metóda __clone() alebo nie. Ak nie je tak sa zavolá predvolená metóda __clone(), ktorá skopíruje vlastnosti objektu. Ak je metóda __clone() definovaná, tak ona bude zodpovedná za nastavenie potrebných vlastností vo vytvorenom objekte. Pre pohodlie, jadro zaobstaráva funkciu, ktorá importuje vlastnosti zdrojového objektu, takže programátor môže začať s úplnou kópiou zdrojového objektu a iba nahradí vlastnosti, ktoré potrebuje zmeniť.

Ukážky kódu

Prvý príklad zobrazí text "Ahoj svet!":
    <?php
      echo "Ahoj svet!\n";
    ?>
Druhý príklad vypočíta preponu pomocou Pytagorovej vety:
    <?php
      $strana_a = 3;                          // strana a - premenná
      $strana_b = 4;                          // strana b - premenná
      $strana_c = hypot($strana_a,$strana_b); // výpočet strany c
      echo $strana_c;                         // výpis dĺžky strany c do tela stránky
    ?>
Tretí príklad ukazuje kombináciu PHP s HTML:
    <p>Práve sa píše rok <strong><?php echo Date("Y"); ?></strong>.</p>    alebo    <?php echo "<p align=\"center\">Príklad 3. bol pridaný v roku 2006.</p>"; ?>    novšie sa používa verzia echo ''; ktorá dovoľuje tagy bez zbytočných \ znakov, napríklad    <?php echo '<p align="center">Príklad 3. bol pridaný v roku 2006.</p>'; ?>