Kompatibilita PHP 4 a 5: pišme funkční skripty
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
JohnyB #1
„nepoužívat nový klíčové slova“ ;) wow.
johno #2
No ja som to síce neskúšal, ale keď fakt neklamú tak debbuger môže byť aj ten čo je pre https://web.archive.org/…lipse.de:80/
David Grudl #3
#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%
johno #4
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.
David Grudl #5
#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
llook #6
#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;)
David Grudl #7
#6 llooku, nojo, je to tak 🙂 … a rovnou změním i titulek článku, ať je víc k věci
johno #8
#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ť.
Zdeněk Bohdanecký #9
#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.
johno #10
#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í.
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.