Guida Php – 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 :

  • nameUn nome per il cookie
  • valueIl valore da registrare nel cookie
  • expireLa durata del cookie espressa in secondi
  • pathPath del sito da cui è accessibile il cookie
  • domainDominio web da cui è accessibile il cookie
  • securePer impostare il cookie solo su connessioni sicure HTTPS
  • httponlyPer 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 …

<?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.

Versione originale dell’articolo

Lezione Precedente -> Guida Php – I cookie

Lezione Successiva -> Guida Php – Le sessioni

Tags: , , ,

Lascia un Commento

Connect with Facebook