Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Classi e oggetti PHP per il funzionamento dell'e-commerce

In questo capitolo vedremo come PHP gestisce classi e oggetti all’interno di un applicativo complesso come un sistema di e-commerce.
In questo capitolo vedremo come PHP gestisce classi e oggetti all’interno di un applicativo complesso come un sistema di e-commerce.
Link copiato negli appunti

Memoria vs sessione

Un oggetto è un'istanza di una classe. Quando usiamo l'operatore new creiamo l'istanza di una classe specifica. Il ciclo di vita di questo oggetto è limitato al contesto di esecuzione del codice o dello script corrente.

Facciamo un esempio. Supponiamo di aggiungere virtualmente un prodotto al carrello usando due classi che vedremo in dettaglio nei capitoli successivi.

$product = new Product(uniqid(), 'Magic Mouse', 'Descrizione', 85.90, 'Apple', 'image.jpg', 'magic-mouse');
$cart = new Cart();
$cart->addToCart($product, 1);

A questo punto l’oggetto carrello risiede temporaneamente nello spazio di memoria che PHP gli ha riservato. Possiamo quindi reperire i suoi dati:

$cart_total = $cart->getTotal(); // 85.90
$cart_items = $cart->getItems();
/* [ ['id' => '5819f3ad1c0ce',
    'name' => 'Magic Mouse',
     'description' => 'Descrizione',
     'price' => 85.90,
     'manufacturer' => 'Apple',
     'image' => 'image.jpg',
     'quantity' => 1,
     'subtotal' => 85.90 ] ]
*/

Possiamo ovviamente eseguire anche un’operazione in scrittura come l’aggiornamento della quantità di un prodotto e il conseguente ricalcolo dei costi:

$cart->updateCart($product, 2);
$updated_total = $cart->getTotal(); // 171.80
$upd_cart_items = $cart->getItems();
/* [ ['id' => '5819f3ad1c0ce',
    'name' => 'Magic Mouse',
     'description' => 'Descrizione',
     'price' => 85.90,
     'manufacturer' => 'Apple',
     'image' => 'image.jpg',
     'quantity' => 2,
     'subtotal' => 171.80 ] ]
*/

Altrettanto scontata è l’operazione di rimozione di un prodotto dal carrello.

$cart->removeFromCart($product);
echo $cart->getTotal(); // 0.00
print_r($cart->getItems()); // []

Il problema è che il carrello non è persistente in quanto risiede unicamente in memoria. Una soluzione a questo problema è il salvataggio del carrello nella sessione corrente di PHP. PHP di fatto utilizza i cookie per fare in modo che quanto scritto in memoria sopravviva al cambio di pagina e alla chiusura del browser.

session_start();
$_SESSION['cart'] = ['items' => serialize($cart->getItems()), 'total' => $cart->getTotal()];

I prodotti del carrello sono memorizzati come array quindi vanno serializzati in formato stringa per poter essere inseriti nella sessione corrente.

Il carrello virtuale va sempre sincronizzato con il carrello salvato nella sessione ad ogni operazione:

session_start();
$items = unserialize($_SESSION['cart']['items']);
$total = floatval($_SESSION['cart']['total']);
$cart = new Cart();
$cart->setItems($items);
$cart->setTotal($total);
$cart->updateCart($product, 2);
$_SESSION['cart'] = ['items' => serialize($cart->getItems()), 'total' => $cart->getTotal()];

Questa operazione di sincronizzazione è fondamentale per evitare problemi di visualizzazione nella pagina dedicata al carrello e quando si mostrano costi e prodotti scelti al cliente finale.

Incapsulamento

Avrete notato come stiamo utilizzando in modo intuitivo le classi senza aver minimamente spiegato il loro funzionamento interno.

La mancanza di dettagli implementativi non ci ha impedito di utilizzare il carrello per le operazioni comuni. Questa caratteristica dell’OOP prende il nome di incapsulamento e si basa sul principio secondo cui l’utilizzatore finale di una classe non deve necessariamente conoscere i dettagli implementativi della classe per poterla usare.

Del metodo addToCart() sappiamo solo che accetta come argomenti un oggetto prodotto e la sua quantità. E dei metodi getItems() e getTotal() sappiamo che restituiscono rispettivamente l’array di prodotti presenti nel carrello e il totale del carrello. Non sappiamo altro eppure abbiamo potuto compiere tutte le operazioni necessarie.

Se invece non fossimo più interessati ai dati gestiti dal carrello ma al suo funzionamento, dovremmo necessariamente modificarne la struttura e quindi conoscere i dettagli implementativi della classe Cart.

Conclusione

In questo capitolo abbiamo affrontato due aspetti fondamentali della programmazione OOP relativa alla gestione di un e-commerce. Nei prossimi capitoli approfondiremo progressivamente le nostre conoscenze quando parleremo del flusso di lavoro di un e-commerce.

Ti consigliamo anche