[OOP] PHP-sessie als gemeenschappelijke data store

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ward van der Put
Moderator

Ward van der Put

09/12/2013 09:53:36
Quote Anchor link
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?
 
PHP hulp

PHP hulp

29/03/2024 11:15:46
 
Ozzie PHP

Ozzie PHP

09/12/2013 10:18:44
Quote Anchor link
Hoeveel classes die een sessie gebruiken zitten er in het package?
 
Ward van der Put
Moderator

Ward van der Put

09/12/2013 10:27:04
Quote Anchor link
Ozzie PHP op 09/12/2013 10:18:44:
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.
 
Ozzie PHP

Ozzie PHP

09/12/2013 10:33:38
Quote Anchor link
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?

$_SESSION['wvdp_payment_package']['Foo'] = $this->Foo;
 
Ward van der Put
Moderator

Ward van der Put

09/12/2013 10:41:00
Quote Anchor link
Of misschien de namespace gebruiken?

$_SESSION[__NAMESPACE__]['Foo'] = $this->Foo;

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.
 
Ozzie PHP

Ozzie PHP

09/12/2013 10:48:49
Quote Anchor link
>> Of misschien de namespace gebruiken?

Dat zou kunnen. Hou er alleen wel rekening mee dat dat pas vanaf versie 5.3 werkt. In oudere PHP versies zou het dan mis gaan.
 
Chris -

Chris -

09/12/2013 12:02:12
Quote Anchor link
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 :)
 
Ward van der Put
Moderator

Ward van der Put

09/12/2013 12:23:24
Quote Anchor link
Chris, dank je. Als ik dit gebruik:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?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?
 
Ozzie PHP

Ozzie PHP

09/12/2013 12:33:01
Quote Anchor link
Quote:
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).
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.