2011-11-13 21 views
7

Diciamo che sto memorizzando un array o un oggetto chiamato $_SESSION["logged_in_user"].Riferimento alle variabili di sessione in PHP

Se è necessario farvi riferimento più volte in tutta la sceneggiatura, quale delle seguenti è la "migliore pratica"?

  • Usa $_SESSION["logged_in_user"] ogni volta (vale a dire $_SESSION["logged_in_user"]["first_name"])?

  • Copia l'oggetto in una nuova variabile come $logged_in = $_SESSION["logged_in_user"]?

  • Creare un riferimento alla variabile di sessione come $logged_in =& $_SESSION["logged_in_user"]

Probabilmente sto overthinking questo, ma le mie principali preoccupazioni sono di script in testa e la leggibilità. Non sono sicuro che il riferimento a una variabile di sessione sia più lento del riferimento a una variabile dichiarata inline. Inoltre, non so se copiare una variabile di sessione in una variabile "regolare" aggiunga un sovraccarico maggiore del necessario. Mi piace la leggibilità di $logged_in["first_name"] su $_SESSION["logged_in_user"]["first_name"].

Quindi c'è una pratica migliore qui o non importa davvero?

+0

non importa. Qualunque cosa abbia senso per te. Tuttavia un riferimento sembra un po 'eccessivo. Personalmente, id va con la creazione di una nuova variabile. –

+0

Non ho mai visto una variabile di riferimento creata per una variabile '$ _SESSION', ma sembra una micro ottimizzazione ed è davvero una tua preferenza. – nickb

+0

Generalmente creo una classe che si occupa degli utenti. – Ben

risposta

6

Non stai pensando troppo ... pensare è bello!

Io personalmente uso symfony 1.4 per codificare in, che risolve i problemi come questi, ma si può scegliere di rimanere magra :-)

penserei OO (object oriented). Crea una classe utente. Quindi effettuare chiamate come UserFactory :: getCurrentUser() o User :: getCurrentUser() che restituirà l'oggetto utente attualmente connesso. Tra le variabili membro di quella classe sarebbe user_id. Tuttavia, sarai in grado di aggiungere funzionalità e dati aggiuntivi a quella classe.

Ricorda, pensare in OO significa utilizzare termini astratti molto vicini al dominio del problema. Utente, Automobile, Ordine, ecc. Non devi essere specifico e non devi includere tutte le informazioni disponibili in quella classe perché sia ​​"completo", qualunque esso sia. Includere solo i dati necessari al momento (tenere presente yagni). Le classi sono illusioni di cose concrete e reali. Proprio come la modellazione 3D è un'illusione di una cosa del mondo reale.

La speranza che aiuta ...

+0

totalmente. questo è esattamente ciò che intendevo per classe session wrapper. –

+0

Risposta fantastica. –

1

Non lo stai pensando troppo.

Ma se non si dispone di una certa classe sessione involucro/manager, quindi vorrei solo usare:

$_SESSION['logged_in_user'] 

In entrambi i casi non è un affare enorme. Utilizza ciò che funziona per .

1

È possibile creare una classe per gestire la sessione:

class MySession { 

    public static &get($key){ 

    if(!array_key_exists($key, $_SESSION){ 
     return null; 
    } 

    return $_SESSION[$key]; 

    } 

} 

In questo modo non c'è bisogno di preoccuparsi di come recuperare i valori, non stai duplicare tutti i dati:

$first_name = MySession::get('first_name'); 

Nota: questa soluzione si occupa di accesso alla sessione e non con la specifica implementazione :)

+0

Mi piace. Ho ancora difficoltà a pensare in termini di classi statiche (capisco il concetto, ma non mi viene mai in mente una soluzione). Una domanda, in questo caso, non dovrei ancora chiamare '$ first_name = MySession :: get (" logged_in_user ['first_name'] ")'? –

+0

Puoi usarlo anche direttamente, non ha molta importanza. Devi fare ciò che ha più senso per ogni caso specifico. Per quanto riguarda l'esempio specifico a cui fai riferimento, dovresti prima ottenere l'array "logged_in_user" e poi recuperare il first_name da esso. Come ho detto, questo era solo un suggerimento su come gestire la sessione. La tua implementazione specifica richiede una combinazione di questo e di ciò che ha detto Homer6. – SuitedSloth

1
$_SESSION["logged_in_user"]["first_name"] 

Stai semplice; & non aggiungere teste per creare nuovi spazi per le stesse variabili.

7

$_SESSION è uno speciale array superglobale di PHP. Così si tecnicamente possibile fare riferimento ad esso ogni volta che vuoi da solo usando:

$_SESSION['logged_in_user'] 

Tuttavia, è speciale anche perché si può cambiare. Il seguente esempio rende visibili:

$alias =& $_SESSION; 
session_start(); 
$alias['foo'] = 'bar'; 

Questo codice non imposterà $_SESSION['foo']. $alias sta puntando a uno $_SESSION precedente, session_start() ha creato una nuova sessione.

Se si conoscono le avvertenze come queste è possibile creare in modo naturale l'astrazione $_SESSION.

Problemi correlati