Die Schnittstelle ArrayAccess

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.

Abbildung 3.3. Die Schnittstelle ArrayAccess

Die Schnittstelle ArrayAccess


Die vier zu implementierenden Methoden sind:

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