Dat artikel, evenals het artikel waar daarin naar verwezen wordt, is interessant maar er zijn wel enkele "caveats", gotcha's en (mogelijk) enkele regelrechte fouten waar je op moet letten.
Indien gewenst kan ik (hier of via PM) inhoudelijk nog veel meer over zeggen, maar het voornaamste wat mij tegenstaat in de bovenstaande implementatie is het volgende:
Ik houd er niet van als mijn klasses "op scherp" staan, in die zin dat er allerlei zaken automatisch worden uitgevoerd bij de creatie van een object. Wanneer een object aangemaakt wordt zouden er enkel zaken geïnitialiseerd moeten worden, maar NIET uitgevoerd! Na afloop van de initialisatie van een object zou dit object enkel "klaar voor gebruik" moeten zijn, maar verder nog niets "gedaan" moeten hebben. In de constructor van het object gebeuren er twee dingen die ik op een andere manier en op een andere plaats zou aanpakken / regelen:
- de start van een sessie
- het opzetten van een database-connectie
Ik wil zelf bepalen wanneer ik mijn sessie start. De sessie-handler zou enkel in de implementatie van het sessie-management moeten voorzien, maar niet eigenhandig moeten besluiten wanneer de sessie wordt gestart. Ik zou session_start() dan ook verwijderen uit de constructor.
Daarnaast lijkt het mij beter dat je een bestaande database-connectie doorgeeft aan de constructor. Het is niet de taak van de sessie-handler om een andere/tweede connectie op te zetten met een database... Daarnaast is het opzetten van een (tweede) connectie een dure operatie en kan mogelijk voor problemen zorgen met de ondeelbaarheid van querybatches (transacties).
En tot slot (observatie): het hele doel van die class is dat deze het sessie-management onder water regelt en dat je sessie-gerelateerde code op de ouderwetse manier blijft gebruiken (de aanroep van session_-functies en het gebruik van $_SESSION). Het is dus eigenlijk helemaal niet de bedoeling dat je iets doet via het object van die klasse, het object zou dan ook niet beschikbaar moeten zijn.
Initialisatie van deze functionaliteit zou er dus min of meer als volgt uit moeten zien:
<?php
// zet hier ergens EENMALIG je database connectie op
// $db = ...
// laad je custom session handler ZONDER $obj = new ...
// de instantie dient immers niet rechtstreeks benaderbaar te zijn
// geef database-object door aan de constructor
new MySession($db);
// start sessie op de oude manier
session_start();
// nu kun je $_SESSION en session_-functies gebruiken zoals voorheen
// ...
?>
Toon Meer