PHP-Klassen
Links
Zielsetzung
Es soll das Grundprinzip der objektorientierten Programmierung gezeigt werden.
Beschreibung
Eine Klasse ist ein Container mit Daten, der zusätzlich Operationen mit diesen Daten durchführen kann.
Eine Klasse beschreibt ein eine zusammengesetzte Entität (Ding oder Idee) aus der realen Welt, analog einer Tabelle in SQL.
Die Attribute der Entität sind die "Klassenvariablen". Die Operationen werden "Methoden" genannt und syntaktisch das gleiche wie Funktionen.
Aufgabe
Wir verwalten die Ergebnisse einer Wahl.
- Erzeuge eine Klasse, die eine Partei mit Name und Prozentzahl sich merkt.
- Erzeuge 3 Instanzen: Grüne 15%, SPD 16% und CDU 26%.
- Erzeuge eine Klasse, die eine Liste von Parteien verwaltet.
- Erzeuge eine Methode add(), die eine Partei einträgt.
- Erzeuge eine Methode, die den Namen, die Prozentzahl und einen Prozentbalken je Partei ausgibt.
Eine PHP-Klasse
<?php
class Person {
public $firstname;
public $lastname;
public $phone;
public function __construct(string $firstname, string $lastname, string $phone){
$this->firstname = $firstname;
$this->lastname = $lastname;
$this->phone = $phone;
}
public function fullname(): string{
return $this->firstname . ' ' . $this->lastname;
}
}
class Users {
private $list = [];
public function add(Person $person){
array_push($this->list, $person);
}
public function phoneList(){
foreach($this->list as $person){
echo $person->fullname(), ": ", $person->phone, "\n";
}
}
public function byFirstname(string $name){
$rc = null;
foreach($this->list as $person){
if ($person->firstname === $name){
$rc = $person;
break;
}
}
return $rc;
}
}
$alice = new Person('Alice', 'Miller', '172-9237239');
echo $alice->fullname(), "\n";
$bob = new Person('Bob', 'Green', '157-2337239');
$charly = new Person('Charly', 'Smith', '157-2337239');
$users = new Users();
$users->add($alice);
$users->add($bob);
$users->add($charly);
$users->phoneList();
echo 'lastname of Bob: ', $users->byFirstname('Bob')->lastname, "\n";
- Eine Klassendefinition beginnt mit class, es folgt ein Klassenname, danach eine geschweifte Klammer.
- Konvention: Klassennamen beginnen mit einem Großbuchstaben.
- Es folgen die Klassenvariablen, hier $firstname, $lastname und $phone. Optional steht vor dem Variablennamen das Zugriffsrecht, hier public.
- Konvention: Klassenvariablennamen beginnen mit einem Kleinbuchstaben.
- Es folgen zwei Methoden. Jede Methode ist syntaktisch eine Funktion.
- Gibt es eine Methode mit dem Namen __construct, ist das eine Funktion, die beim Erzeugen eines Objektes dieser Klasse aufgerufen wird.
- Auf eine Klassenvariable und auf eine Methode kann innerhalb der Klasse mittels $this-> zugegriffen werden:
$this->type = $type;
- Die Klasse endet mit '}'.
- Eine Instanz einer Klasse wird mit new und dem Klassennamen, gefolgt von einem Klammerpaar, erzeugt.
- Innerhalb der Klammer werden die Parameter der Methode __construct gesetzt.
- Eine Methode der Klasse wird mit dem Pfeiloperator -> aufgerufen:
$generator->say();
Die Klasse Person abstrahiert eine reale Person mit den für das Programm notwendigen Attributen.
Die Klasse Users abstrahiert die realen Benutzer als Liste von Personen.
Die Methode fullname() konstruiert aus den Klassenvariablen $this->firstname und $this->lastname den vollständigen Namen. Das ist also eine "Operation" mit den Daten des Klassenobjektes.
Die Methode add() der Klasse Users fügt eine Person zu der Benutzergruppe hinzu, die Methode phoneList() erstellt für alle Benutzer eine Telefonliste.
$alice = new Person('Alice', 'Miller', '172-9237239');
Hier wird ein Objekt der Klasse Person erzeugt, man spricht auch von einer Instanz der Klasse Person.- In gleicher Weise werden zwei weiter Instanzen der Klasse Person erzeugt, nämlich $bob und $charly.
Ein ganz anderes Beispiel:
<?php
class SentenceGenerator {
private $nouns;
private $verbs;
private $adjectives;
public function __construct(array $nouns, array $verbs, array $adjectives){
$this->nouns = $nouns;
$this->verbs = $verbs;
$this->adjectives = $adjectives;
}
private function random(int $max): int{
$rc = rand(0, $max - 1);
return $rc;
}
private function elementOf(array $array): string{
return $array[$this->random(count($array))];
}
public function say(){
$rc = 'A ' . $this->elementOf($this->adjectives) . ' '
. $this->elementOf($this->nouns) . ' '
. $this->elementOf($this->verbs) . ' '
. ' a ' . $this->elementOf($this->adjectives) . ' '
. $this->elementOf($this->nouns);
echo "$rc\n";
}
}
$nouns = ['tiger', 'tree', 'house', 'bicycle', 'pot', 'fish'];
$verbs = ['knows', 'likes', 'makes', 'wins'];
$adjectives = ['dirty', 'green', 'little', 'curious', 'blue', 'pretty'];
$generator = new SentenceGenerator($nouns, $verbs, $adjectives);
for ($ix = 1; $ix < 20; $ix += 1){
$generator->say();
}
- Die Klasse SentenceGenerator realisiert einen Generator für syntaktisch korrekte englische Sätze.
- Die Methode random() liefert eine Zufallszahl, die zwischen 0 und dem Wert von $max liegt, wobei $max selber ausgeschlossen ist. Sie ist private, das bedeutet, die Methode darf nur von der Klasse selber benutzt werden.
- Die Methode elemenntOf() bekommt ein Array als Parameter und liefert ein zufälliges Element aus dieser Liste.
- Die Methode say() gibt einen syntaktisch korrekten Satz mit zufällig ausgewählten Wörtern.
- Der Generator wird initialisiert mit
$generator = new SentenceGenerator($nouns, $verbs, $adjectives);
- Dann werden in einer Schleife 20 Sätze ausgegeben, indem 20 mal die Methode say() aufgerufen wird.