Un’altra caratteristica che rende molto versatile PHP 5 è l’overloading dell’operatore di accesso degli Array : []
Per effettuare questo overload è necessario far sì che le nostre classi implementino l’interfaccia nativa ArrayAccess.
Quest’ultima fornisce i metodi astratti che ci permetteranno di utilizzare le istanze delle nostre classi come se fossero degli array omettendo quindi il classico operatore di selezione -> con i vantaggi che ne derivano dalla gestione di un array :
<?php
class Oggetto implements ArrayAccess
{
public $attributo1 = "ciao";
public $attributo2 = "pippo";
/* Ridefinizione dei metodi di ArrayAccess
...
*/
}
$obj = new Oggetto();
echo $obj["attributo1"] . " " . $obj["attributo2"]; // Stampa "ciao pippo"
?>
Vediamo cosa contiene l’interfaccia ArrayAccess prima di illustrare l’overload vero e proprio e le sue potenzialità.
interface ArrayAccess
- bool offsetExists ($index)
- mixed offsetGet ($index)
- void offsetSet ($index, $new_value)
- void offsetUnset ($index)
offsetExists viene richiamato per verificare se esiste l’indice specificato nel nostro pseudo-array.
offsetGet è invocato quando si tenta di leggere un valore all’indice specificato.
offsetSet è chiamato quando si tenta di scrivere un valore all’indice specificato.
offsetUnset è invocato quando si tenta di cancellare un valore all’indice specificato.
Esempio ArrayAccess
Di seguito un esempio dove mostrerò come unire le potenzialità di un oggetto al pratico sistema di gestione degli array.
Il codice nell’esempio ovviamente è solo parzialmente scritto in quanto serve solo a far capire il funzionamento di questo overload.
Ho creato una classe Impiegati che rappresenta una lista di impiegati e i lori stipendi gestita come se fosse un array, ma essendo anche un oggetto potrà vantare altri metodi per avviare operazioni più complesse come la stampa su schermo dell’intera lista degli impiegati o il salvataggio di quest’ultima su un file esterno.
<?php
class Impiegati implements ArrayAccess
{
private $lista;
public function Impiegati()
{
$this->lista = array();
}
private function convertiChiave($chiave)
{ return ucwords(strtolower($chiave)); }
function offsetExists($nome)
{
/* Converto la chiave dell'array assicurandomi che sia sempre minuscola
con la sola iniziale maiuscola in modo da rendere gli accessi case-insensitive
NOTA : le chiavi degli array nel linguaggio nativo sono invece case-sensitive */
$nome = $this->convertiChiave($nome);
foreach ($this->lista as $chiave => $valore)
if ($chiave == $nome)
return true;
return false;
}
function offsetGet($nome)
{
$nome = $this->convertiChiave($nome);
if ($this->offsetExists($nome))
return $this->lista[$nome];
else
return NULL;
}
function offsetSet($nome, $valore)
{
$nome = $this->convertiChiave($nome);
$this->lista[$nome] = $valore;
}
function offsetUnset($nome)
{
$nome = $this->convertiChiave($nome);
if ($this->offsetExists($nome))
$this->lista[$nome] = "Licenziato";
}
public function mostraStipendi()
{
foreach ($this->lista as $chiave => $valore)
{
if ($valore == "Licenziato")
{ echo "$chiave è stato $valore<br />n"; }
else
{ echo "$chiave ha uno stipendio di $valore euro<br />n"; }
}
}
public function salvaSuFile($nomefile)
{
/* Codice per salvare la lista degli impiegati su file
...
*/
}
}
$impiegati = new Impiegati();
$impiegati["Mario"] = 1250;
$impiegati["Luca"] = 2300;
$impiegati["Giovanni"] = 1570;
$impiegati["MARIO"] = 3740; // Sovrascrive "Mario" perchè converto sempre la chiave : ucwords(strtolower($chiave))
// Licenzia Luca
unset($impiegati["Luca"]);
$impiegati->mostraStipendi();
?>
L’esempio produce il seguente risultato :
Mario ha uno stipendio di 3740 euro
Luca è stato Licenziato
Giovanni ha uno stipendio di 1570 euro
Versione originale dell’articolo
Lezione Precedente -> Guida Php – I metodi magici __sleep() __wakeup e __set_state()
Lezione Successiva -> Guida Php – Overload dell’interfaccia di iterazione
