Ik heb een kleine package die met een PHP-sessie zowel sneller als veiliger wordt. Als er een PHP-sessie actief is, kunnen klassen die gebruiken om tijdelijke data op te slaan, maar de klassen hebben niet per se een sessie nodig.
De package moet kunnen worden gebruikt binnen uiteenlopende frameworks, CMS'en en webwinkelplatforms — die in de regel allemaal een eigen implementatie van sessie hebben. Is er een "best practice" om zonder conflicten met bestaande sessies data in een sessie op te slaan?
Ik omzeil het nu met bijvoorbeeld:
$_SESSION[__CLASS__]['Foo'] = $this->Foo;
zodat via __CLASS__ een redelijk unieke namespace\class-variabelennaam ontstaat. Kan dat ook anders en vooral beter?
Hoeveel classes die een sessie gebruiken zitten er in het package?
Een handvol, maar ze slaan weinig meer op dan een transactie-ID, een statusregel of een kleine array.
Het gaat concreet om online betalingen. Ik kan daarin op bijvoorbeeld een cURL-request besparen door iDEAL-issuers (banken) maar één keer op te halen en te cachen. De gekozen issuer moet bij een volgend verzoek namelijk voorkomen in de eerder gepresenteerde lijst, dus kun je daar op een tweede cURL-request besparen.
Oke, maar door het te doen zoals je het nu doet, maak je voor iedere class een nieuwe (sub)array aan. Dat lijkt me niet zo heel effectief. Kun je niet beter als key de naam van je package gebruiken ofzo?
Op zich kan de klasse ook wel. Elke betaalmethode is een klasse, maar het zal zelden voorkomen dat tijdens een sessie verschillende betaalmethoden tegelijk worden gekozen.
Ward, zou een combinatie doen van de namespace en class, zeker als het je eigen package is en je toevallig de class 'payment' gebruikt voorkomt dat een hoop fouten.
Ozzie; 5.2 wordt niet meer ondersteund door PHP zelf, dus imho hoeft een ontwikkelaar daar géén rekening meer mee te houden. Zéker niet als het te maken heeft met betalingen moeten zowel de server als de software up-to-date blijven. Aangezien sommige hosters/ontwikkelaars daar zelf weinig aan doen, kun je ze op deze manier wakker schudden :)
<?php
namespace BetaalProvider;
class iDEAL
{
// <...>
}
?>
dan is __CLASS__ al de string 'BetaalProvider\iDEAL', dus inclusief namespace. Het blijft ook 'BetaalProvider\iDEAL' als je bijvoorbeeld use BetaalProvider\iDEAL as Payment zou gebruiken. Kun je daarmee blindvaren op __CLASS__ of moet je vanaf bepaalde PHP-versie toch nog __NAMESPACE__ in de mix gooien?
As of PHP 5 this constant returns the class name as it was declared (case-sensitive). In PHP 4 its value is always lowercased. The class name includes the namespace it was declared in (e.g. Foo\Bar).