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

Translate to English… Ins Deutsche übersetzen…

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

napsáno 16. 9. 2004 | shlédnuto 9396x | nahoru


Komentáře RSS 2.0 komentářů » přidat

#1 JohnyB http://www.alphanumeric.cz 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
avatar

#2 johno http://johno.jsmf.net/ 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
avatar

#3 David Grudl http://davidgrudl.com 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 [9] Zdeněk Bohdanecký
avatar

#4 johno http://johno.jsmf.net/ 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
avatar

#5 David Grudl http://davidgrudl.com 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 [10] johno
avatar

#6 llook http://llook.wz.cz/weblog/ 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
avatar

#7 David Grudl http://davidgrudl.com 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
avatar

#8 johno http://johno.jsmf.net/ 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
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
avatar

#10 johno http://johno.jsmf.net/ 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.

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

phpFashion © 2004, 2012 David Grudlo webu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

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