Читать книгу Programmieren mit PHP - Andreas Hitzig - Страница 5
Sicht von außen und innen
ОглавлениеHaben Sie bereits in der Vergangenheit mit objektorientierten Sprachen gearbeitet, dann kennen Sie die unterschiedlichen Sichtweisen auf die Elemente einer Klasse von innen und von außen. Greifen Sie mit Ihrer Anwendung von außen auf die Elemente und Objekte einer Klasse zu, sehen Sie lediglich alle, die mit public deklariert sind. Wie nicht anders zu erwarten, verhält sich auch PHP 5 nicht anders, wenn Sie versuchen, mit einer foreach-Abfrage alle Eigenschaften einer Klasse zu ermitteln: Sie werden immer nur die öffentlichen, mit public definierten sehen, falls Sie sich außerhalb der Klasse befinden. Lediglich innerhalb einer Klasse stehen auch die privaten Eigenschaften zur Verfügung:
class meine_Getraenkeliste {
public $liebling_1 = 'Sprudel';
public $liebling_2 = 'Apfelsaft';
public $liebling_3 = 'Coca Cola';
protected $liebling_4 = 'Schnaps';
private $liebling_5 = 'Bier'; }
$getraenke = new
meine_Getraenkeliste();
foreach
($getraenke as $key => $value) {
echo $key.'-'.$value.'<br>'; }
Die Klasse meine_Getraenkeliste enthält insgesamt fünf Eigenschaften: liebling_1 bis liebling_5. Die ersten drei Eigenschaften sind als public definiert, also auch entsprechend von außen sichtbar. Die letzten beiden sind protected und private, somit nur innerhalb der Klasse verfügbar. Erzeugen Sie anschließend eine Variable der Klasse meine_Getraenkeliste, so enthält diese wie bereits erwartet lediglich die drei Eigenschaften, die von außen sichtbar sind. Diese werden entsprechend bei der foreach-Schleife ausgegeben. Benötigen Sie jedoch zusätzlich noch Zugriff auf die beiden geschützten Eigenschaften liebling_4 und liebling_5, hatten Sie nur wenige Möglichkeiten. Am einfachsten war eine öffentliche Funktion, welche kurzfristigen Zugriff auf die Elemente ermöglichte:
public function mache_sichtbar() {
foreach($this as $key => $value) {
print $key.'-'.$value.'<br>';
}
}
Diese können Sie von jeder beliebigen Stelle aus aufrufen. In PHP 5 gibt es allerdings eine neue Schnittstelle namens Iterator. Sie bietet Ihnen mehrere Methoden für den Zugriff auf Objekte, welche diese Schnittstelle unterstützen:
rewind() setzt den Zeiger zurück und startet mit dem ersten Element des Arrays,
valid() überprüft, ob Sie nach einem rewind() oder next() ein Element im Zugriff haben,
key() enthält den Schlüssel des aktuellen Elements,
current() entsprechend den Wert des aktuellen Elements,
next() bewegt den Zeiger auf das nächste Element des Arrays.
Das Beispiel in Listing 1 implementiert eine einfache Klasse mein_Iterator mit allen verfügbaren Methoden.
LISTING 1: IMPLEMENTIERUNG
class mein_Iterator implements
Iterator {
private $position = 0;
private $array = array(
"Element1",
"Element2",
"Element3",
);
public function __construct() {
$this->position = 0;
}
function rewind() {
$this->position = 0;
}
function current() {
return $this->array
[$this->position];
}
function key() {
return $this->position;
}
function next() {
++$this->position;
}
function valid() {
return isset($this->array
[$this->position]);
}
}
$mein_it = new mein_Iterator;
foreach($mein_it as $key => $value) {
var_dump($key, $value);
echo "\n";
}
Das Array enthält drei Elemente: Element1, Element2 und Element3. Wenn Sie den Zeiger mit foreach innerhalb des Arrays bewegen, können Sie die zugeordneten Methoden aufrufen und diese entsprechend einsetzen. Im Beispiel wird lediglich der jeweilige Wert und der Name des Schlüssels ausgegeben.