SESSION in OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

W W

W W

05/05/2009 16:30:00
Quote Anchor link
Simpele vraag,

Is het netjes om met sessies te werken in een classe? Zonee, hoe kun je dit anders aanpakken om dan toch sessies te setten?

Mvg.
 
PHP hulp

PHP hulp

10/05/2021 20:32:48
 
Onbekend Onbekend

Onbekend Onbekend

05/05/2009 16:34:00
Quote Anchor link
Waarom zou het niet netjes zijn?
 
W W

W W

05/05/2009 16:51:00
Quote Anchor link
Geen idee, omdat je de classe included en je dus misschien 2x een sessie start krijgt? Wat doe jij, zet je boven in een classe een sessie start? Of pas in de pagina waar je het include en gebruikt?
 
GaMer B

GaMer B

05/05/2009 17:01:00
Quote Anchor link
Ik gebruik database based sessions :]

Dan kan je het namelijk wel OOP maken... extends DB etc.
Gewijzigd op 01/01/1970 01:00:00 door GaMer B
 
Arian Stolwijk

Arian Stolwijk

05/05/2009 17:09:00
Quote Anchor link
Je kunt ook gewoon een session class maken. Dan gebruik je voortaan voor al je sessions de session class.

in je constructor zet je dan zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if(!self::$sessionStarted){
    session_start();
    self::$sessionStarted = true;
}

?>

die $sessionStarted is natuurlijk een static variabele:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
class Sessions {
    protected static $sessionStarted = false;
}

?>
 
GaMer B

GaMer B

05/05/2009 17:11:00
Quote Anchor link
Maar dan ben je gewoon een schil rondom het werkelijke aan het bouwen... Net zoiets als:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

function hashIt($string)
{

    return md5($string);
}[
/code]

Kan je net zo goed meteen md5($string) doen.
 
W W

W W

05/05/2009 17:22:00
Quote Anchor link
@Gamer, kun je je database versie van de Sessie iets verder uitleggen?
 
GaMer B

GaMer B

05/05/2009 17:33:00
Quote Anchor link
Je maakt gewoon een custom session class. In plaats van session_start() en $_SESSION aanverwanten te gebruiken, gebruik dan gewoon een tabel waar je alle info in opslaat.

Zoiets:
sess_id
sess_name
value
fingerprint

En ga zo door. In fingerprint maak je een afdruk van de browse-omgeving van de gebruiker: IP, User Agent et cetera en maak daar een (unieke) hash van.

Door alles in een tabel te proppen kun je bij shared hosting ook geen problemen krijgen en je kunt het erg goed uitbreiden met what so ever.
 
Pim Vernooij

Pim Vernooij

12/05/2009 19:28:00
Quote Anchor link
Dat is allemaal geen antwoord op de vraag van de TS...

Vraag:
Is het netjes om met sessies te werken in een classe? Zonee, hoe kun je dit anders aanpakken om dan toch sessies te setten?

Antwoord:
Ja het is netjes om sessies te gebruiken in je classes. Let alleen op dat je sessies globaal zijn en het niet de verantwoordelijkheid is van jouw class is om de sessie te beheren (bv. session_start() of session_close() etc). Maar het getten en setten van sessies mag je prima doen in je klasse.

Handig:
Wellicht kan je zelf een Sessie klasse aanmaken. Sessies zijn in principe globaal en er is maar 1 sessie object beschikbaar. Je zou dus het singleton pattern kunnen gebruiken om sessies te beheren. Dat kan als volgt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php

class Session {
    
    private static $instance;
    
    private function __construct() {
        session_start();
    }

    
    static public function getInstance() {
        if( !self::$intsance instanceof self ) {
            self::$instance = new self;
        }

        return self::$instance;
    }

    
    public function __set( $key, $value ) {
        $_SESSION[$key] = $value;
    }

    
    public function __get( $key ) {
        return $_SESSION[$key];
    }

    
    public function __isset( $key ) {
        return array_key_exists( $key, $_SESSION );
    }

    
    public function __toString() {
        return var_dump( $_SESSION );
    }
    
}


class MyClass {
    
    public function __construct() {
        
        $session = Session::getInstance();
        $session->waarde = "waarde van mijn sessie variabele";
    }

    
    public function __toString() {
        $session = Session::getInstance();
        echo $session->waarde;
        //of:
        echo $_SESSION['waarde'];
    }
}


?>
 
Hipska BE

Hipska BE

12/05/2009 20:25:00
Quote Anchor link
Prachtige class Pim!

Ik vraag mij enkel 1 ding af.. hoe doe je iets als unset($_SESSION['waarde']) nu dan?
 

12/05/2009 20:28:00
Quote Anchor link
Misschien moet je ook effe dit topic op phpfreakz lezen...
 
Mark PHP

Mark PHP

12/05/2009 21:17:00
Quote Anchor link
Hipska schreef op 12.05.2009 20:25:
Prachtige class Pim!

Ik vraag mij enkel 1 ding af.. hoe doe je iets als unset($_SESSION['waarde']) nu dan?
__unset() is ook een magic method. Persoonlijk heb ik het niet zo met dit soort overloading, het wordt er niet overzichtelijker op.

En inderdaad, die link van Karl is ook wel eens goed om door te lezen.
Gewijzigd op 01/01/1970 01:00:00 door Mark PHP
 
Hipska BE

Hipska BE

12/05/2009 22:40:00
Quote Anchor link
Juist, ik dacht wel dat er ook een magic voor was, maar wist het niet meer zeker.

Ik gebruik ook niet graag singletons, maar voor bv DB kan dat wel handig zijn denk ik, nog niet nodig gehad.

EDIT: heb de class van Pim wat aangepast zodat hij wat meer generiek te gebruiken valt.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php

class Session {
    
    protected static $init = false;
    
    public function __construct() {
        if(!self:$init) this->start();
    }

    
    protected function start() {
        // hier kunnen nog andere dingen komen
        // session_name(.....) bv.

        self:$init = session_start();
    }

    
    public function __set( $key, $value ) {
        $_SESSION[$key] = $value;
    }

    
    public function __get( $key ) {
        return $_SESSION[$key];
    }

    
    public function __isset( $key ) {
        // isset($_SESSION[$key]) kon ook
        return array_key_exists( $key, $_SESSION );
    }

    
    public function __unset( $key ) {
        unset( $_SESSION[$key] );
    }

    
    public function __toString() {
        // want var_dump returnt niet
        return print_r( $_SESSION , true);
    }

    
    public function destroy(){
        // om alles te wissen van de sessie
        return session_destroy();
    }
    
}


?>
Gewijzigd op 01/01/1970 01:00:00 door Hipska BE
 
Pim Vernooij

Pim Vernooij

13/05/2009 11:25:00
Quote Anchor link
@Hipska:
- __unset was ik inderdaad vergeten. Zie ook: http://ca.php.net/oop5.magic
- Ik zie dat je de getInstance() methode hebt verwijderd, wat betekent dat je nu iedere keer als je een sessie wilt gebruiken een nieuwe instantie van je sessie object moet aanmaken. Lijkt me niet wenselijk, aangezien je maar 1 sessie object hebt en het dus totaal overbodig is om meer dan 1 instantie van een sessie object te hebben. Wat je nog zou kunnen doen is je sessie instantie in een Registry gooien.

@Agirre:
Inderdaad, ik gebruik zelf meestal gewoon $_SESSION en zet in m'n bootstrap file bovenin session_start(), aangezien al mijn requests via die bootstrapper verlopen en ik dus zeker weet dat de sessie is gestart. Dit was puur ter illustratie hoe de TS zijn probleem met "2x een sessie start" of whatever op zou kunnen lossen. (2x een sessie starten zou overigens ook geen problemen hoeven opleveren... dus wat dat betreft is mijn class vrij useless ;-) )
Gewijzigd op 01/01/1970 01:00:00 door Pim Vernooij
 
Mark PHP

Mark PHP

13/05/2009 11:44:00
Quote Anchor link
Pim Vernooij schreef op 13.05.2009 11:25:
...
Ik gebruik ook een Session class hoor, wat ik bedoelde met onoverzichtelijk is __get(), __set() etc. Ik gebruik liever get(), set(), dan heb je de zaken meer in de hand.

Verder kan je deze class toch prima als parameter meegeven aan andere objecten. Daarvoor is singleton overbodig.
Bovendien zou je best, als je dat wilt, twee sessie objecten moeten kunnen maken. Gewoon even checken of de sessie al gestart is voordat je session_start() aanroept.

@Hipska
Je aangepaste class kan nu bij __get() en __unset() notices opleveren. Eerst even checken met isset() (of __isset()).
Gewijzigd op 01/01/1970 01:00:00 door Mark PHP
 
Arian Stolwijk

Arian Stolwijk

13/05/2009 11:50:00
Quote Anchor link
http://framework.zend.com/manual/en/zend.session.html voor nog wat leuke ideeën, zo heb ik mijn eigen Session class ook ongeveer gemaakt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$session
= new Session('namespace'); // bijvoorbeeld Auth voor je inloggen
$session->user = 'Arian';

// wordt dan $_SESSION['namespace']['user'] = 'Arian';

unset($session->user); // __unset

isset($session->user); // __isset

$session->destroy(); // verwijderd de hele 'namespace'

?>
 
Pim Vernooij

Pim Vernooij

13/05/2009 12:02:00
Quote Anchor link
Agirre schreef op 13.05.2009 11:44:
Verder kan je deze class toch prima als parameter meegeven aan andere objecten. Daarvoor is singleton overbodig.
Bovendien zou je best, als je dat wilt, twee sessie objecten moeten kunnen maken. Gewoon even checken of de sessie al gestart is voordat je session_start() aanroept.
Dat ben ik niet met je eens. De sessie array is van nature 'globaal'. M.a.w: er is er maar 1 van en hij is overal toegankelijk. Omdat dat zo is, stuur je de sessie array nooit mee als parameter. Legitimeert wat mij betreft het gebruik van een Singleton: je implementeerd namelijk de methode die PHP zelf hanteerd, echter op een iets andere manier zodat je wat meer controle hebt.
 
Mark PHP

Mark PHP

13/05/2009 13:11:00
Quote Anchor link
Pim Vernooij schreef op 13.05.2009 12:02:
Dat ben ik niet met je eens. De sessie array is van nature 'globaal'. M.a.w: er is er maar 1 van en hij is overal toegankelijk. Omdat dat zo is, stuur je de sessie array nooit mee als parameter. Legitimeert wat mij betreft het gebruik van een Singleton: je implementeerd namelijk de methode die PHP zelf hanteerd, echter op een iets andere manier zodat je wat meer controle hebt.
Ik ben sowieso tegen singletons en dus vind ik het ook hier onnodig. Meerdere sessie instanties die werken op één enkele global is mijn insziens niets verkeerds aan.

Stel dat we een pluginsysteem hebben, het lijkt mij netjes om elke plugin in een soort van sandbox te laten opereren. Dat betekend m.i. dat het niet netjes is om een singleton instantie op te roepen (en dus te delen). Maar wél om een apart sessie object aan te maken voor privé gebruik. Wat mij betreft net iets netter en vooral overzichtelijker.

Wat meteen betekend dat ik geen probleem zie in het doorgeven van een sessie object als parameter (zelf stel je ook voor om het in een registry op te nemen). Voor de programmeur bestaat $_SESSION immers niet meer, alles gaat via de klasse Session.
Gewijzigd op 01/01/1970 01:00:00 door Mark PHP
 
Hipska BE

Hipska BE

13/05/2009 13:28:00
Quote Anchor link
@Pim: Zoals je zelf zegt, de session is globaal. Waarom zou men dan niet via meerdere manieren toegang tot mogen hebben? Zie de link van Karl waarom een Singleton hier niet nodig hoeft te zijn.

@Arian: Aan die manier had ik meteen ook gedacht, maar had het even niet uitgewerkt. Ook dit bewijst dat singletons hier niet handig kunnen zijn.

EDIT: meer zoiets dus? :-)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php

class Session {
    
    protected $namespace;
    
    public function __construct($namespace) {
        session_start(); // levert volgens Pim geen problemen op
        $this->namespace = $namespace;
        if(!array_key_exists( $this->namespace , $_SESSION ))
            $_SESSION[$this->namespace] = array();
    }

    
    public function __set( $key, $value ) {
        $_SESSION[$this->namespace][$key] = $value;
    }

    
    public function __get( $key ) {
        return $_SESSION[$this->namespace][$key];
    }

    
    public function __isset( $key ) {
        return array_key_exists( $key, $_SESSION[$this->namespace] );
    }

    
    public function __unset( $key ) {
        unset( $_SESSION[$this->namespace][$key] );
    }

    
    public function __toString() {
        return print_r( $_SESSION[$this->namespace] , true);
    }

    
    public function destroy(){
        // om deze namespace te wissen
        unset($_SESSION[$this->namespace]);
    }
    
}


?>
Gewijzigd op 01/01/1970 01:00:00 door Hipska BE
 
Arian Stolwijk

Arian Stolwijk

13/05/2009 15:13:00
Quote Anchor link
Zoiets ja lijkt mij.

Eventueel zou je die session start dus met een static kunnen zorgen dat je hem maar één keer doet. Zoiets als ik in mijn eerste post zei:

Arian schreef op 05.05.2009 17:09:
Je kunt ook gewoon een session class maken. Dan gebruik je voortaan voor al je sessions de session class.

in je constructor zet je dan zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if(!self::$sessionStarted){
    session_start();
    self::$sessionStarted = true;
}

?>

die $sessionStarted is natuurlijk een static variabele:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
class Sessions {
    protected static $sessionStarted = false;
}

?>
 
Hipska BE

Hipska BE

13/05/2009 15:16:00
Quote Anchor link
En zoals ik in een vorige post al gedaan heb.
Maar Pim vertrouwde ons toe dat 2x session start geen kwaad kon.
Hipska schreef op 12.05.2009 22:40:
...
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

class Session {
    
    protected static $init = false;
    
    public function __construct() {
        if(!self:$init) this->start();
    }

    
    protected function start() {
        // hier kunnen nog andere dingen komen
        // session_name(.....) bv.

        self:$init = session_start();
    }
    
   ...

?>
 

Pagina: 1 2 volgende »



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.