PHP

A PHP egy á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 feldolgozómodulja értelmezi, ezzel dinamikus weboldalakat hozva létre. Rasmus Lerdorf 1995-ben indította útjára. Ma a The PHP Group tartja fenn és fejleszti. A PHP szabad szoftver, de licence nem csereszabatos a GNU licenccel, mivel megkötéseket tartalmaz a PHP név használatára.

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. A rövidítés jelentése később PHP: Hypertext Preprocessor lett, így rekurzívvá vált. 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.

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.

Története 
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. 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.

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. 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. 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.

A Zend Engine 1.0 által hajtott PHP 4 2000. május 4-én jelent meg. 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. 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.  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, a speciális karakterek backslash-es escape-elése, és a biztonságos mód. 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.

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.

Jelenleg a PHP 7 főverzió a nyelv egyetlen aktívan fejlesztett verziója, a még támogatott legrégebbi verziója a 7.1-es.

Léteznek PHP értelmezők 32 és 64 bites platformokra is. Microsoft Windowsra csak egy 32 bites disztribúció létezik, ami miatt még szükséges az Internet Information Services (IIS) 64 bites rendszerein a 32-bit-támogatás. A korábban már létezett kísérleti 64 bites PHP 5.3.0-értelmezőt visszavonták.

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. Emiatt a PHP licenc nem csereszabatos a GNU General Public License-szel.

A PHP működése 

A PHP oldalak elkészítésénél a HTML-t gyakorlatilag csak mint formázást használják. 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 kliensoldalról nem látható a programkód. A feldolgozáshoz egy ún. interpretert (értelmezőt) használ, amely általában a webszerver egy külső modulja. Ebben hasonlít más szerver oldali szkript nyelvekre, mint a Microsoft ASP.NET-je, a Sun Microsystems JavaServer Pages, és a mod_perl. Az 5.4-es verzió óta a nyelv tartalmaz egy egyszerű, parancssorban beállítható webszervert.

A PHP nyelv lényegében  a HTML nagymértékű kiegészítése. Rengeteg olyan feladat végezhető el vele, amelyre az ügyféloldali szkriptek nem képesek (vagy ha igen, korlátozottan). Ilyenek 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ütt, ahol sokszor ismétlődő lépésekből álló feladatsort kell végrehajtani (például képek listázása és linkelése, listakészítés stb.), ez a programnyelv nagyszerű segítség. Alapvetően szűrőként működik, ami egy bemeneti fájlból egy kimeneti fájlt állít elő. A PHP 4 óta a parser lefordítja a kódot, hogy a Zend motor lefuttathassa azt.

Sok különböző platform használja, és relációs adatbázisok kezelésére 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ű rendre a Linux, az Apache HTTP Server és a MySQL rövidítése. Hasonló csomagok más operációs rendszerekre is elérhetők: a WAMP Windows, a MAMP pedig Mac OS X rendszerre. Az XAMPP is ilyen, platformfüggetlen szoftvercsomag.

2007 áprilisában több, mint 20 millió internetes tartomány mögött futott PHP alkalmazás, és a mod_php lett a legnépszerűbb Apache HTTP Server modul. A webszerverek 75%-án használtak PHP-t. Több tartalomkezelőt is PHP-ben írtak. Ilyenek a MediaWiki, a Joomla!, az eZ Publish, a SilverStripe, a WordPress, a Drupal és a Moodle. Minden olyan weboldal, amit ezekkel hoztak létre, PHP-ben íródott; így a Wikipédia, a Facebook, és a Digg felhasználói felülete is.

Egyéb futási módok 
A PHP programok futhatnak közönséges programként is. (Tehát nem HTML oldalba építve). Ezt a lehetőséget azonban ritkán használják ki. Ha mégis, sokszor weblapokkal kapcsolatos időzített folyamatok megvalósításához alkalmazzák, mivel azok azonos programnyelven, azonos megközelítési módon hajthatók végre.

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

Microsoft Windows platformra is írhatók grafikus programok PHP-ben. Ehhez több mód is adott:

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őelemeket és tervezési módszereket ajánlanak a prototípus alapú tervezéshez és fejlesztéshez. Ezek közé tartoznak a CakePHP, a Symfony, a CodeIgniter, a Yii Framework, a Nelli, és a Zend Framework, a webalkalmazások fejlesztéséhez hasonló eszközökkel.

Fordítóprogramok 
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 futás, a statikus analízis lehetősége és a más nyelvekkel való jobb együttműködés.

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. Ezek nagy része csak részleges.
Phalanger - CIL-be fordít.

Ezek a módszerek kétszeresére gyorsították a PHP-ben írott programokat.

Optimalizáció 
PHP-ban az 5.3-as verzió óta van szemétgyűjtés. A garbage collector eltakarítja azokat az objektumokat és más megjegyzett dolgokat, amikre feltehetően már nem lesz szükség. Ekkortól ehhez már nem kell Zend Optimizert installálni.

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

Vannak olyan egyedi (nem gyártó által elismert) modulok, melyek egyfajta köztes megoldást nyújtanak: nem a nyers forráskód kerül tárolásra, hanem egyfajta byte-kód. Ez csak a feldolgozás gyorsítására szolgál. Van rá hivatalos megoldás is. Ennek lényege, hogy az egyes futásokkor megvizsgálja a forrást, és ha az megváltozott, a felesleges részeket (megjegyzések, fölös blokk-kezdések, white space karakterek) kiszűrve generál egy köztes állapotot tároló állományt. Ha a kód nem változott, betölti az előbb eltárolt „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.

Az optimalizálók 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. A PHP-szkriptekben gyakran van erre lehetőség. Az eAcceleratornak van PHP kiterjesztése. Bizonyos esetekben ez a módszer nem működik, mivel a kód tartalmazhat nemfeldolgozható 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.

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

Verziók 

2011. június 28-án a PHP Group új kiadási ciklusokat jelentett be. 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. 2020.11.26-án jelent meg a PHP 8-as kiadás.

Biztonság 
A programok sebezhetősége abból adódik, hogy a programozó nem tartja be a főbb biztonsági előírásokat. Maga a nyelv és programkönyvtárai csak kis részben felelősek ezért. 2008-ban a PHP-ben 23 ilyen hibát ismertek fel, ami kb. az összes hiba 1 százaléka. 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, de egyik kiadásba sem került bele. Viszont léteznek már magasabb szintű biztonsági eszközök, mint a Suhosin és a Hardening-Patch, speciálisan a webes környezetbe. A PHPIDS minden PHP alkalmazást képes ellenőrizni, és számos szolgáltatással rendelkezik.

Szintaxis 
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.
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.

A <?php és ?> jelölések XHTML-ben és XML-ben is jól formált tagek. 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:

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 a 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 document-ekhez 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.
<?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. Ez a pontosvessző egyes esetekben (például akkor, ha az adott sort nem követi egy másik sor, vagy a kódunk egysoros), elhagyható. Ez viszont nem ajánlatos, mert ha a kódunkat szerkesztjük, és egy vagy több sorral bővítjük, akkor előfordulhat, hogy elfelejtjük kirakni a pontosvesszőt, így hibaüzenetet kapunk. Az alábbi kódok például helyesek, viszont alkalmazásuk nem célszerű.

<?php
echo "Szöveg."
?>

<?php
$valtozo = 'Szöveg';
echo $valtozo

?>
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 
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. 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.

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é.

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.

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. 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. 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.

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.

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 
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. Nincsenek párhuzamos programozást támogató függvények, de a nyelv támogatja a párhuzamosságot POSIX rendszereken.

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);    // kiírja a "10" értéket

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 
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. A PHP 5-ben teljesen átstrukturálták az osztályokat. A korábbi verziókban a nyelv az osztályokat típusokként kezelte; 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.

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 implementá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.

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 attribútumait. 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.

Példa az objektumok kezelésére:
class Person {
    public $firstName;
    public $lastName;

    public function __construct($firstName, $lastName = '') {  // konstruktor, opcionális paraméterrel
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }

    public function greet() {    // metódus
        return "Hello, my name is " . $this->firstName . " " . $this->lastName . ".";
    }

    public static function staticGreet($firstName, $lastName) {  // statikus függvény
        return "Hello, my name is " . $firstName . " " . $lastName . ".";
    }
}

$he = new Person('John', 'Smith');
$she = new Person('Sally', 'Davis');
$other = new Person('Joe');

echo $he->greet();  // kiírás: "Hello, my name is John Smith."
echo '<br />';
echo $she->greet(); // kiírás: "Hello, my name is Sally Davis."
echo '<br />';
echo $other->greet();   // kiírás: "Hello, my name is Joe ."
echo '<br />';
echo Person::staticGreet('Jane', 'Doe');    // kiírás: "Hello, my name is Jane Doe."

Láthatóság 
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 public-nak deklarált attribútumok é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.

Kiterjesztések 
Már 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.

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.

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

Kritika 
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-e, 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 
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.

Webes problémák 
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. Általában, minden változót először inicializálni kell.

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.

Jegyzetek

További információk 
 Hivatalos honlap
 Legutolsó magyar dokumentáció (2007-11-25) 
 W3Schools oktatóanyag

Imperatív programozási nyelvek
Szabad szoftverek
Objektumorientált programozási nyelvek