Na navigaci | Klávesové zkratky

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

Komentáře

  1. JohnyB http://www.alphanumeric.cz #1

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

    před 12 lety | reagoval [3] David Grudl
  2. johno http://johno.jsmf.net/ #2

    avatar

    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/

    před 12 lety | reagoval [3] David Grudl
  3. David Grudl http://davidgrudl.com #3

    avatar

    #1 JohnyBe, 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%

    před 12 lety | reagoval [6] llook [9] Zdeněk Bohdanecký
  4. johno http://johno.jsmf.net/ #4

    avatar

    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.

    před 12 lety | reagoval [5] David Grudl
  5. David Grudl http://davidgrudl.com #5

    avatar

    #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

    před 12 lety | reagoval [8] johno [10] johno
  6. llook http://llook.wz.cz/weblog/ #6

    avatar

    #3 Davide Grudle, 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;)

    před 12 lety | reagoval [7] David Grudl
  7. David Grudl http://davidgrudl.com #7

    avatar

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

    před 12 lety
  8. johno http://johno.jsmf.net/ #8

    avatar

    #5 Davide Grudle, PEAR práveže v pohode beží na Zend2 ale iba keď sa zapne podpora ZEND1. Mne to však doma nechce fungovať.

    před 12 lety
  9. Zdeněk Bohdanecký #9

    avatar

    #3 Davide Grudle, 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.

    před 12 lety
  10. johno http://johno.jsmf.net/ #10

    avatar

    #5 Davide Grudle, 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í.

    před 12 lety

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