PHP

A Wikipédiából, a szabad enciklopédiából
A PHP rövidítés egyben a Fülöp-szigeteki peso valutakódja.
PHP
PHP-logo.svg

Paradigma imperatív, objektumorientált, procedurális, reflektív
Jellemző kiterjesztés .php, .phtml, .php4, .php3, .php5, .phps
Megjelent 1995
Tervező Rasmus Lerdorf
Fejlesztő The PHP Group
Utolsó kiadás 5.3.29, 5.4.35, 5.5.19, 5.6.3 (2014. november 13.)
Típusosság dinamikus, gyenge
Fordítóprogram nincs (értelmezett szkriptnyelv)
Hatással volt rá C, C++, Java, Perl, Tcl
Operációs rendszer platformfüggetlen
Licenc PHP License
Weboldal

A PHP általános szerveroldali szkriptnyelv dinamikus weblapok készítésére. Az első szkriptnyelvek egyike, amely külső fájl használata helyett HTML oldalba ágyazható. A kódot a webszerver PHP processor modulja értelmezi, ezzel dinamikus weboldalakat hozva létre.[1] Rasmus Lerdorf 1995-ben indította útjára. Ma a The PHP Group tartja fenn és fejleszti.[2] A PHP szabad szoftver, de licence nem csereszabatos a GNU licensszel, mivel megkötéseket tartalmaz a PHP név használatára.[3]

A PHP születésekor csupán egy makrókészlet volt személyes honlapok karbantartására. Innen jön az eredeti név is: Personal Home Page Tools.[4] Az rövidítés jelentése később PHP: Hypertext Preprocessor lett, így rekurzívvá vált.[5][6] Később a PHP képességei bővültek, így egy önállóan használható programozási nyelv alakult ki, amely képes nagyméretű webes adatbázisalapú alkalmazások működtetésére is.

A PHP nyelv népszerűsége képességeinek bővülésével folyamatosan nőtt. A NetCraft elemző cég felmérései szerint a PHP-t 1999 novemberében több mint 1 millió kiszolgálón használták. Ez a szám 2001 szeptemberére 6 millióra ugrott, 2003 októberében pedig már állítólag 14 millió gépre telepítették a PHP-t. A SecuritySpace.com szerint a PHP az Apache legnépszerűbb modulja, a mod_ssl-t, a perl modult és a FrontPage-et is maga mögé utasítva. 2007 áprilisában több, mint 20 millió honlap és 1 millió szerver használta.[7]

A hagyományos HTML lapokkal ellentétben a kiszolgáló a PHP-kódot nem küldi el az ügyfélnek, hanem a kiszolgáló oldalán a PHP-értelmező motor dolgozza fel azt. A programokban lévő HTML elemek érintetlenül maradnak, de a PHP kódok lefutnak. A kódok végezhetnek adatbázis-lekérdezéseket, létrehozhatnak képeket, fájlokat olvashatnak és írhatnak, kapcsolatot létesíthetnek távoli kiszolgálókkal. A PHP-kódok kimenete a megadott HTML elemekkel együtt kerül az ügyfélhez.

A PHP-t parancssori alkalmazásként is telepítik, így alkalmas parancsfájlok készítésére. Számos rendszergazda automatizálási célokra is a PHP-t használja, pedig ezt a feladatot hagyományosan Perl- vagy shell scriptekkel oldották meg.[1]

Története[szerkesztés | forrásszöveg szerkesztése]

A PHP fejlődése kezdetén csak CGI-programok halmaza volt. Ezeket Rasmus Lerdorf néhány Perl szkript lecserélésére írta, amelyeket honlapjának karbantartására (például önéletrajzának megjelenítésére és a látogatottság mérésére) használt. Később ezeket a programokat kombinálta a szintén általa írt Form Interpreter (űrlap-értelmező) alkalmazással - így jött létre a PHP/FI, ami már jóval szélesebb funkcionalitással bírt. Az új, C nyelven megírt változat képes volt adatbázisokhoz kapcsolódni és segítségével egyszerű dinamikus weboldalakat is létre lehetett hozni. Lerdorf 1995. június 8-án adta ki a PHP első nyilvános változatát, hogy külső segítséggel gyorsabbá tegye a hibák megtalálását és a kód további fejlesztését.[8] Az új verziót PHP 2-nek nevezte el és már megtalálhatóak voltak benne a mai PHP alapvető tulajdonságai: a Perl-éhez hasonló változók, az űrlapok kezelése és a HTML-kód beszúrásának lehetősége. A PHP szintaktikája is hasonló volt a Perl-éhez, de annál jóval korlátoltabb, egyszerűbb és kevésbé egységes volt.[2][9]

1997-ben Zeev Suraski és Andi Gutmans, két izraeli fejlesztő újraírta az értelmezőt, ezzel megteremtve a PHP 3 alapját - ekkor született meg a PHP új neve, a PHP: Hypertext Preprocessor rekurzív rövidítés is.[2] A fejlesztőcsapat 1997 novemberében, két hónapnyi béta-tesztelés után kiadta a PHP/FI 2-t, majd megkezdődhetett a PHP 3 tesztelése és végül megjelenése 1998 júniusában.[2] Suraski és Gutmans ekkor megint a PHP-mag újraírása mellett döntött, amiből 1999-ben megszületett a Zend Engine. A két fejlesztő ekkor alapította meg a Zend Technologies-t is, ami máig aktívan ellenőrzi a PHP fejlesztését.[2]

A Zend Engine 1.0 által hajtott PHP 4 2000. május 4-én jelent meg.[2] Ezt követte 2004. július 13-án a következő nagy mérföldkőnek számító, az új Zend Engine II-n alapuló PHP 5.[10] Az ötös verzió sok újítást tartalmazott: fejlettebb objektumorientált programozási lehetőségeket, a PDO (PHP Data Objects) adatbázis-absztrakciós kiterjesztést, és sok teljesítményt növelő javítást is.

A PHP 4 fejlesztése 2007 végén maradt abba, az utolsó megjelent verziója a 4.4.8 verziószámot viselte - a PHP Group ezekhez és a PHP 4 előző változataihoz 2008 augusztusáig biztosított biztonsági frissítéseket.[11][12] Jelenleg a PHP 5 a nyelv egyetlen aktívan fejlesztett verziója.[13][14] A hatos verzió bár már fejlesztés alatt áll, még nem jelent meg.[15] 2008. február 4-étől A GoPHP5 kezdeményezés keretében több vezető PHP-alapú szabad-szoftver projekt döntött a PHP 4-támogatás megszüntetéséről, hogy ezzel mozdítsák előre az ötös verzióra való áttérést.

A PHP 5 évei alatt több nagyobb fejlesztés zajlott. Ezeket a PHP 6-ban adták volna ki, de problémák adódtak a Unicode támogatásával. Így a kevésbé problémás eszközöket a PHP 5 különböző verzióiba tették bele, a többit pedig összevonták egy külön ágba. Innen fog jönni a PHP 6, miután sikeresen megoldották ezeket a problémákat.

A PHP 5.4-ből eltávolították a következőket: register_globals,[16] a speciális karakterek backslash-es ecsape-elése, és a biztonságos mód.[11][17] Ezek az eszközök biztonsági rést nyitottak a PHP programokban, ezért távolították el őket. Az escape-eléshez vannak más eszközök, például az addslashes() függvény, a MySQL utasításokban pedig a mysql_real_escape_string(). Mindezek már a PHP 5.3-ban is elavultnak számítottak, és figyelmeztetést váltanak ki.[18]

2008 február 5-étől kezdve sok szabad forrású projekt felhagyott a PHP 4 támogatásával a GoPHP5 kezdeményezés miatt,[19] ami támogatta az áttérést a PHP 5-re.[20][21]

A 2011-es állapot szerint a PHP natívan nem támogatja a Unicode-ot és a több bájtos karaktereket tartalmazó stringeket. Ezek majd a PHP 6-ba fognak bekerülni, ami lehetővé teszi majd, hogy a neveknek ne kelljen csupán ASCII karakterekből állnia.[22][23]

Léteznek PHP értelmezők mind 32, mind 64 bites platformra is, bár a Microsoft Windowsra csak egy 32 bites disztribúció létezik, ami 32-bit támogatást követel meg az Internet Information Services (IIS) 64 bites rendszerein. A korábban már létezett kísérleti 64 bites PHP 5.3.0 -értelmezőt visszavonták.[24]

A PHP nyelv szabad, de licence kimondja, hogy a származtatott termékek nem használhatják nevükben a PHP szót a group@php.net írásos engedélye nélkül.[25] Emiatt a PHP licenc nem csereszabatos a GNU General Public License-szel.[26]

A PHP működése[szerkesztés | forrásszöveg szerkesztése]

A LAMP (szoftvercsomag) tartalmaza a PHP-t

A PHP oldalak elkészítésénél a HTML-t gyakorlatilag csak mint formázást használják, ugyanis ezen lapok teljes funkcionalitása a PHP-re épül. Amikor egy PHP-ben megírt oldalt akarunk elérni, a kiszolgáló először feldolgozza a PHP utasításokat, és csak a kész (HTML) kimenetet küldi el a böngészőnek, így a programkód nem is látható kliens oldalról.[27] Ehhez egy ún. interpretert (értelmezőt) használ, amely általában egy külső modulja a webszervernek. Ebben más szerver oldali szkript nyelvekre hasonlít, mint a Microsoft ASP.NET-je, a Sun Microsystems JavaServer Pages,[28] és a mod_perl. Az 5.4-e verzió óta a nyelv tartalmaz egy egyszerű, parancssorban beállítható webszervert.

A PHP nyelv lényegében nagymértékű kiegészítése a HTML-nek, ugyanis rengeteg olyan feladat végezhető el vele, amelyre az ügyféloldali szkriptek nem képesek (vagy ha igen, korlátozottan).[28] Ilyen például a bejelentkezés, az adatbáziskezelés, fájlkezelés, kódolás, adategyeztetés, kapcsolatok létrehozása, e-mail küldése, adatfeldolgozás, dinamikus listakészítés és hasonlók. Minden olyan esetben, ahol nagyszámú ismétlődő feladatsort kell végrehajtani (például képek listázása és linkelése, listakészítés stb.), ott ez a programnyelv nagyszerű segítség. Alapvetően szűrőként működik,[29] ami egy bemeneti fájlból egy kimeneti fájlt állít elő. A PHP 4 óta a parser lefordítja a kódot a Zend motor számára.[30]

Sok különböző platform használja, és relációs adatbázis-kezelésre is megfelel (RDBMS). Ingyenes és nyílt; a PHP Group feljogosítja a fejlesztőket a nyelv bővítésére és beállítására. A webfejlesztésben népszerűvé vált LAMP struktúrában a P többnyire a PHP-re utal, bár lehet a Python vagy a Perl nyelv rövidítése is. A többi betű a Linux, az Apache HTTP Server és a MySQL helyett áll, de hasonló csomagok más operációs rendszerekre is elérhetők, így a WAMP Windows és a MAMP Mac OS X rendszerekre.

A webes PHP alkalmazások 2007 áprilisában több, mint 20 millió internetes tartományra voltak elérhetők, és a mod_php lett a legnépszerűbb Apache HTTP Server modul.[31] A webszerverek 75%-án használtak PHP-t.[32] Több tartalomkezelőt is PHP-ben írtak, ilyenek a MediaWiki,[33] a Joomla!, az eZ Publish, a SilverStripe,[34] a WordPress,[35] a Drupal[36] és a Moodle.[37] Minden olyan weboldal, amit ezekkel hoztak létre, PHP-ben íródott, így a Wikipédia, a Facebook,[38] és a Digg felhasználói felülete.[39]

Egyéb futási módok[szerkesztés | forrásszöveg szerkesztése]

A PHP programok futhatnak közönséges (parancssori) programként is, nem HTML oldalba építve. Ezt azonban ritkán használják.[forrás?] Ezen módot sokszor weblapokkal kapcsolatos időzített folyamatok megvalósításához alkalmazzák, mivel azonos programnyelven, azonos megközelítési módon hajthatók azok végre.

Lehetőség van komplex konzolos alkalmazások írására is, mivel lehetőség van ncurses használatára is.

Microsoft Windows platformra is írhatók grafikus programok PHP-ben. Ehhez több mód is rendelkezésre áll: PHP-GTK - a sok program által használt Gimp Tool Kit függvényeit és felületi eszközeit lehet elérni.

Winbinder - egy fejlett modul és futtató környezet páros. A standard felületi elemeket teszi elérhetővé, valamint lehetőséget ad egyedi elemek létrehozására. A csomag tartalmaz egy integrált fejlesztő eszközt is, melynek segítségével Drag and drop módszerrel lehet összerakni a kívánt felületet.

A PHP támogatta a keretrendszerek fejlesztését, melyek építőelemek és tervezési módszereket ajánlanak a prototípus alapú tervezéshez és fejlesztéshez. Ezek közé tartoznak a CakePHP, Symfony, CodeIgniter, Yii Framework, és a Zend Framework, a webalkalmazások fejlesztéséhez hasonló eszközökkel.

Fordítás[szerkesztés | forrásszöveg szerkesztése]

A PHP nyelvet eredetileg értelmezett szkriptnyelvnek írták meg. Azóta már több fordító is létezik, melyek elszakítják a nyelvet az értelmezőtől. Előnyük a gyorsabb kód, a statikus analízis és a jobb együttműködés más nyelvekkel.[40]

Lehetséges módszerek:

  • HipHop - A PHP-kódot C++-kóddá alakítja, majd futtatható változatot készít belőle. A Facebook fejlesztői fejlesztik. Nyílt forrású.
  • php2c - a php kódot C kóddá alakítja
  • php2exe - több megoldás is létezik. Nagy részük kizárólag részleges megoldást ad
  • Phalanger - CIL-be fordít

Mindezek a módszerek kétszeresére gyorsították a programokat.

Optimalizáció[szerkesztés | forrásszöveg szerkesztése]

A PHP az 5.3-as kiadás óta szemétgyűjtős nyelv, azaz a szemétgyűjtő (Garbage Collector) eltakarítja azokat az objektumokat és más megjegyzett dolgokat, amikre feltehetően már nem lesz szükség. Ettől a verziótól kezdve ehhez már nem kell installálni a Zend Optimizert.

A PHP szkriptnyelv, az értelmező futás közben fordítja a kódot, és azonnal végre is hajtja.[41][42] Léteznek fordítók is, hogy ne kelljen mindenkinek külön lefordítani a kódot.

Vannak olyan egyedi (gyártó által nem elismert) modulok, melyek egyfajta köztes megoldást nyújtanak, vagyis nem a nyers forráskód kerül tárolásra, hanem egyfajta byte-kód, mely csak a feldolgozás gyorsítására szolgál.

Van hivatalos megoldás is az utóbbira, ennek lényege, az egyes futásokkor megvizsgálja a forrást és ha az megváltozott generál egy köztes állapotot, mely a forrás felesleges részeit (megjegyzések, felesleges blokk-kezdések, white space karakterek) kiszűri, és generál egy állományt az így kapott változattal. Ha a kód nem változott, betölti a „könnyített” változatot, és azt futtatja. Ez jelentheti azt is, hogy az ember által olvasható kódot tokenizálja. Így a feldolgozás egy részét „megspórolva” fut a program.

A kódoptimalizátorok tömörebbé teszik a kódot, összeolvasztják a redundáns utasításokat, és más hasonló változtatásokat tesznek, hogy a végrehajtás gyorsabbá váljon.[43] A PHP-szkriptekben gyakran van erre lehetőség. Az eAcceleratornak van PHP kiterjesztése.[44] Bizonyos esetekben ez a módszer nem működik, mivel a kód tartalmazhat nem feldolgozható elemeket.

Egy másik módszer a cache-elés, vagyis a lefordított kód tárolása a megosztott memóriában, hogy ne kelljen mindent újra és újra lefordítani. A tervek szerint a PHP 6-nak már lesz beépített cache-e, az APC.[45]

A két módszer független, ezért kombinálható.

Verziók[szerkesztés | forrásszöveg szerkesztése]

Jelentés
Piros Már nem támogatott kiadás
Zöld Még támogatott kiadás
Kék Elkövetkezendő kiadás
Főverzió Alverzió Kiadás dátuma Megjegyzések
1 1.0.0 1995-06-08 Eredeti nevén PHP Tools (Personal Home Page Tools). A „PHP” név első használata.[2]
2 2.0.0 1997-11-01 Alkotója szerint a legegyszerűbb eszköz dinamikus weboldalak készítésére.[2]
3 3.0.0 1998-06-06 A fejlesztés csapatmunkává vált. Zeev Suraski és Andi Gutmans újraírták a rendszer alapját.[2]
4 4.0.0 2000-05-22 Megjelent az új parancsértelmező mag, a Zend Engine[46]
4.1.0 2001-12-10 Megjelentek a szuperglobális változók, tömbök ($_GET, $_POST, $_SESSION, stb.)[46]
4.2.0 2002-04-22 A register_globals környezeti változó alapértelmezésben kikapcsolt értéket vett fel.[46]
4.3.0 2002-12-27 CGI mód mellett már lehetőség van a CLI, azaz parancssori futtatásra is[46][47]
4.4.0 2005-07-11 Man oldalak a phpize-hoz és a php-config-hez[46]
4.4.8 2008-01-03 Számos biztonsági, kiegészítő és hibajavítás,a következő biztonsági frissítés 2008-08-08 esedékes ha szükségszerű.
4.4.9 2008-08-07 Több biztonsági, kiegészítő és hibajavítás, a PHP 4.4 széria utolsó kiadása.[48][49]
5 5.0.0 2004-07-13 Megjelenik a Zend Engine II, teljesen új objektumorientált lehetőségekkel[50]
5.1.0 2005-11-24 A PHP motor újratervezése, hatékonyságjavítás új fordítói változók bevezetésével.[50] Új interfész adatbázisokhoz.[51]
5.2.0 2006-11-02 A "filter" kiterjesztés alapértelmezett módon elérhető. Natív JSON támogatás.[50]
5.2.16 2010-07-22 Hibajavítás.
5.2.17 2011-01-06 Kritikus hibajavítás a lebegőpontos számításokkal kapcsolatosan.
5.3.0 2009-06-30 Névtér támogatás, sqlite3
5.3.1 2009-11-19 Több mint 100 hibajavítás
5.3.2 2010-03-04 Sok hibajavítást magában foglaló kiadás.
5.3.3 2010-07-22 Főleg biztonsági és hibajavítások.
5.3.6 2011-03-17 Biztonsági és hibajavítások.
5.3.7 2011-08-18 Ez a kiadás a PHP 5.3.x branch stabilitásának javítására fókuszált. Több, mint 90 hiba javítást tartalmazott, biztonsági javításokkal együtt.
5.3.8 2011-08-23 Ez a kiadás a PHP 5.3.7-ben megjelent 2 fontosabb problémát javított.
5.3.9 2012-01-10 Ez a kiadás a PHP 5.3.x branch stabilitásának javítására fókuszált. Több, mint 90 hiba javítást tartalmazott, biztonsági javításokkal együtt.
5.3.10 2012-02-02 Ez a kiadás javítja a Stefan Esser által jelentett távoli önkényes kód végrehajtási sebezhetőséget (CVE-2012-0830).
5.3.13 2012-05-08 CGI-alapú rendszerek sebezhetőségének javítása.
5.3.14 2012-06-06 Számos biztonsági és hibajavítás.
5.3.15 2012-07-19 Számos biztonsági és hibajavítás.
5.3.16 2012-08-16 Számos hibajavítás.
5.3.17 2012-09-13 Számos hibajavítás.
5.3.18 2012-10-18 Számos hibajavítás.
5.3.19 2012-11-22 Hibajavítások listája.
5.3.20 2012-12-20 Hibajavítások listája.
5.3.21 2013-01-17 Hibajavítások listája.
5.3.22 2013-02-21 Hibajavítások listája.
5.3.23 2013-03-14 Hibajavítások listája.
5.3.24 2013-04-11 Hibajavítások listája.
5.3.25 2013-05-09 Hibajavítások listája.
5.3.26 2013-06-06 Hibajavítások listája.
5.3.27 2013-07-11 Hibajavítások listája.
5.3.28 2013-12-12 Hibajavítások listája.
5.3.29 2014-08-14 Hibajavítások listája.
5.4.0 2012-03-01 Eltávolított elemek: register_globals, safe_mode, allow_call_time_pass_reference, session_register(), session_unregister() és session_is_registered().[52] Továbbá számos fejlesztés a meglévő funkcionalitáson.
5.4.1 2012-04-26 Számos biztonsági és hibajavítás.
5.4.3 2012-05-08 CGI-alapú rendszerek és az apache_request_header() buffer túlcsordulásos sebezhetőségének javítása.
5.4.4 2012-06-06 Számos biztonsági és hibajavítás.
5.4.5 2012-07-19 Számos biztonsági és hibajavítás.
5.4.6 2012-08-16 Hibajavítások listája.
5.4.7 2012-09-13 Hibajavítások listája.
5.4.8 2012-10-18 Hibajavítások listája.
5.4.9 2012-11-22 Hibajavítások listája.
5.4.10 2012-12-20 Hibajavítások listája.
5.4.11 2013-01-17 Hibajavítások listája.
5.4.12 2013-02-21 Hibajavítások listája.
5.4.13 2013-03-14 Hibajavítások listája.
5.4.14 2013-04-11 Hibajavítások listája.
5.4.15 2013-05-09 Hibajavítások listája.
5.4.16 2013-06-06 Hibajavítások listája.
5.4.17 2013-07-04 Hibajavítások listája.
5.4.18 2013-08-15 Hibajavítások listája.
5.4.19 2013-08-22 Hibajavítások listája.
5.4.20 2013-09-19 Hibajavítások listája.
5.4.21 2013-10-17 Hibajavítások listája.
5.4.22 2013-11-14 Hibajavítások listája.
5.4.23 2013-12-12 Hibajavítások listája.
5.4.24 2014-01-09 Hibajavítások listája.
5.4.25 2014-02-06 Hibajavítások listája.
5.4.26 2014-03-06 Hibajavítások listája.
5.4.27 2014-04-03 Hibajavítások listája.
5.4.28 2014-05-01 Hibajavítások listája.
5.4.29 2014-05-29 Hibajavítások listája.
5.4.30 2014-06-26 Hibajavítások listája.
5.4.31 2014-07-24 Hibajavítások listája.
5.4.32 2014-08-21 Hibajavítások listája.
5.5.0 2013-06-20 Hibajavítások listája.
5.5.1 2013-07-18 Hibajavítások listája.
5.5.2 2013-08-15 Hibajavítások listája.
5.5.3 2013-08-22 Hibajavítások listája.
5.5.4 2013-09-19 Hibajavítások listája.
5.5.5 2013-10-17 Hibajavítások listája.
5.5.6 2013-11-14 Hibajavítások listája.
5.5.7 2013-12-12 Hibajavítások listája.
5.5.16 2014-08-22 Hibajavítások listája.
5.6.0 2014-08-28 újdonságok listája.
5.6.1 2014-10-02 Hibajavítások listája.
5.6.2 2014-10-16 Hibajavítások listája.
5.6.3 2014-11-13 Hibajavítások listája.

2011 június 28-án a PHP Group új kiadási ciklusokat jelentett be.[53] Eszerint minden hónapban megjelenik legalább egy új kisebb kiadás. Ezek mindegyikét két évig támogatják, és még egy évig elérhetők hozzájuk biztonsági frissítések. Évente egyszer egy újabb, nagyobb kiadással jelentkeznek, ami új eszközöket tartalmaz. Ezeket az új eszközöket nem vezetik be a többi kiadásba.

Biztonság[szerkesztés | forrásszöveg szerkesztése]

A programok sebezhetősége abból adódik, hogy a programozó nem tartja be a legfőbb biztonsági előírásokat; maga a nyelv és programkönyvtárai csak kis részben felelős ezért (2008-ban 23 ilyen hibát ismertek fel, ami az összes hiba 1 százaléka).[54][55] Egyes nyelvek külön ellenőrzik is a programozók biztonságot veszélyeztető hibáit. A PHP-hoz is készült ilyen eszköz,[56] de egyik kiadásba sem került bele.[57][58] Viszont léteznek már magasabb szintű biztonsági eszközök, mint a Suhosin és a Hardening-Patch, speciálisan a webes környezet számára.[59] A PHPIDS minden PHP alkalmazást képes ellenőrizni, és számos szolgáltatással rendelkezik.[60]

Szintaxis[szerkesztés | forrásszöveg szerkesztése]

A klasszikus "Helló világ".

<?php
 echo "<p>"; // egy bekezdés
 echo "Helló világ!"; // szöveg
 echo "</p>"; // záró tag
?>

A PHP utasításokat mindig egy meghatározott karaktersorral kell kezdeni és bezárni; ezek választják el a PHP kódot a program többi részétől, beleértve a HTML kódokat is.[61] Sok hibát kizárhatunk, ha programjainkban a "<?php" nyitó és a "?>" záró karaktersorokat használjuk. Ugyanis az érvényes nyitó és záró elemek a php.ini konfigurációs fájlban vannak deklarálva, amik szerverenként eltérhetnek egymástól, így előfordulhat, hogy egy szerveren nem értelmezi az interpreter a php programunkat, hanem közvetlenül a kimenetre küldi a forráskódot.[62]

A <?php és ?> jelölések XHTML-ben és XML-ben is jól formált tagek.[63] Eszerint a PHP nyelvvel kevert leírókódok maguk is jól formált XML kifejezések. A <? ?> jelölés különösen ellenjavallt, ugyanis az XML dokumentumok nyitó és záró tagja is hasonló, így egy include-olt (beágyazott) xml dokumentumot is forráskódnak értelmezne az interpreter. Ezek a következőképpen alakulhatnak:

karaktersorozat megjegyzés
<? ?>
ha a php.ini-ben be van kapcsolva az short_open_tag
<?php ?>
javasolt forma
<script language="PHP"> </script>
csak ha a php.ini-ben az asp_tags bekapcsolt állapotban van
<?=$valtozo?>
speciális eset, nem javasolt a használata, a
<?php echo $valtozo; ?>
kódrészletnek felel meg
<% %>
csak ha a php.ini-ben az asp_tags bekapcsolt állapotban van

PHP "Helló világ" változókkal:

<?php
$hellovilag ='Helló világ!';
print $hellovilag;
?>

Minden változó azonosítója a $ jellel kezdődik:

$valtozo="béka";
echo $valtozo;

Kivételt képeznek ez alól a konstansok

define("KONSTANS","123456");
echo KONSTANS;

Fontos megemlíteni, hogy PHP-ben string típus jelölésénél az aposztrófban ( ' ' ) és az idézőjelben ( " " ) lévő karaktersorozat más-más jelentéssel bír. Az idézőjelek közé zárt szöveg esetében az értelmező a szövegben a here dokumentumokhoz hasonlóan beszúrt változókat is keres ( ezért a kiértékelése minimálisan ugyan, de lassabb), ugyanakkor aposztróffal jelölt string típusnál ez nem valósul meg.[64]

<?php
$valtozo = 'szöveg';
$valtozo1 = 'példa $valtozo';
$valtozo2 = "példa $valtozo";
echo $valtozo1,'<br />',$valtozo2;
?>

Az eredmény pedig :

példa $valtozo
példa szöveg

A tömb indexelése – hasonlóan más C alapú nyelvekhez – 0-tól kezdődik, tehát a $tomb[1] eleme valójában a tömb 2. eleme.

A legegyszerűbb utasítás a már említett 'echo' nyelvi struktúra, vagy a visszatérési értékkel rendelkező 'print'. Ennek segítségével lehet kihasználni igazán a php-t: közvetlenül lehet írni a készülő HTML dokumentumba, akár formázott szöveget is. Az eredmény:

 <p>Helló világ!</p>

Figyeljük meg, hogy az utasításokat pontosvessző (;) zárja, hasonlóan például a C nyelvhez.[65] A nyelv sokat merített a Perlből, a C++-ból és a Javából, például az if feltételes utasítást, a for és a while ciklusokat. Az osztályok megalkotása a C++-t, az absztrakt osztályok és az öröklődés megvalósítása a Javát idézi.

Adattípusok[szerkesztés | forrásszöveg szerkesztése]

A PHP az egész számokat platformfüggő tartományban tárolja. Ez a tartomány 64 vagy 32 bites előjeles ábrázolás, ami megfeleltethető a C long típusának. Eltérően más programnyelvektől bizonyos esetekben az előjel nélküli számok is előjelessé konvertálódnak.[66] Egész változók értékadásánál használható az előjeles decimális, oktális és hexadecimális jelölés is.

A lebegőpontos számok tárolási tartománya szintén platformfüggő, megadhatóak lebegőpontosan és kétféle tudományos jelöléssel is.[67]

A PHP rendelkezik egy saját boolean adattípussal, ami hasonlít a Java és a C++ boolean típusaira. A boolean típusba konvertáláskor a Perl és C++ nyelvekhez hasonlóan a nullától különböző értékek true értékké konvertálódnak, a nulla értékek pedig false értékké.[67]

A null adattípus az érték nélküli változókat reprezentálja. A null típus egyetlen lehetséges értéke a NULL.[67]

A "resource" típusú változók külső erőforrásokra hivatkoznak. Ezeket általában egyes kiterjesztések függvényei adják vissza és általában csak ugyanazon kiterjesztés függvényei tudják kezelni; ilyen típusúak a file, az image és a database erőforrások.[67] A tömbök bármilyen PHP típusú elemeket tárolhatnak, beleértve erőforrásokat, objektumokat, sőt akár más tömböket is.

Az értékek sorrendje megőrződik a listákban és a hash-táblákban is.[67] A PHP a string adattípust is támogatja, stringeket megadni szimpla és dupla idézőjelekkel valamint az úgynevezett heredoc szintaxissal egyaránt lehet.[68]

A szabványos PHP programkönyvtár (Standard PHP Library, SPL) igyekszik megoldani a szabványos adatkezelési feladatokat és hatékony adatelérési interface-eket és osztályokat implementál.[69]

A PHP gyenge típusossága az egyik leggyakoribb hibaforrás, mivel a nyelvre jellemző az ún. Type Juggling ami lehetővé teszi, hogy a változó típusát a környezete határozza melyben használjuk.

<?php
$foo = "0"; // $foo változó string típust vesz fel
$foo += 2; // a $foo most szám típust veszi fel
$foo = $foo + 1.3; // $foo most lebegőpontos szám típusú
$foo = 5 + "10 Little Piggies"; // $foo szám típusú
$foo = 5 + "10 Small Pigs"; // $foo szám típusú
?>

Ugyanakkor a tömbre való átalakítás jelenleg nem elérhető.

<?php
$a = 'autó'; // $a string típusú
$a[0] = 'f'; // $a még string típusú
echo $a; // futó
?>

Ugyanakkor lehetőségünk van típuskényszerítés alkalmazására:

<?php
$foo = 10; // $foo most szám típusú
$bar = (boolean) $foo; // $bar logikai típusú
?>

Függvények[szerkesztés | forrásszöveg szerkesztése]

A PHP több száz alapfüggvényt tartalmaz, a bővítésekkel több ezret. A beépített könyvtárakban levő függvények több elnevezési konvenciót követnek, de nem mindig következetesen.[70] Nincsenek párhuzamos programozást támogató függvények, de a nyelv támogatja a párhuzamosságot POSIX rendszereken.[71]

Saját függvények is definiálhatók:

function myFunction() { //deklarálja a függvény nevét, a név myFunction()
 return 'John Doe'; //visszatér a 'John Doe' értékkel
}
 
echo 'My name is ' . myFunction() . '!'; //kiírja a szöveget, és a myFunction()
 //visszatérési értékét
//a kimeneten a 'My name is John Doe!' szöveg jelenik meg (aposztófok nélkül)

A függvények nevében a PHP nem különbözteti meg a kis- és a nagybetűket. Erre figyelni kell, ez egy újabb hibaforrás.

A függvényeket nem kell prototípusozni. Definiálhatók blokkokban is, ekkor futási időben dől el, hogy a függvény létrejön-e. A függvényhívásokban kötelező kitenni a zárójelet, kivéve a paraméter nélküli konstruktorokat, amiket a new operátor hív meg.

Névtelen függvények így készíthetők:

function getAdder($x) {
 return function($y) use ($x) {
 return $x + $y;
 };
}
 
$adder = getAdder(8);
echo $adder(2); // prints "10"

Ahol a getAdder() függvény létrehoz egy környezetet az $x változóval, ami veszi az $y addíciós argumentumot, és visszaadja a hívónak. Az ilyen függvények első osztályú objektumok, vagyis tárolhatók változókban, átadhatók paraméterként más függvényeknek, és így tovább.

A goto utasítás is használható (a PHP 5.3 óta):

function lock() {
 $file = fopen('file.txt', 'r+');
 retry:
 if (!flock($file, LOCK_EX & LOCK_NB)) {
 goto retry;
 }
 fwrite($file, 'Success!');
 fclose($file);
 return 0;
}

Ha meghívják a flock() függvényt, akkor a PHP megnyit egy fájlt, és megpróbálja lockolni. A retry: címke jelöli, hogy hova térjen vissza, ha a flock() hívása sikertelen volt, és meghívódik a goto retry;. A goto használata ugyanarra a környezetre és fájlra korlátozódik.

Osztályok[szerkesztés | forrásszöveg szerkesztése]

Az osztályok nevében nincs különbség a kis- és a nagybetűk között. Az objektumorientáltságot a PHP 3 vezette be, és a PHP 4 bővítette.[2] A PHP 5-ben teljesen átstrukturálták az osztályokat.[72] A korábbi verziókban a nyelv az osztályokat típusokként kezelte;[72] ennek az volt a hátulütője, hogy értékadáskor vagy paraméterátadáskor a teljes objektum átmásolódott. Az új megközelítésben kezelőkkel hivatkozzák az objektumokat, így adódnak át.[73]

Emellett vannak már abstract és final osztályok és metódusok. Az absztrakt függvények csak a prototípusukkal vannak megadva; az absztrakt osztályokban minden metódus absztrakt; a final osztályból nem lehet leszármazni, és a final metódus nem definiálható át. A konstruktorok és a destruktorok a C++-hoz hasonlóan működnek. Az öröklés a Javára emlékeztet, mivel csak egy alaposztályból lehet származni, azonban akárhány interfész implementálható. Külön interfészek valósítják meg a kapcsolatot a futtató rendszerrel. Például az ArrayAccess interfészt imlementáló osztályok objektumai használhatók tömb szintaxissal, és az Iterator vagy IteratorAggregate interfészeket implementálókra létezik a foreach nyelvi konstrukció. Mivel nincsenek virtuális táblák, ezért a static változók hivatkozás helyett névvel kapcsolódnak fordítási időben.[73]

Ha egy új objektumot a clone szóval másolnak, akkor az értelmező keresi a __clone() metódust. Ha nincs ilyen, akkor az alapértelmezett __clone()-t hívja, ami átmásolja az objektum attributumait. Ha definiálva van a __clone() metódus, akkor az lesz a felelős az új példány attributumainak beállításáért.[74]

Példa az objektumok kezelésére:

class Person {
 public $firstName;
 public $lastName;
 
 public function __construct($firstName, $lastName = '') { //Optional parameter
 $this->firstName = $firstName;
 $this->lastName = $lastName;
 }
 
 public function greet() {
 return "Hello, my name is " . $this->firstName . " " . $this->lastName . ".";
 }
 
 public static function staticGreet($firstName, $lastName) {
 return "Hello, my name is " . $firstName . " " . $lastName . ".";
 }
}
 
$he = new Person('John', 'Smith');
$she = new Person('Sally', 'Davis');
$other = new Person('Joe');
 
echo $he->greet(); // prints "Hello, my name is John Smith."
echo '<br />';
echo $she->greet(); // prints "Hello, my name is Sally Davis."
echo '<br />';
echo $other->greet(); // prints "Hello, my name is Joe ."
echo '<br />';
echo Person::staticGreet('Jane', 'Doe'); // prints "Hello, my name is Jane Doe."

Láthatóság[szerkesztés | forrásszöveg szerkesztése]

A PHP 5-ben a láthatóság is szabályozható a private és a protected kulcsszavakkal. Ha csak var van, akkor a public az alapértelmezett. A publicnak deklarált attributumok és metódusok akárhonnan hozzá férhetők; a protected adattagok csak az osztályból és a leszármazottakból láthatók; a private-nak deklarált adattagok csak magából az osztályből érhetők el. A láthatóság szabályozása osztályszintű, például két különböző, de azonos osztályú objektum hozzáfér egymás összes adattagjához.[75]

Kiterjesztések[szerkesztés | forrásszöveg szerkesztése]

Más a PHP magja is sok szabad és nyílt forrású könyvtárat tartalmaz. Mivel a PHP internetközpontú, ezért vannak moduljai a FTP szerverek elérésére, adatbázisok használatára; rendelkezik beágyazott SQL programkönyvtárakkal, melyekkel egyaránt használható PostgreSQL, MySQL és SQLite; van benne lehetőség LDAP szerverek kezelésére, és még más hasonló funkciók. Sok függvény ismerős lehet a C-ből, mint például a stdio függvénycsalád.[76]

A PHP licence megengedi a bővítést. Ezek a bővítések C-ből PHP-ra fordíthatók, vagy dinamikusan, futásidőben betölthetők. Ilyen kiterjesztések támogatják a Windows API-t, vezérlik a folyamatokat Unix rendszereken, támogatják a Unicode-ot, a cURL-t, és többféle tömörítési módot. Vannak szokatlanabb lehetőségek is, mint az Internet Relay Chat használata, a dinamikus Adobe Flash- és képgenerálás, a beszédszintézis. A kiterjesztéseket a PHP Extension Community Library (PECL) gondozza.[77]

A Zend külön képesítő vizsgát nyújt a PHP-fejlesztésre.

Kritika[szerkesztés | forrásszöveg szerkesztése]

A PHP kritikusai rámutatnak a következetlenségekre. Hasonló szerepű függvényeknek egészen más a nevük, és paraméterlistáik sem teljesen azonosak. Az objektumorientáltság ellenére a legtöbb szabványos könyvtár még mindig csak procedurális elemekből áll. A párhuzamosságot nem támogatja, és egyes modulok nem szálbiztosak. Továbbá a nyelvnek nincs saját bájtkód-cache, erről külön kell gondoskodni, különben minden híváskor újra és újra le kell fordulnia a kódnak.

Módszertan[szerkesztés | forrásszöveg szerkesztése]

A gyenge típusosság a nyelv felépítésének része, de hibaforrás lehet. Például, ha számot karakterlánccal hasonlítunk össze, akkor figyelmeztetés nélkül implicit konvertálódnak a változóink, ami nem várt következményekkel járhat. További hibákhoz vezethet a tömbök és az asszociatív tömbök közötti különbségtétel hiánya. Emellett a változók deklarálása nem kötelező; a PHP a változók számára mindig első használatukkor foglalja le a helyet. Emiatt meg vagyunk fosztva egy egyszerű hibaellenőrző módszertől, és az elírások váratlan hibákhoz vezetnek. Ez a probléma megoldható a Perl use strict;-jéhez vagy a Fortran IMPLICIT NONE-jához hasonlóan az E_STRICT direktívával.[78]

Webes problémák[szerkesztés | forrásszöveg szerkesztése]

A globális változók és a nem biztonságos szerverbeállítások kaput nyitottak olyan szkripteknek, amelyek URL-paramétereket tartalmaznak. A PHP-kézikönyv azt ajánlja, hogy kapcsoljuk ki a globális változókat a PHP konfigurációjában a register_globals=off beállításával. A PHP 4.2 óta ez volt az alapértelmezés; a PHP 5.3 elavultnak jelölte meg, és az 5.4-ből ki is vették a globális változókat.[79] Általában, minden változót először inicializálni kell.[80]

További (nem PHP specifikus) veszélyt jelentenek a webes alkalmazások számára az SQL-adattárak biztonsági hiányosságai és a nem biztonságos adatok biztonságosnak való elfogadása. Ennek kivédésére a különféle protokollokon keresztül kapott adatokat gondosan meg kell vizsgálni és át kell szűrni.[80][81]

Jegyzetek[szerkesztés | forrásszöveg szerkesztése]

  1. ^ a b Introduction: What can PHP do?. PHP Manual. (Hozzáférés: 2009. március 5.)
  2. ^ a b c d e f g h i j History of PHP and related projects. The PHP Group. (Hozzáférés: 2008. február 25.)
  3. GPL-Incompatible, Free Software Licenses. Various Licenses and Comments about Them. Free Software Foundation. (Hozzáférés: 2012. március 11.)
  4. History of PHP. php.net
  5. PHP Manual: Preface, www.php.net
  6. PHP.net General FAQ
  7. Usage Stats for April 2007. (Hozzáférés: 2008. július 7.)
  8. Lerdorf, Rasmus (1995. június 8.). "Announce: Personal Home Page Tools (PHP Tools)". comp.infosystems.www.authoring.cgi. (Web link). Hozzáférés: 2006. szeptember 17..
  9. Lerdorf, Rasmus: PHP on Hormones (mp3). The Conversations Network, 2007. április 26. (Hozzáférés: 2009. június 22.)
  10. Trachtenberg, Adam: Why PHP 5 Rocks!. O'Reilly, 2004. július 15. (Hozzáférés: 2008. február 22.)
  11. ^ a b php.net 2007 news archive. The PHP Group, 2007. július 13. (Hozzáférés: 2008. február 22.)
  12. Kerner, Sean Michael: PHP 4 is Dead—Long Live PHP 5. InternetNews, 2008. február 1. (Hozzáférés: 2008. március 16.)
  13. Late Static Binding in PHP. Digital Sandwich, 2006. február 23. (Hozzáférés: 2008. március 25.)
  14. Static Keyword. The PHP Group. (Hozzáférés: 2008. március 25.)
  15. PHP 6. The PHP project. (Hozzáférés: 2010. március 27.)
  16. Using Register Globals. PHP. (Hozzáférés: 2008. április 4.)
  17. Prepare for PHP 6. CorePHP, 2005. november 23. (Hozzáférés: 2008. március 24.)
  18. PHP 5.3 migration guide. The PHP project. (Hozzáférés: 2009. július 3.)
  19. GoPHP5
  20. GoPHP5: PHP projects join forces to Go PHP 5 (PDF). GoPHP5 Press Release. (Hozzáférés: 2008. február 23.)
  21. GoPHP5. GoPHP5. (Hozzáférés: 2008. február 22.)
  22. Unicode. The PHP Group. (Hozzáférés: 2008. március 25.)
  23. Byfield, Bruce: Upcoming PHP release will offer Unicode support. linux.com, 2007. február 28. (Hozzáférés: 2009. június 23.)
  24. The PHP Group: PHP For Windows snapshots. PHP Windows Development Team. (Hozzáférés: 2009. május 25.)
  25. The PHP License, version 3.01. (Hozzáférés: 2010. május 20.)
  26. GPL-Incompatible, Free Software Licenses. Various Licenses and Comments about Them. Free Software Foundation. (Hozzáférés: 2011. január 3.)
  27. PHP Manual Image Processing and GD;. php.net. (Hozzáférés: 2011. április 9.)
  28. ^ a b JavaServer Pages Technology — JavaServer Pages Comparing Methods for Server-Side Dynamic Content White Paper. Sun Microsystems. (Hozzáférés: 2008. február 25.)
  29. Sablon:WaybackSablon:Failed verification
  30. PHP and MySQL. University of Alabama. [2008. február 28-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. február 25.)
  31. PHP: PHP Usage Stats. SecuritySpace, 2007. április 1. (Hozzáférés: 2008. február 24.)
  32. Usage of server-side programming languages for websites. W3Techs, 2010. október 29. (Hozzáférés: 2010. október 29.)
  33. Manual:Installation requirements#PHP. MediaWiki, 2010. január 25. (Hozzáférés: 2010. február 26.) „PHP is the programming language in which MediaWiki is written [...]”
  34. System requirements of SilverStripe. (Hozzáférés: 2012. március 5.) „SilverStripe requires PHP 5.2+”
  35. About WordPress. (Hozzáférés: 2010. február 26.) „WordPress was [...] built on PHP”
  36. PHP and Drupal. Drupal.org. (Hozzáférés: 2010. június 13.)
  37. Moodle - About. Moodle.org. (Hozzáférés: 2009. december 20.)
  38. PHP and Facebook | Facebook. Blog.facebook.com. (Hozzáférés: 2009. július 29.)
  39. PHP and Digg. O'Reilly. (Hozzáférés: 2010. június 13.)
  40. Favre, Nicolas: A review of PHP compilers and their outputs. Technow.owlient.eu, 2010. február 16. (Hozzáférés: 2010. május 20.)
  41. How do computer languages work?. (Hozzáférés: 2009. november 4.)
  42. (Gilmore 2006, p. 43)
  43. PHP Accelerator 1.2 (page 3, Code Optimisation) (PDF). Nick Lindridge. (Hozzáférés: 2008. március 28.)
  44. eAccelerator. eaccelerator.net. (Hozzáférés: 2009. szeptember 18.)
  45. PHP Internals discussion. (Hozzáférés: 2011. július 12.)
  46. ^ a b c d e PHP: PHP 4 ChangeLog. The PHP Group, 2008. január 3. (Hozzáférés: 2008. február 22.)
  47. PHP: Using PHP from the command line - Manual:. The PHP Group. (Hozzáférés: 2009. szeptember 11.)
  48. Downloads. PHP. (Hozzáférés: 2009. július 29.)
  49. 4.4.9 Release Announcement. PHP. (Hozzáférés: 2009. július 29.)
  50. ^ a b c PHP: PHP 5 ChangeLog. The PHP Group, 2007. november 8. (Hozzáférés: 2008. február 22.)
  51. PHP manual: PDO. The PHP Group, 2011. november 15. (Hozzáférés: 2011. november 15.)
  52. Built-in web server. (Hozzáférés: 2012. március 26.)
  53. PHP: Release Process, 2011. július 23. (Hozzáférés: 2008. február 22.)
  54. Security and... Driving? (and Hiring) - Sean Coates: PHP, Web (+Beer). Sean Coates. (Hozzáférés: 2009. július 29.)
  55. Computerworlduk.com, Interview: Ivo Jansch, February 26, 2008
  56. PHP Taint Mode RFC
  57. Developer Meeting Notes, Nov. 2005
  58. Taint mode decision, November 2007
  59. Hardened-PHP Project, 2008. augusztus 15
  60. PHPIDS, 2011. február 20
  61. Your first PHP-enabled page. The PHP Group. (Hozzáférés: 2008. február 25.)
  62. PHP: Basic syntax. The PHP Group. (Hozzáférés: 2008. február 22.)
  63. Bray, Tim; et al: Processing Instructions. Extensible Markup Language (XML) 1.0 (Fifth Edition). W3C, 2008. november 26. (Hozzáférés: 2009. június 18.)
  64. Variables. The PHP Group. (Hozzáférés: 2008. március 16.)
  65. Instruction separation. The PHP Group. (Hozzáférés: 2008. március 16.)
  66. Integers in PHP, running with scissors, and portability. MySQL Performance Blog, 2007. március 27. (Hozzáférés: 2007. március 28.)
  67. ^ a b c d e Types. The PHP Group. (Hozzáférés: 2008. március 16.)
  68. Strings. The PHP Group. (Hozzáférés: 2008. március 21.)
  69. SPL - StandardPHPLibrary. PHP.net, 2009. március 16. (Hozzáférés: 2009. március 16.)
  70. Problems with PHP. (Hozzáférés: 2010. december 20.)
  71. PHP.NET: Process Control. (Hozzáférés: 2009. augusztus 6.)
  72. ^ a b PHP 5 Object References. mjtsai. (Hozzáférés: 2008. március 16.)
  73. ^ a b Classes and Objects (PHP 5). The PHP Group. (Hozzáférés: 2008. március 16.)
  74. Object cloning. The PHP Group. (Hozzáférés: 2008. március 16.)
  75. PHP: Visibility - Manual. Theserverpages.com, 2005. május 19. (Hozzáférés: 2010. augusztus 26.)
  76. PHP Function List. The PHP Group. (Hozzáférés: 2008. február 25.)
  77. Developing Custom PHP Extensions. devnewz, 2002. szeptember 9. [2008. február 18-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. február 25.)
  78. PHP-Handbuch: Option error_reporting
  79. [1] PHP Manual. PHP: Beschreibung der php.ini-Direktiven des Hozzáférés 2009 július 4.
  80. ^ a b [2] PHP Manual. PHP: Verwendung von Register Globals Hozzáférés 2009 július 4.
  81. [3] PHP Manual. PHP: Vom Nutzer übermittelte Daten Hozzáférés 2009 július 4.

További információk[szerkesztés | forrásszöveg szerkesztése]