Php Vijf Veranderingen

Uit Byte Docs

Veranderingen in PHP5

Over het algemeen kunt u stellen: uw PHP4 site draait onder PHP5 zonder dat u iets hoeft te veranderen.

Nu zijn er wel wat verschillen tussen PHP4 en PHP5 en op deze pagina zullen we proberen een lijst te maken van zaken waar we tegenaan gelopen zijn. Heeft u een probleem, kijkt u dan eerst eens hier of het antwoord er niet bijstaat. Grote kans dat het probleem hier sinds de laatste keer dat u hier keek al bijstaat!

Standaardinstellingen

Nu kunt u wel tegen een aantal problemen oplopen. Zo heeft Byte wat standaardinstellingen gewijzigd. De standaardinstellingen van PHP4 zijn vroeger niet altijd even handig gekozen, maar we kunnen dit natuurlijk niet zomaar rechtzetten. Met PHP5 gaan we uit van de meest veilige standaardinstellingen 
  • Magic_quotes_gpc staat nu aan.
  • Register_globals staat nu uit.

Variabelen

De HTTP_*_VARS ($HTTP_GET_VARS, $HTTP_POST_VARS enzovoort) variabelen zijn in PHP5 niet meer beschikbaar. In plaats daarvan moet u de korte varianten ($_GET, $_POST enzovoort) gebruiken. Hier vindt u een overzicht van de beschikbare variabelen. Als u uw script niet wilt aanpassen, kunt u in plaats daarvan ook de optie register_long_arrays aanzetten op het servicepanel.

Modules Niet alle modules die u in PHP4 gebruikte zijn nog beschikbaar onder PHP5. Dit heeft per module een verschillende reden.

Includes Gebruik in PHP5 altijd include_once() in plaats van include(). Als een bepaald bestand namelijk twee keer ge-include wordt, geeft PHP5 een fatal error, omdat functies in dat bestand al eerder gedeclareerd waren. PHP4 accepteerde dit wel. Functies in een bestand dat ge-include wordt, kunnen gebruikt worden onafhankelijk van of ze in het bestand voor of na een return statement staan.

Includes en symlinks Sinds december 2009 maakt PHP gebruik van de BSD versie van realpath. Dat houdt in dat include_once en require_once, padnamen waar symlinks in staan, niet meer als hetzelfde bestand zien als het padnaam zonder symlinks, waardoor de bovengenoemde fatal error kan optreden. Dit treedt bijvoorbeeld op bij de tgz versie van typo3. Dit is te voorkomen door de .zip versie van typ03 te gebruiken. Zie ook de typo3 documentatie

Inhoud

Object georienteerd programmeren

Een groot verschil van PHP5 ten opzichte van PHP4 is dat het objectmodel compleet herschreven is, en dat PHP5 een stuk meer object-georienteerde concepten ondersteunt dan PHP4. Voor een complete beschrijving van het nieuwe objectmodel kunt u bij php zelf terecht: http://docs.php.net/en/language.oop5.html.

Een aantal zaken die erg veranderd zijn ten opzichte van PHP4 

Pass by reference <=> Pass by value

PHP4 gebruikt de methode pass by value: bij operaties op objecten wordt het complete object gekopieerd en meegegeven aan de functie. De operatie wordt dus op de kopie uitgevoerd.

In PHP5 wordt de pass by reference methode gebruikt: een methode van een class krijgt een referentie naar het object, en voert zijn operaties uit op het object zelf en niet op een kopie.

In onderstaand voorbeeld is het verschil goed te zien (bron):

class Rabbit {
: var $alive = true;
}
 
class Viper {
 
: function bites( $animal ){
: $animal->alive = false;
: }
}
 
$aViper  = new Viper();
$aRabbit = new Rabbit();
 
$aViper->bites($aRabbit);
 
var_export($aRabbit->alive);

In PHP4 zou de uitkomst hiervan true zijn. Er is een kopie van aRabbit gemaakt, en deze kopie is doodgebeten door aViper. De originele aRabbit leeft nog. In PHP5 is echter de originele aRabbit doogebeten door aViper. De uitkomst is dus false.

Objecten vergelijken

Ook het vergelijken van objecten is verschillend ten opzichte van PHP4. Objecten kunnen op twee manieren vergeleken worden: met de comparison operator (==) en met de identity operator (===). In het eerste geval zijn 2 objecten gelijk, als ze dezelfde attributen en waardes hebben, en als ze instanties van dezelfde class zijn. In het tweede geval zijn 2 objecten gelijk, dan en slechts dan wanneer ze verwijzen naar dezelfde instantie van een class (in andere woorden: als het dezelfde handle is). Het vergelijken van objecten wordt op de site van php uitgelegd, samen met een goed voorbeeld, dat veel zal verduidelijken.

Clonen van objecten

Het clonen van objecten is ook veranderd ten opzichte van PHP4. Objecten worden alleen gecloned als daar specifiek om gevraagd wordt. In onderstaand woorbeeld wordt dat verduidelijkt.

class Byte {
: var $naam = "";
}
 
$a = new Byte;
$a->naam = 'Byte';
 
$b = $a;
$b->naam = 'Internetdiensten';
 
echo $a->naam . " " . $b->naam . "\n";

In het voorbeeld ziet u een class met 1 attribuut. Als dit door PHP4 uitgevoerd zou worden, zou met de regel $b = $a het object gekloond worden. De uitkomst zou zijn: Byte Internetdiensten. In PHP5 echter, doet de regel $b = $a niets anders dan van $b dezelfde objectreferentie maken als $a: ze wijzen beide dus naar hetzelfde object. In dat geval bestaat er dus nog steeds maar 1 object met 1 attribuut. De uitkomst onder PHP5 is dan ook Internetdiensten Internetdiensten. Wilt u in zo'n geval onder PHP5 dezelfde werking als onder PHP4, dan dient u het keyword clone te gebruiken. Voor PHP5 dient

$b = $a;

vervangen te worden door

$b = clone $a;

De uitkomst is dan Byte Internetdiensten.

Cloning wordt uitgebreider toegelicht in de OO-referentie van PHP.

Constructor

In PHP4 was u waarschijnlijk gewend om een constructor voor een class te maken, door een methode te maken met dezelfde naam als de class. In PHP5 is dat niet meer nodig. Indien de class een constructor nodig heeft kunt hier de methode __construct() voor gebruiken: deze wordt standaard aangeroepen bij instantiatie van een class. Voor backwards compatibility kunt u wel gebruik blijven maken van uw oude classes: als PHP5 geen __construct() methode vindt, zal het zoeken naar een constructor in oude stijl: een methode met dezelfde naam als de class. De enige manier waarop u in de problemen zou kunnen komen is als uw oude class al een methode __construct() had, die een andere taak uitvoerde. Bron.

Compatibility Mode

Om onder PHP5 toch gebruik te blijven kunnen maken van de manier waarop PHP4 omgaat met het clonen, casten en vergelijken van objecten, kunt u de zend.ze1_compatibility_mode gebruiken. Bij Byte staat deze standaard uit, maar u kunt het zelf aanzetten. Neem hiervoor in elke file die in in compatibility mode wilt draaien het volgende op:

ini_set('zend.ze1_compatibility_mode', '1');

Losse opmerkingen

  • $this mag geen waarde meer aan toegekend worden. $this verwijst altijd naar de instantie van de huidige class.
  • Let op met empty() en objecten:
class Test { }
$t = new Test(); 
var_dump( empty($t) );

in PHP4: bool(true) in PHP5: bool(false)

Nog niemand heeft een waardering kenbaar gemaakt voor dit artikel
 You need to enable JavaScript to vote

We proberen de kwaliteit van onze kennisbank voortdurend te verbeteren.
Geef de informatie op deze pagina een waardering met de slider hierboven.