PHP

programovací jazyk

PHP (rekurzivní zkratka PHP: Hypertext Preprocessor, česky „PHP: Hypertextový preprocesor“, původně Personal Home Page) je skriptovací programovací jazyk. Je určený především pro programování dynamických internetových stránek a webových aplikací například ve formátu HTML, XHTML či WML. PHP lze použít i k tvorbě konzolových a desktopových aplikací. Pro desktopové použití existuje kompilovaná forma jazyka.

PHP
Paradigmaimperativní, objektově orientované, procedurální, reflektivní
Vznik1995
AutorRasmus Lerdorf
VývojářThe PHP Group
První vydání8. června 1995
Poslední verze8.3.0[1], 8.2.4[2], 8.1.17[3], 8.0.23[4] a 7.4.32[5] (16. srpna 2023 (8.2.9)[6]
16. březen 2023 (8.2.4, 8.1.17))
Typová kontroladynamická, slabá
Hlavní implementaceZend Engine, Phalanger, Quercus, HipHop
Ovlivněn jazykyC
Ovlivnil jazykyRadPHP
OSmultiplatformní
LicencePHP License
Webhttp://www.php.net

Při použití PHP pro dynamické stránky jsou skripty prováděny na straně serveru – k uživateli je přenášen až výsledek jejich činnosti. Interpret PHP skriptu je možné volat pomocí příkazového řádku, dotazovacích metod HTTP nebo pomocí webových služeb. Syntaxe jazyka je inspirována několika programovacími jazyky (Perl, C, PascalJava). Jazyk PHP je nezávislý na platformě, rozdíly v různých operačních systémech se omezují na několik systémově závislých funkcí a skripty lze většinou mezi operačními systémy přenášet bez jakýchkoli úprav.

PHP podporuje mnoho knihoven pro různé účely – např. zpracování textu, grafiky, práci se soubory, přístup k většině databázových systémů (mj. MySQL, ODBC, Oracle, PostgreSQL, MSSQL, SQLite), podporu celé řady internetových protokolů (HTTP, SMTP, SNMP, FTP, IMAP, POP3, LDAP, …).

PHP je nejrozšířenějším skriptovacím jazykem pro tvorbu internetových stránek, k únoru 2024 měl podíl asi 77 %.[7] Oblíbeným se stal především díky jednoduchosti použití a bohaté zásobě funkcí. V kombinaci s operačním systémem Linux, databázovým systémem (obvykle MySQL/MariaDB nebo PostgreSQL) a webovým serverem Apache je často využíván k tvorbě webových aplikací. Pro tuto kombinaci se vžila zkratka LAMP – tedy spojení Linux, Apache, MySQL a PHP, Perl nebo Python.

V PHP jsou napsány i velké internetové projekty, včetně Wikipedie nebo Facebooku (Facebook používá PHP transformované do C++ pomocí aplikace HipHop for PHP a to především kvůli vyšší rychlosti).

Ukázka kódu editovat

Takto v PHP vypadá skript Hello world:

<?php echo "Ahoj, světe!"; ?>

Můžeme text ale přenášet i přes proměnnou:

<?php
  $promenna = "Ahoj, světe!";
  echo $promenna;
?>

Některé vlastnosti jazyka PHP editovat

  • Jazyk PHP je dynamicky typovaný, tzn. že datový typ proměnné je vázán na hodnotu, nikoliv na proměnnou.
  • Pole jsou asociativní, tedy ve skutečnosti se jedná o hašovací tabulky, které ukládají páry klíč → hodnota. Klíčem může být pouze celé číslo anebo řetězec, jedno pole může dokonce obsahovat klíče jak celočíselné, tak řetězcové. Každé pole ještě drží pořadí párů, toto pořadí je zcela nezávislé na klíčích i hodnotách.
  • Řetězce lze v PHP zapsat 2 různými způsoby, a to:
    • uzavírat do uvozovek (při vyhodnocení se provede nahrazení proměnných uvnitř)
    • uzavírat do apostrofů (nahrazuje se jen escape sekvence \').
  • Kromě proměnných, které lze vytvářet i rušit, lze definovat konstanty. Proměnné mají své úrovně viditelnosti a pravidla pro jejich perzistenci (např. proměnná vytvořená ve funkci nebo metodě je po jejím vykonání automaticky zrušena, naproti tomu, proměnná vytvořená např. v cyklu nebo vloženém souboru bude viditelná do skončení programu). Konstanty jsou viditelné ze všech úrovní a po jejich definování je nelze zrušit.
  • PHP podporuje reference, pomocí kterých lze do proměnných ukládat odkazy na libovolnou jinou proměnnou, nebo i prvek jejího pole. Jako reference lze volat i parametry funkce. U každé proměnné PHP eviduje, kolik na ni směřuje referencí, a podle toho se rozhoduje, kdy může kterou proměnnou zrušit.
// Zde je v proměnné string (tečka je operátor spojování řetězců)
$retez = "Ahoj, světe" . ', mám se dobře' . " a nevadí, že střídám oddělovače";

// Zde je v proměnné číslo (int)
$cislo = 100;

// Do proměnné je možné dát pole, které obsahuje jak čísla, tak znaky či další pole
$pole = array('a', 'b', 1, 2, array('první' => 'podpole', 'vytištěno'));

// Nenahlásí chybu (jenom varování) a vytiskne 'Array'
print($pole);

// Vytiskne obsah proměnné pole
print_r($pole);

// Test porovnání
$cislo = 100;
$retez = '100';

// Toto porovnání ('==') platí díky automatické typové konverzi
if ($retez == $cislo) {
  echo 'Jsou stejné';
}

// Ale porovnání pomocí '===' neplatí, neboť nejsou stejné typy
if ($retez === $cislo) {
  echo 'Jsou stejné';
} else {
  echo 'To by nešlo';
}

Superglobální proměnné editovat

  • PHP do verze 4.2.0 ve výchozím nastavení automaticky přejímalo veškeré proměnné poslané jakoukoliv metodou (HTTP POST, HTTP GET, HTTP cookie, ale i ze zabudovaného mechanismu sessions) a umožňovalo s nimi dále pracovat jako s globálními – tato možnost představovala bezpečnostní riziko[8].
  • Od verze 4.2.0 lze hodnotu získat z tzv. superglobálních proměnných s garancí původu informace – tedy že data byla odeslána požadovanou metodou. Používání globálních proměnných je stále možné pomocí konfigurační direktivy register_globals povolit, ale z bezpečnostních důvodů je to silně nedoporučováno [9].
// odešlu formulář metodou POST, kde do pole s názvem jmeno vepíšu 'Tom'
echo $jmeno; // vrátí 'Tom', funguje pouze v případě povolených globálních proměnných
echo $_POST['jmeno']; // vrátí 'Tom', superglobální proměnné fungují i při vypnutých globálních proměnných
echo $_GET['jmeno']; // vypíše chybu úrovně 'notice' o neexistenci proměnné a vrátí NULL
// NULL je zvláštní hodnota libovolného typu proměnných pro stav 'nedefinováno'

Významné projekty napsané v PHP editovat

Další viz Kategorie:Software v PHP.

Výhody a nevýhody PHP editovat

Výhody PHP editovat

  • PHP je specializované na webové stránky.
  • Rozsáhlý soubor funkcí v základní knihovně PHP (přes pět a půl tisíce), další funkce v PECL.
  • Nativní podpora mnoha databázových systémů.
  • Multiplatformnost (zejména LinuxMicrosoft Windows).[10]
  • Možnost využití nativních funkcí operačního systému (možná nekompatibilita s jiným operačním systémem).[11]
  • Strmá křivka učení.
  • Obrovská podpora na hostingových službách – PHP je fakticky standardem, který je prakticky všude.[12]
  • Obrovské množství projektů a kódů, které lze zdarma využít (WordPress, phpBB a další).
  • Poměrně slušná dokumentace.[13]
  • Velmi svobodná licence, která (v protikladu k např. GPL) neobsahuje copyleft.[14]
  • Ve standardní distribuci je přítomen ladící nástroj (debugger - phpdbg).[15]

Nevýhody PHP editovat

  • Nekonzistentní pojmenování funkcí, např.:
    • např. strpos(), strchr(), ale str_replace(), str_pad().
    • Nejednotné názvosloví skupin funkcí, např.: mysql_XXXX, imap_XXXX, json_XXXX (s podtržítkem) versus imageXXXX, bcXXXX, gzXXXX (bez podtržítka).
  • Nejednotné pořadí parametrů, např.: array_map() vs. array_filter().
  • Po zpracování požadavku neudržuje kontext aplikace, vytváří jej vždy znovu (oslabuje výkon).

Historický vývoj PHP editovat

Související informace naleznete také v článku Historie PHP.

PHP bylo původně označení pro Personal Home Page,[16] tedy osobní domácí stránky. Vše začalo v roce 1994, kdy byla napsána binární část Common Gateway Interface (CGI) v programovacím jazyku C. Tuto prvotní část napsal dánský/grónský programátor Rasmus Lerdorf. Lerdorf zpočátku vytvořil tyto nástroje pro osobní domácí stránky (Personal Home Page) za účelem možné záměny s malou skupinou skriptů v Perlu, které chtěl používat pro údržbu osobní domovské stránky. Nástroje měly zajistit běh úloh jako například zobrazení jeho životopisu a zaznamenávání návštěvnosti stránek.[16] Tento binární kód ještě tentýž rok skloubil s jiným programem, který sám napsal. Po spojení s Form Interpreter tak vznikla kombinace PHP/FI, která měla mnohem větší funkčnost. PHP/FI obsahovala širokou implementaci pro programovací jazyk C a navíc tato verze mohla komunikovat s databázemi, což umožnilo tvorbu prvních jednoduchých dynamických webových aplikací. Lerdorf veřejně oznámil vydání PHP/FI (pod názvem „Personal Home Page Tools (PHP Tools) version 1.0“) v diskuzní skupině Usenet dne 8. června 1995.[17] Jeho cílem bylo rozšířit okruh uživatelů, aby mohl najít co nejvíce chyb a tak zdokonalil kód. Tato verze již měla základní vlastnosti, které měly i pozdější verze PHP, například proměnné ve stylu Perlu, zpracování formulářů a možnost vložit HTML kód. Syntaxe byla obdobná jako u Perlu, ale byla omezenější, jednodušší a méně konzistentní.[16]

Zeev SuraskiAndi Gutmans, dva izraelští vývojáři na Technion IIT, přepsali parser v roce 1997, vytvořili tak základ PHP 3 a změnili název jazyka na rekurzivní zkratku PHP = PHP: Hypertext Preprocessor.[16] Tým vývojářů oficiálně vydal PHP/FI 2 v Listopadu 1997 po měsíčním testování beta verze. Poté začalo veřejné testování PHP 3, a její oficiální uvolnění přišlo v červnu 1998. Zeev SuraskiAndi Gutmans poté začali opětovné přepisování jádra PHP a vydali Zend Engine v roce 1999.[18] Založili firmu Zend TechnologiesRamat Gan, Izrael.[16]

Dne 22. května 2000 byla vydána verze PHP 4 postavená na Zend Engine 1.0. Dne 13. června 2004 byla představena verze PHP 5, která již stojí na novém Zend Engine II.[16] PHP 5 obsahuje nové rysy jako je vylepšená podpora pro objektově orientované programování, PHP Data Objects extension (ta definuje lehké a konzistentní rozhraní pro napojení k databázím) a nesčetné množství výkonových vylepšení.[19] PHP 4 se již dále nevyvíjí a pro tuto verzi se nebudou vydávat ani žádné bezpečnostní aktualizace.[20][21]

V roce 2008 se stává PHP 5 jedinou stabilní verzí, která se vyvíjela. Později se zjistilo, že zde chybí static binding, byl přidán v PHP 5.3.[22][23] Plánované PHP 6 se vyvíjelo s verzí PHP 5. Mezi hlavní změny patří odebrání register_globals,[24] magické uvozovky[zdroj?] a safe mode.[20][25]

PHP ještě plně nepodporuje Unicode nebo multibyte strings; podpora unicode bude zahrnuta až do verze PHP následující po PHP 5. Spousta kvalitních open sourcových projektů pozastavilo podporu PHP 4 ve svých nových kódech od 5. února 2008. Aby jim konsorcium vývojářů PHP usnadnilo přechod na PHP 5, poskytlo jim přechodovou verzi z PHP 4 na PHP 5.[26][27]

PHP 5 běží jak ve 32bitovém, tak i v 64bitovém prostředí, ale jedinou oficiální verzí pro Windows je 32bitová verze, vyžadující 32bitový mód kompatibility Windows při použití IIS v 64bitovém prostředí Windows. K dispozici je verze třetí strany,[28] která je určena pro 64bitové Windows.

Vývoj verze 6 narazil někdy během roku 2010 na problémy kolem implementace Unicode a od té doby se vydání nové hlavní verze odkládalo, nicméně mnoho podstatných změn přinesly dílčí verze 5.3 a 5.4. PHP 6 bylo stále vyvíjeno, ale nedosáhlo bodu, ve kterém by bylo schváleno k vydání. V červenci 2014 se hlasovalo o názvu nové verze a bylo odhlasováno, že to bude PHP 7.[29]

Kvůli oblíbenosti řady PHP 5.6.x byla její podpora prodloužena až do 31. prosince 2018.[30] I přes blížící se konec podpory PHP 5.6.x ještě v říjnu roku 2018 používalo podle statistik W3Techs tuto verzi ještě 62 % webů.[30]

Jazyk PHP byl dlouho definován pouze svou implementací, oficiální specifikace jazyka byla oznámena na konci července 2014.[31][32]

Data vydání hlavních verzí editovat

Význam Stav vývoje
červená staré verze již nepodporované
žlutá současné verze opravovány jsou pouze kritické chyby
zelená současné verze aktivně podporováno, chyby jsou opravovány, pravidelně vychází nové verze
modrá budoucí verze vývoj nových vlastností
Řada Verze Datum vydání Poznámka
1.x 1.0 8. června 1995 Oficiální název „Personal Home Page Tools (PHP Tools)“. Poprvé byl použit název „PHP“.
2.x 2.0 16. dubna 1996 Autor jej považoval za „nejrychlejší a nejjednodušší nástroj“ pro tvorbu dynamických webových stránek.
3.x 3.0 6. června 1998 Tým vývojářů se z původní jedné osoby rozšířil na více osob. Zeev Suraski a Andi Gutmans
přepsali celý základ pro tuto verzi.
4.x 4.0 22. května 2000 Přidán pokročilý dvoustupňový systém parse/execute (analyzovat/vykonat) syntaktické analýzy tagu –
Zend engine.
4.1 10. prosince 2001 Byly představeny ‚superglobalní proměnné‘ ($_GET, $_POST, $_SESSION, atd.)
4.2 22. dubna 2002 zakázání register_globals ve výchozím nastavení. Data přijatá prostřednictvím sítě
nejsou přímo vkládány do názvů globálních proměnných, uzavírá se tím možnost využití bezpečnostních děr.
4.3 27. prosince 2002 Představeno CLI, jako doplněk CGI.
4.4 11. srpna 2005 Dodány stránky nápovědy pro skripty phpize a php-config.
5.x 5.0 13. července 2004 Zend Engine II s novým objektovým modelováním.
5.1 24. listopadu 2005 Zlepšení výkonu zavedením kompilátoru proměnných v přepracovaném Engine PHP.
5.2 2. listopadu 2006 Povolen filtr přípon ve výchozím nastavení.
5.3 30. června 2009 jmenné prostory, oprava chyb, změny ve funkcích a doplňcích
5.4 1. března 2012 traits, dereference polí, odstranění některých zastaralých funkcí a direktiv
5.5 20. června 2013 operátor yield, blok finally pro ošetřování výjimek, označení extenze MySQL jako zastaralé
5.6 28. srpna 2014 konstantní skalární výrazy, variadické funkce, operátor pro umocňování, upload souborů větších než 2 GB
6.x 6.0 nevydaná verze s plánovanou nativní podporou Unicode
7.x 7.0 3. prosince 2015 až 2x zrychlení oproti verzi 5.6, snížena paměťová náročnost, 64bitová podpora, typová kontrola pro skalární datové typy v parametrech, definice návratových hodnot funkcí, nový operátor null coalesce, nový operátor spaceship, přidání anonymních tříd
7.1 1. prosince 2016 návratový typ void, definice viditelnosti konstant, definice parametrů jako nullable, zachytávání více výjimek v jednom catch bloku, přidání typu iterable
7.2 30. listopad 2017 podpora algoritmu Argon2 ve funkci password_hash, generický typ object jako type hint u parametrů funkcí
7.3 6. prosinec 2018 volání funkcí a metod lze zakončit čárkou jako u definice polí, zpětně kompatibilní přepis interní knihovny PCRE pro regulární výrazy
7.4 28. listopad 2019[33] typová kontrola ve vlastnostech objektu (Type Properties), zkrácený zápis anonymních funkcí atd.[34]
8.x 8.0 26. listopad 2020 union types, pojmenované argumenty, atributy (anotace implementované v jazyce bez PHPDoc), definice třídních proměnných v konstruktoru, mixed type
8.1 25. listopad 2021 výčtový typ, fibers pro paralelizaci, readonly označení třídních proměnných, intersection type, never type
8.2 24. listopad 2022 readonly třídy, rozšíření typů o null/true/false, použití konstant v traits
8.3 23. listopad 2023 typy pro konstanty ve třídách, funkce json_validate, atribut označující přepsání metody

Reference editovat

  1. PHP: News Archive - 2023. www.php.net [online]. [cit. 2023-11-23]. Dostupné online. 
  2. PHP 8.2.4 Released!
  3. PHP 8.1.17 Released!
  4. PHP 8.0.23 Released!
  5. PHP 7.4.32 Released!
  6. PHP 8.2.6 Released!
  7. Usage Statistics and Market Share of PHP for Websites, February 2024. w3techs.com [online]. [cit. 2024-02-21]. Dostupné online. 
  8. Živě.cz: Problémy starých skriptů v novém PHP
  9. Jakub Vrána: Vypnutí register_globals
  10. linuxsoft.cz: Provoz ve Windows. www.linuxsoft.cz [online]. [cit. 2010-01-24]. Dostupné v archivu pořízeném dne 2010-02-22. 
  11. linuxsoft.cz: Funkce pro interakci s operačním systémem. www.linuxsoft.cz [online]. [cit. 2010-01-24]. Dostupné v archivu pořízeném dne 2009-12-11. 
  12. Jak psát web: Hosting s PHP
  13. (anglicky) PHP manuál
  14. (anglicky) PHP Licensing
  15. PHP: About debugging in PHP - Manual. www.php.net [online]. [cit. 2021-11-27]. Dostupné online. 
  16. a b c d e f History of PHP and related projects [online]. The PHP Group [cit. 2008-02-25]. Dostupné online. 
  17. Lerdorf, Rasmus. Announce: Personal Home Page Tools (PHP Tools) [online]. 1995-06-08 [cit. 2006-09-17]. Dostupné online. 
  18. Zend Engine version 2.0: Feature Overview and Design [online]. Zend Technologies Ltd. [cit. 2006-09-17]. Dostupné v archivu pořízeném dne 2006-07-19. 
  19. Trachtenberg, Adam. Why PHP 5 Rocks! [online]. O'Reilly, 2004-07-15 [cit. 2008-02-22]. Dostupné v archivu pořízeném dne 2016-03-31. 
  20. a b php.net 2007 news archive [online]. The PHP Group, 2007-07-13 [cit. 2008-02-22]. Dostupné online. 
  21. Kerner, Sean Michael. PHP 4 is Dead–Long Live PHP 5 [online]. InternetNews, 2008-02-01 [cit. 2008-03-16]. Dostupné online. 
  22. Late Static Binding in PHP [online]. Digital Sandwich, 2006-02-23 [cit. 2008-03-25]. Dostupné v archivu pořízeném dne 2008-07-27. 
  23. Static Keyword [online]. The PHP Group [cit. 2008-03-25]. Dostupné online. 
  24. Using Register Globals [online]. PHP [cit. 2008-04-04]. Dostupné online. 
  25. Prepare for PHP 6 [online]. CorePHP, 2005-11-23 [cit. 2008-03-24]. Dostupné v archivu pořízeném dne 2008-03-01. 
  26. GoPHP5. PHP projects join forces to Go PHP 5 [PDF]. [cit. 2008-02-23]. (GoPHP5 Press Release). Dostupné v archivu pořízeném dne 2009-12-10. 
  27. GoPHP5 [online]. GoPHP5 [cit. 2008-02-22]. Dostupné v archivu pořízeném dne 2011-04-27. 
  28. Fusion-X LAN. The PHPx64 Project [online]. [cit. 2008-05-05]. (Fusion-X LAN). Dostupné v archivu pořízeném dne 2008-03-13. 
  29. https://wiki.php.net/rfc/php6#vote
  30. a b KRČMÁŘ, Petr. PHP 5.x končí podpora ke konci roku, používá ho 62 % webů. root.cz [online]. 15. 10. 2018. Dostupné online. ISSN 1212-8309. 
  31. Archivovaná kopie. hhvm.com [online]. [cit. 2014-08-01]. Dostupné v archivu pořízeném dne 2014-08-03. 
  32. http://news.php.net/php.internals/75886
  33. PHP: todo:php74. wiki.php.net [online]. [cit. 2019-11-11]. Dostupné online. 
  34. HUJER, Martin. Zdroják [online]. 2019-10-07 [cit. 2019-11-11]. Dostupné online. 

Související články editovat

Externí odkazy editovat