Objekte von Klassen, die die Schnittstelle ArrayAccess
(Abbildung 3.3)
implementieren, können wie normale PHP-Arrays verwendet werden. Der
Unterschied zu diesen ist jedoch, dass der Programmierer festlegen
kann, was beispielsweise bei der Ausführung von
$array[$offset] = $value passieren soll.
Die vier zu implementierenden Methoden sind:
offsetExists($offset) wird für
isset($array[$offset]) aufgerufen.
offsetGet($offset) wird für
$value = $array[$offset] aufgerufen.
offsetSet($offset, $value) wird für
$array[$offset] = $value aufgerufen. Hierbei ist zu
beachten, dass bei Verwendung der $array[] = $value
Syntax $offset den Wert NULL
enthält.
offsetUnset($offset) wird für
unset($array[$offset])
aufgerufen.
Beispiel 3.13
zeigt als Beispiel eine Implementierung der normalen PHP-Array-Datenstruktur
als Klasse unter Verwendung der Schnittstelle ArrayAccess.
Beispiel 3.13: Eine Implementierung der ArrayAccess-Schnittstelle
<?php
class PHPArray implements ArrayAccess {
private $array = array();
public function offsetExists($offset) {
return array_key_exists($this->array, $offset);
}
public function offsetGet($offset) {
return $this->array[$offset];
}
public function offsetSet($offset, $value) {
if (is_null($offset)) {
$this->array[] = $value;
} else {
$this->array[$offset] = $value;
}
}
public function offsetUnset($offset) {
unset($this->array[$offset]);
}
}
$test = new PHPArray;
$test[] = 'Hello'; $test[] = ' World!';
print $test[0] . $test[1];
?>Hello World!
Nachdem wir uns mit der grundsätzlichen Verwendung der Schnittstelle
ArrayAccess vertraut gemacht haben, kommen wir zu
einer möglichen Verwendung.
Im folgenden Beispiel
(Beispiel 3.14)
benutzen wir eine Implementierung der Schnittstelle ArrayAccess,
um ein Array $_SHARED zu erzeugen, auf dessen Inhalt von
unterschiedlichen PHP-Instanzen aus zugegriffen werden kann. Für die
notwendige Datenhaltung benutzen wir die in PHP 5 eingebettete Datenbank
SQLite. Mit Hilfe der ArrayAccess-Implementierung
"verbergen" wir die Datenhaltung vor dem Verwender des Arrays.
Beispiel 3.14: Die Klasse SharedArray
<?php
class SharedArray implements ArrayAccess {
private $db = NULL;
public function __construct() {
if ($this->db === NULL &&
$this->db = sqlite_open('shared_array.db')) {
@sqlite_query(
$this->db,
'CREATE TABLE shared_array
(offset varchar(32) PRIMARY KEY,
value varchar(32));'
);
}
}
public function __destruct() {
if ($this->db !== NULL) {
sqlite_close($this->db);
}
$this->db = NULL;
}
public function offsetExists($offset) {
$result = sqlite_query(
$this->db,
"SELECT offset
FROM shared_array
WHERE offset = '$offset';"
);
if ($result === FALSE) {
return FALSE;
} else {
return TRUE;
}
}
public function offsetGet($offset) {
return sqlite_fetch_single(
sqlite_query(
$this->db,
"SELECT value
FROM shared_array
WHERE offset = '$offset';"
)
);
}
public function offsetSet($offset, $value) {
sqlite_query(
$this->db,
"REPLACE INTO shared_array
(offset, value)
VALUES ('$offset', '$value');"
);
}
public function offsetUnset($offset) {
sqlite_query(
$this->db,
"DELETE FROM shared_array
WHERE offset = '$offset'"
);
}
}
$_SHARED = new SharedArray;
?>