PHP4 vs. PHP5

PHP5 je z téměř plně zpětně kompatibilní s novějšími verzemi PHP4, drtivá většina stávajících aplikací (pokud byly tyto psány alespoň v částečném souladu se základními pravidly návrhu aplikací v PHP) tedy bude fungovat bez jakýchkoli zásahů dál. Přesto však došlo v nové verzi k několika úpravám, jejichž (částečný) přehled dále uvádíme. Detailnější informace je možno nalézt v "Dodatku D" manuálu PHP.

Hlavní část změn má ráz rozšíření funkčnosti, hlavně směrem k objektově orientovanému programování. Jedná se hned o několik zásadních přírůstků:
  1. PHP5 obsahuje zcela nový objektový model, který přináší možnost plnohodnotného OO návrhu včetně abstraktních rozhraní (tak, jak jej známe třeba z Javy).
  2. Nová je i podpora pro strukturované ošetřování výjimek (SEH) způsobem běžným v jiných jazycích, tedy pomocí try...throw...catch.
  3. Další neméně důležité zlepšení se týká plně objektové podpory zpracování XML dokumentů pomocí standardního rozhraní DOM a jejich rychlé XSLT transformace poskytované extenzí XSL (řádově rychlejší, než dosud používaný Sablotron).
  4. Změn se dočkala i podpora databází, a to zavedením objektového rozhraní MySQLi (MySQL improved) a podporou vestavěné databáze SQLite (ta programátorům přináší plnohodnotnou SQL databázi bez potřeby externího serveru, přímo na lokálních souborech).
  5. Významným (a dlouho žádaným) posunem je přidání možnosti nastavit parametrům funkce předdefinované hodnoty (tato hodnota bude použita, pokud daný parametr není funkci při volání předán). To přináší možnost snadné implementace funkcí s proměnnými počty parametrů a tím ji částečné nahrazení scházející možnosti přetěžování funkcí.
  6. Posledním rozšířením je přidání nových funkcí do stávajících extenzí, nejdůležitější jsou zřejmě funkce pro práci s poli (rekurzivní procházení, uživatelské porovnávání...) array_udiff(), array_walk_recursive() a další.
V PHP5 byla i lehce zvýšena typová bezpečnost jazyka (například funkce pro práci s poli vyvolávají varovné hlášení, pokud jim je předáno něco jiného, než pole) a odstraněno několik možných chyb v návrhu - kupříkladu funkce get_class() a spol. již nepřevádějí všechna písmena na malá a ip2long() vrací při chybě FALSE místo dřívější -1.
K tomu se váže i zavedení nové úrovně chyb E_STRICT, která povoluje zobrazení rozličných tipů a poznámek pro zvýšení přenositelnosti, kompatibility a bezpečnosti skriptů.

Drobným změnám neunikl ani kompilátor, který nyní při vkládání externích skriptů pomocí include/require importuje všechny funkce v daném souboru bez ohledu na to, kde v souboru jsou (pokud je jeho vykonávání předčasně přerušeno například pomocí return). Navíc je nově generováno chybové hlášení, pokud je tentýž soubor vložen několikrát (tomuto se lze vyhnout použitím include_once/require_once).

Objekty (instance tříd) jako parametry funkcí se nově předávají odkazem, ne hodnotou; funkce tedy může změnit objekt, který jí byl předán jako parametr (nepracuje se svou lokální kopií, jako je tomu u primitivních typů - čísel, řetězců...). Hlavním smyslem tohoto postupu je velký nárůst výkonu PHP (nemusí docházet ke kopírování celé instance při každém volání funkce).

Nový objektový model a strukturované ošetřování výjimek si vyžádal rezervaci těchto nových klíčových slov:
abstract
catch
clone
extends
final
implements
interface
php_user_filter
private
protected
public
this
throw
try