2010. február 16., kedd

PHP 4 vs PHP 5, 1. rész

Aki PHP-val foglalkozik már megszokhatta, hogy a legtöbb projekten a host korlátai miatt nem használhatja a legújabb verziókat. Különösen igaz ez a legacy fejlesztésekre, ahol gyakran még a 4.x verziókkal kell beérni, mivel az átállás sok helyen nehezen észlelhető bugokat okozna. Az egyik ügyfelünk rendszere is részben 4.x verziójú.

A legegyszerűbben észlelhető probléma rengeteg kényelmi funkció (file_put_contents, paraméterezhető microtime és a többiek) hiánya. Ez kényelmetlen ugyan, de hamar kiküszöbölhető. Valamivel nehezebb hozzászokni az interfészek, absztrakt osztályok, láthatósági szintek és osztályszintű statikus változók hiányához.

Az egyik legkevésbé nyilvánvaló, viszont fontos változás a paraméterek átadásának módja. Az újabb verziók skalárokat és a tömböket érték, minden mást referencia szerint adnak át, míg a régiek az érték szerinti átadást használják objektumok esetén is. Ez legelőször valószínűleg Singletonok használatánál tűnik fel, egy bosszantó és nehezen észrevehető bug formájában:

class Singleton {
function getInstance() {
// PHP 4-ben ez a legegyszerűbb módja
// az instance nyilvántartásának
static $instance;
if ( !$instance ) {
$instance = new Singleton();
$instance->test = "A";
}
return $instance;
}
}
$temp = Singleton::getInstance();
$temp->test = "B";
// PHP 5 esetén B lesz, különben A.
print Singleton::getInstance()->test;

Ez a kód átalakítva, hogy régi phpban is ugyanaz legyen a végeredmény:

class Singleton {
// Jelezzük, hogy a metódus az eredményt
// referencia szerint adja vissza
function &getInstance() {
static $instance;
if ( !$instance ) {
$instance = new Singleton();
$instance->test = "A";
}
return $instance;
}
}
// A visszatérési értéket referencia szerint rendeljük változóhoz
$temp = &Singleton::getInstance();

B.J.

1 megjegyzés: