42. Una classe per i Cookie
In questo capitolo extra, ripeterò l'esempio del capitolo precedente utilizzando la programmazione orientata agli oggetti (OOP).
Ho scritto una classe Cookie molto semplice ma che ci consente di trarre dei vantaggi che non avremmo con la sola funzione nativa setcookie.
Classe Cookie
Attributi :
- name - Un nome per il cookie
- value - Il valore da registrare nel cookie
- expire - La durata del cookie espressa in secondi
- path - Path del sito da cui è accessibile il cookie
- domain - Dominio web da cui è accessibile il cookie
- secure - Per impostare il cookie solo su connessioni sicure HTTPS
- httponly - Per rendere accessibile il cookie solo attraverso il protocollo HTTP
Come per setcookie(), solo name è obbligatorio mentre tutti gli altri attributi sono facoltativi.
Metodi :
- setcookie() - Metodo per impostare il cookie
- getPath() - Metodo statico che restituisce la path dello script attualmente in esecuzione
- unserialize() - Metodo statico per recuperare da un cookie l'istanza originale della classe Cookie
- cancella() - Metodo statico per cancellare un cookie
- __toString() - Metodo che restituisce direttamente il valore del cookie se questo viene usato come stringa
Listato della classe Cookie
Introduco ora il codice della classe Cookie che risiede in un file esterno nominato Cookie.php :
<?php
class Cookie
{
public $name;
public $value;
public $expire;
public $path;
public $domain;
public $secure;
public $httponly;
public function Cookie($n, $v = "", $e = 0, $p = NULL, $d = NULL, $s = false, $h = false)
{
$this->name = $n;
$this->value = $v;
$this->expire = ($e == 0) ? $e : (int) ($e * 60 * 60) + time();
$this->path = ($p == NULL) ? Cookie::getPath() : $p;
$this->domain = $d;
$this->secure = $s;
$this->httponly = $h;
}
public function setcookie($salva_tutto = false)
{
$cookie = ($salva_tutto) ? serialize($this) : $this->value;
$_COOKIE[$this->name] = $cookie;
setcookie($this->name, $cookie, $this->expire, $this->path,
$this->domain, $this->secure, $this->httponly);
}
static public function getPath()
{
$cartelle = explode("/", $_SERVER["PHP_SELF"]);
$path = "";
$dimensione = count($cartelle) - 1;
for ($i = 0; $i < $dimensione; $i )
$path .= $cartelle[$i] . "/";
return $path;
}
static public function unserialize($nomeCookie)
{
$cookie = unserialize(stripslashes($_COOKIE[$nomeCookie]));
if ($cookie instanceof Cookie)
return $cookie;
else
throw new Exception("Cookie corrotto");
}
static public function cancella($nomeCookie)
{
unset($_COOKIE[$nomeCookie]);
setcookie($nomeCookie, "", time() - 86400); // Imposta la scadenza al giorno prima
}
public function __toString()
{
return $this->value;
}
}
?>Vantaggi della classe Cookie
Uno dei vantaggi di questa classe è quello di poter usare solo i parametri che ci interessano realmente, senza obbligatoriamente specificare anche tutti gli altri come avviene con setcookie().
Se ad esempio volessimo specificare solo il nome del cookie, un valore e impostare a true l'opzione httponly sarebbe sufficiente utilizzare il seguente codice :
<?php
require_once("Cookie.php");
$cookie = new Cookie("nome cookie", "valore del cookie");
$cookie->httponly = true;
$cookie->setcookie();
?>Con setcookie() invece avremmo dovuto specificare per forza anche expire, path, domain e secure per poter arrivare ad httponly rendendo il codice molto meno intuitivo e leggibile. La variante che segue è equivalente al codice soprastante :
<?php
setcookie("nome cookie", "valore del cookie", 0, "/", NULL, false, true);
?>Altra particolarità di questa classe è che ci consente di specificare come scadenza direttamente il numero di ore a partire dal momento in cui viene impostato il cookie. Potete facilmente modificare la classe, ad esempio per considerare expire come il numero di giorni di vita del cookie e così via :
<?php
$cookie = new Cookie("nome cookie", "valore del cookie", 24); // Dura 24 ore
$cookie->httponly = true;
$cookie->setcookie();
// oppure
setcookie("nome cookie", "valore del cookie", time() (60 * 60 * 24), "/", NULL, false, true);
?>Se un'istanza di Cookie viene stampata o concatenata come stringa, interviene il metodo magico __toString() restituendo direttamente il valore memorizzato nel cookie. Punto di forza di questa classe è il metodo pubblico setcookie(), che come avrete notato prende un parametro $salva_tutto impostato di default al valore false. Se richiamando la funzione lo impostate invece a true, il metodo setcookie() serializza l'oggetto e lo salva integro nel cookie. Sarà poi possibile recuperare l'oggetto salvato con il metodo statico unserialize, permettendoci di leggere anche in un secondo momento tutte le proprietà del cookie, cosa impossibile se avessimo usato solo la funzione nativa setcookie(). |
Esempio classe Cookie
Di seguito riporto l'esempio del capitolo precedente riscritto per la classe Cookie con la serializzazione dell'oggetto ...
classi_cookie.php
<?php
require_once("Cookie.php");
if ($_POST["comando"] == "cancella")
{
Cookie::cancella("dato");
}
else if ($_POST["comando"] == "imposta")
{
$cookie = new Cookie("dato", $_POST["dato"], $_POST["expire"]);
$cookie->setcookie(true);
}
?>
<html>
<head>
<title>Impostiamo e cancelliamo i Cookie</title>
</head>
<body>
<?php
if (isset($_COOKIE["dato"]))
{
try
{
$cookie = Cookie::unserialize("dato");
echo "Il Cookie \"$cookie->name\" ha il valore = \"$cookie->value\"";
echo "<br />\nScade in data " . date("d/m/Y - H:i:s", $cookie->expire);
echo "<br />\nE' accessibile dal dominio \"" . (($cookie->domain) ? $cookie->domain : "default") . "\"";
echo " per la path \"$cookie->path\"";
echo "<br />\nsecure = \"" . (($cookie->secure) ? "true" : "false") . "\"";
echo "<br />\nhttponly = \"" . (($cookie->httponly) ? "true" : "false") . "\"";
}
catch (Exception $e)
{
echo "<h3>" . $e->getMessage() . "</h3>";
}
?>
<br /><br />
<form name="deletecookie" action="classi_cookie.php" method="post">
<input type="hidden" name="comando" value="cancella" />
<input type="submit" value="Cancella cookie" />
</form>
<?php
}
else
{
?>
<form name="writecookie" action="classi_cookie.php" method="post">
<table width="400" border="0" cellspacing="5" cellpadding="5">
<tr>
<td>Dato da memorizzare</td>
<td><input type="text" name="dato" value="" /></td>
</tr>
<tr>
<td>Scadenza del cookie</td>
<td><input type="text" name="expire" value="" /></td>
</tr>
<tr>
<td><input type="submit" value="Imposta cookie" /></td>
<td> </td>
</tr>
</table>
<input type="hidden" name="comando" value="imposta" />
</form>
<?php
}
?>
</body>
</html>Una volta impostato il cookie si ottiene questo output. |

