Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

porucha není na vašem přijímači

Kompatibilita PHP 4 a 5: pišme funkční skripty

PHP 4->5 Už je to nějaký pátek, co jazyk PHP vyzrál do své páté verze. Zatímco zvyšování čísla verze za tečkou doprovází většinou jen vývoj knihoven (přidávání funkcí, přidávání chyb, odstraňování chyb), číslo před tečkou znamená úpravy v samotném jazyce. Vaše skripty proto nemusí v nové verzi fungovat. V horším případě mohou nadělat pěknou paseku.

Paní hostingská má pětky

Spousta provozovatelů hostingu zareagovalo na novou verzi PHP rychle a už se Pětkou pyšní. Ovšem spousta neznamená většina, tudíž tvoříte-li aplikaci, která má fungovat kdekoliv (například blogovací systém), na vymoženosti páté verze zatím zapomeňte. Ne však na PHP5 jako takové. Je totiž třeba začít myslet na dopřednou kompatibilitu. Aby vše, co dnes napíšete v PHP4, fungovalo bez problémů v PHP5.

Nepodléhejte iluzi, že pouhé spuštění starších skriptů v Pětce stačí k ověření kompatibility. Kdepak. Některé změny totiž povedou ke vzniku těch nejhůře odhalitelných chyb, takže i zdánlivá funkčnost může být jen příjemnou iluzí. Vlastně by bylo vhodné poprosit peněženku o $299 a koupit nadupaný debugger.

Rozdíly

Podrobný popis toho, jak se obě verze liší, najdete v článku Changes in PHP 5/Zend Engine II. Určitě si přečtěte také Zend Engine II: Feature Overview and Design (PDF). Vládnete-li jazykem anglickým psaným, shledáte tuto studnici informací přínosnou tuze. V opačném případě se račte chytnout stébla La Trine :-)

Ačkoliv výčet změň je pekelně dlouhý, při podrobnějším pohledu zjistíte, že jde většinou jen o rozšíření jazyka. Tedy nová klíčová slova a nové konstrukce. A tím pádem jen minimální problém s kompatibilitou. Jistě, pětkový skript využívající těchto „featurek“ ve čtverce nerozchodíte, ale máme namířeno opačným směrem. Takže, aby Vaše aplikace byla kompatibilní s pětkovými rozšířeními, stačí nepoužívat nová klíčová slova. Tedy funkcím, objektům a metodám nedávejte názvy public, protected, private, abstract, interface, implements, final, const, catch, throw, try, static, instanceof. V případě metod je třeba také opatrně nakládat s názvy __clone(), __construct(), __destruct(), __autoload(), __call(), __get(), __set() a __toString(). V Pětce totiž mají specifický význam a ten je třeba respektovat. Ze záliby autorů PHP ve dvojpodtržítkových prefixech lze odvodit radu: nikdy tento prefix nepoužívejte pro vlastní metody.

Ostatní povídání se už bude týkat jen OOP. Pokud nejste objektový programátor, není třeba dál číst. Místo toho si hned utíkejte koupit nějakou krásnou knihu o OOP a naučte se to!

Změny v OOP

Jak jsem se již zmínil, samotná rozšíření objektového modelu nebudou překážet dopředné kompatibilitě. Dokonce už ve čtverce můžete začít používat nové konstrukce, které v budoucnu přechod usnadní. Jeden příklad:

Pětka používá pro konstruktor unifikovaný název __construct, zatímco ve čtverce jím je metoda mající stejný název jako třída. Což je nešťastné, zvlášť když chcete třídu přejmenovat nebo když voláte rodičovský konstruktor. Podívejte se na způsob, jak vytvářet v PHP4 dopředně kompatibilní konstruktory:

class Foo {

  // toto je konstruktor pro verzi 5
  function __construct($value) {
    echo $value;
  }

  // zajistí volání konstruktoru ve verzi 4
  // ve verzi 5 je možno odstranit
  function Foo($value) {
    $this->__construct($value);
  }

}

Principem této konstrukce je vlastně vytvoření jakéhosi mostu mezi Čtverkou a Pětkou, díky kterému je možné dále využívat pětkové postupy. Takto může vypadat potomek třídy, využívající výhod této konstrukce:

class Bar extends Foo {

  // toto je konstruktor pro verzi 5
  function __construct($value) {

    $value = $value * 2;

    // volá rodičovský konstruktor způsobem,
    // který používá verze 5
    parent::__construct($value);
  }


  // function Bar() již není třeba
}

Vymyslíte další podobná přemostění?

Object (ne)cloning

Konečně se dostáváme k nejdramatičtější změně v PHP. Tou je nový způsob manipulace s objekty a především předávání objektů funkcím. Ve verzi 4 je objekt víc chápán jako obyčejná datová struktura (například jako řetězec nebo pole). Pokud mám v proměnné $a uloženu instanci objektu a provedu přiřazení $b = $a, dojde k jejímu zkopírování. Tedy mám instance dvě. Změním-li první instanci vlastnost $a->value = 10, NEdojde ke změně vlastnosti $b->value.

V pětce se však objekty chovají jinak. Příkaz $b = $a instance nezkopíruje! Předá jen reference, tedy totéž, jako bychom použili $b = & $a. Takže po změně vlastnosti $a->value = 10 bude mít $b->value taktéž hodnotu 10.

Je třeba si říct dvě věci: nový způsob předávání referencí je skutečně přínosem a řeší spoustu problémů. Nejde o zvůli autorů PHP. A ta druhá věc: povídání o strastech a dopředné kompatibilitě, které s tímto souvisí, bude docela dlouhé. Proto udělám v tomto okamžiku přestávku a pokračování příště.

Karma body: 30. Líbil se vám článek?

Komentáře » přidat

  1. [1] JohnyB: nový

    „nepoužívat nový klíčové slova“ ;) wow.

    Posláno 16. 9. 2004 ve 20.42 | Odpovědět
    Na komentář reagoval [3] David Grudl
  2. avatar [2] johno: nový

    No ja som to síce neskúšal, ale keď fakt neklamú tak debbuger môže byť aj ten čo je pre http://phpeclipse.de/

    Posláno 16. 9. 2004 ve 20.48 | Odpovědět
    Na komentář reagoval [3] David Grudl
  3. avatar [3] David Grudl: nový

    [1] JohnyB: překlep v jednom písmenku (nový / nové) je důvodem k takové radosti? :-)

    [2] johno: Díky za tip, to vypadá velice dobře. NuSphere PHPEd mám zatím ve zkušební verzi a celkem mě uchvátil (narozdíl od Zend Studia), těch $299 jsem byl rozhodnut obětovat. Ale pokud se ukáže PHPEclipse srovnatelné…

    OT: nekupujte software na e-shopech výrobců, ale napište jim email, že uvažujete o přechodu z jiného systému na jejich, jestli Vám nabídnou slevu. Často se dá ukecat i 30%

    Posláno 16. 9. 2004 ve 21.15 | Odpovědět
    Na komentář reagoval [6] llook
    Na komentář reagoval [9] Zdeněk Bohdanecký
  4. avatar [4] johno: nový

    Na celom PHP5 sa štve asi toľko, že sa mi doma na Windowsoch nemôže ani za svet podariť rozbehať ZEND1 backward compatible mód a prepisovať všetky knižnice v rátane PEAR::DB sa mi naozaj ale naozaj nechce.

    PS. Tak tuším treba odladiť tie regexpy na smajlíky.

    Posláno 16. 9. 2004 ve 22.24 | Odpovědět
    Na komentář reagoval [5] David Grudl
  5. avatar [5] David Grudl: nový

    [4] johno: Především knihovny PEAR::DB měly být psány tak, aby respektovali Zend2 (PHP5). Vědělo se o něm už v roce 2002, že…

    Ještě jeden tip: php4 i 5 na jednom Apache

    Posláno 17. 9. 2004 v 10.51 | Odpovědět
    Na komentář reagoval [8] johno
    Na komentář reagoval [10] johno
  6. avatar [6] llook: nový

    [3] David Grudl: on to není překlep v jediném písmenku. Správně by to totiž mělo být „nová klíčová slova“ podle vzoru město. Takže překlep ve dvou písmenkách;)

    Posláno 17. 9. 2004 v 15.03 | Odpovědět
    Na komentář reagoval [7] David Grudl
  7. avatar [7] David Grudl: nový

    [6] llook: nojo, je to tak :-) … a rovnou změním i titulek článku, ať je víc k věci

    Posláno 17. 9. 2004 v 16.04 | Odpovědět
  8. avatar [8] johno: nový

    [5] David Grudl: PEAR práveže v pohode beží na Zend2 ale iba keď sa zapne podpora ZEND1. Mne to však doma nechce fungovať.

    Posláno 19. 9. 2004 v 17.22 | Odpovědět
  9. avatar [9] Zdeněk Bohdanecký: nový

    [3] David Grudl: Také uvažuji o profi editoru. Před rokem jsem zkoušel Nusphere PHPed a Activestate Komodo. Každý má nějaké výhody a nevýhody. Asi se letos podívám znovu, který z nich by byl lepším kompromisem. Myslím, že Nusphere ma lepší debugger, ale Komodo umělo zabalovat větve kódu v editoru, což je dobrá fce a také podporuje ladění XSLT šablon. K PHPedu ale bylo možné přikoupit druhou licenci jen za 50 USD.

    Posláno 20. 9. 2004 ve 12.30 | Odpovědět
  10. avatar [10] johno: nový

    [5] David Grudl: No neviem čo som spravil ale každopádne mi to už funguje. Keď nepomôže jeden reboot tak asi pomôže až druhý alebo tretí.

    Posláno 20. 9. 2004 v 18.56 | Odpovědět

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

La Trine © 2004, 2008 David Grudl – o webu
provozuje Pachollini.

Jakékoliv užití obsahu, včetně převzetí článků nebo jejich částí, je bez předchozího písemného svolení autora zakázáno.

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.