Objektorientiertes PHP mit Klassen und Objekten
() translation by (you can also view the original English article)
In diesem Artikel werden wir die Grundlagen der objektorientierten Programmierung in PHP untersuchen. Wir beginnen mit einer Einführung in Klassen und Objekte und werden in der zweiten Hälfte dieses Artikels einige fortgeschrittene Konzepte wie Vererbung und Polymorphismus diskutieren.
Was ist objektorientierte Programmierung (OOP)?
Objektorientierte Programmierung, allgemein als OOP bezeichnet, ist ein Ansatz, mit dem Sie komplexe Anwendungen auf eine Weise entwickeln können, die auf lange Sicht leicht zu warten und skalierbar ist. In der Welt von OOP werden reale Entitäten wie Person
, Car
oder Animal
als Objekte behandelt. Bei der objektorientierten Programmierung interagieren Sie mit Ihrer Anwendung mithilfe von Objekten. Dies steht im Gegensatz zur prozeduralen Programmierung, bei der Sie hauptsächlich mit Funktionen und globalen Variablen interagieren.
In OOP gibt es ein Konzept der "class", mit dem eine reale Entität modelliert oder einer Vorlage aus Daten (Eigenschaften) und Funktionen (Methoden) zugeordnet wird. Ein "object" ist eine Instanz einer Klasse, und Sie können mehrere Instanzen derselben Klasse erstellen. Es gibt eine einzelne Person
klasse, aber viele Personenobjekte können Instanzen dieser Klasse sein - dan
, zainab
, hector
usw.
Die Klasse definiert Eigenschaften. Für die Person-Klasse haben wir beispielsweise name
, age
und phoneNumber
. Dann hat jedes Personenobjekt seine eigenen Werte für diese Eigenschaften.
Sie können in der Klasse auch Methoden definieren, mit denen Sie die Werte von Objekteigenschaften bearbeiten und Operationen an Objekten ausführen können. Als Beispiel könnten Sie eine save
-Methode definieren, mit der die Objektinformationen in einer Datenbank gespeichert werden.
Was ist eine PHP-Klasse?
Eine Klasse ist eine Vorlage, die eine reale Entität darstellt und Eigenschaften und Methoden der Entität definiert. In diesem Abschnitt werden wir die grundlegende Anatomie einer typischen PHP-Klasse diskutieren.
Der beste Weg, neue Konzepte zu verstehen, ist ein Beispiel. Schauen wir uns also die Employee
-Klasse im folgenden Snippet an, die die Mitarbeiterentität darstellt.
1 |
<?php
|
2 |
class Employee |
3 |
{
|
4 |
private $first_name; |
5 |
private $last_name; |
6 |
private $age; |
7 |
|
8 |
public function __construct($first_name, $last_name, $age) |
9 |
{
|
10 |
$this->first_name = $first_name; |
11 |
$this->last_name = $last_name; |
12 |
$this->age = $age; |
13 |
}
|
14 |
|
15 |
public function getFirstName() |
16 |
{
|
17 |
return $this->first_name; |
18 |
}
|
19 |
|
20 |
public function getLastName() |
21 |
{
|
22 |
return $this->last_name; |
23 |
}
|
24 |
|
25 |
public function getAge() |
26 |
{
|
27 |
return $this->age; |
28 |
}
|
29 |
}
|
30 |
?>
|
Die class Employee
-Anweisung in der ersten Zeile definiert die Employee
-Klasse. Anschließend deklarieren wir die Eigenschaften, den Konstruktor und die anderen Klassenmethoden.
Klasseneigenschaften in PHP
Sie können sich Klasseneigenschaften als Variablen vorstellen, die Informationen über das Objekt enthalten. Im obigen Beispiel haben wir drei Eigenschaften definiert: first_name
, last_name
und age
. In den meisten Fällen wird auf Klasseneigenschaften über instanziierte Objekte zugegriffen.
Diese Eigenschaften sind private
, dh, sie können nur innerhalb der Klasse aufgerufen werden. Dies ist die sicherste Zugriffsebene für Immobilien. Wir werden die verschiedenen Zugriffsebenen für Klasseneigenschaften und -methoden später in diesem Artikel erläutern.
Konstruktoren für PHP-Klassen
Ein Konstruktor ist eine spezielle Klassenmethode, die automatisch aufgerufen wird, wenn Sie ein Objekt instanziieren. Wir werden in den nächsten Abschnitten sehen, wie Objekte instanziiert werden. Im Moment müssen Sie jedoch nur wissen, dass ein Konstruktor zum Initialisieren von Objekteigenschaften verwendet wird, wenn das Objekt erstellt wird.
Sie können einen Konstruktor definieren, indem Sie die Methode __construct
definieren.
Methoden für PHP-Klassen
Wir können uns Klassenmethoden als Funktionen vorstellen, die bestimmte Aktionen ausführen, die mit Objekten verknüpft sind. In den meisten Fällen werden sie verwendet, um auf Objekteigenschaften zuzugreifen, diese zu bearbeiten und verwandte Vorgänge auszuführen.
Im obigen Beispiel haben wir die Methode getLastName
definiert, die den dem Objekt zugeordneten Nachnamen zurückgibt.
Das ist also eine kurze Einführung in die Klassenstruktur in PHP. Im nächsten Abschnitt erfahren Sie, wie Sie Objekte der Employee
-Klasse instanziieren.
Was ist ein Objekt in PHP?
Im vorherigen Abschnitt haben wir die Grundstruktur einer Klasse in PHP besprochen. Wenn Sie eine Klasse verwenden möchten, müssen Sie sie instanziieren, und das Endergebnis ist ein Objekt. Wir könnten uns also eine Klasse als Blaupause vorstellen, und ein Objekt ist eine tatsächliche Sache, mit der Sie arbeiten können.
Lassen Sie uns im Kontext der Employee
-Klasse, die wir gerade im vorherigen Abschnitt erstellt haben, sehen, wie ein Objekt dieser Klasse instanziiert wird.
1 |
<?php
|
2 |
$objEmployee = new Employee('Bob', 'Smith', 30); |
3 |
|
4 |
echo $objEmployee->getFirstName(); // print 'Bob' |
5 |
echo $objEmployee->getLastName(); // prints 'Smith' |
6 |
echo $objEmployee->getAge(); // prints '30' |
7 |
?>
|
Sie müssen das new
Schlüsselwort verwenden, wenn Sie ein Objekt einer Klasse zusammen mit dem Klassennamen instanziieren möchten, und Sie erhalten eine neue Objektinstanz dieser Klasse zurück.
Wenn eine Klasse die __construct
-Methode definiert hat und Argumente benötigt, müssen Sie diese Argumente übergeben, wenn Sie ein Objekt instanziieren. In unserem Fall benötigt der Employee
-Klassenkonstruktor drei Argumente. Daher haben wir diese beim Erstellen des $objEmployee
-Objekts übergeben. Wie bereits erwähnt, wird die __construct
-Methode automatisch aufgerufen, wenn das Objekt instanziiert wird.
Als Nächstes haben wir Klassenmethoden für das $objEmployee
-Objekt aufgerufen, um die Informationen zu drucken, die während der Objekterstellung initialisiert wurden. Natürlich können Sie mehrere Objekte derselben Klasse erstellen, wie im folgenden Snippet gezeigt.
1 |
<?php
|
2 |
$objEmployeeOne = new Employee('Bob', 'Smith', 30); |
3 |
|
4 |
echo $objEmployeeOne->getFirstName(); // prints 'Bob' |
5 |
echo $objEmployeeOne->getLastName(); // prints 'Smith' |
6 |
echo $objEmployeeOne->getAge(); // prints '30' |
7 |
|
8 |
$objEmployeeTwo = new Employee('John', 'Smith', 34); |
9 |
|
10 |
echo $objEmployeeTwo->getFirstName(); // prints 'John' |
11 |
echo $objEmployeeTwo->getLastName(); // prints 'Smith' |
12 |
echo $objEmployeeTwo->getAge(); // prints '34' |
13 |
?>
|
Das folgende Bild ist eine grafische Darstellung der Employee-Klasse und einiger ihrer Instanzen.



Einfach ausgedrückt ist eine Klasse eine Blaupause, mit der Sie strukturierte Objekte erstellen können.
Verkapselung
Im vorherigen Abschnitt haben wir erläutert, wie Objekte der Employee
-Klasse instanziiert werden. Es ist interessant festzustellen, dass das $objEmployee
-Objekt selbst Eigenschaften und Methoden der Klasse zusammenfasst. Mit anderen Worten, es verbirgt diese Details vor dem Rest des Programms. In der Welt von OOP wird dies als Datenkapselung bezeichnet.
Die Kapselung ist ein wichtiger Aspekt von OOP, mit dem Sie den Zugriff auf bestimmte Eigenschaften oder Methoden des Objekts einschränken können. Und das bringt uns zu einem anderen Thema zur Diskussion: Zugriffsebenen.
Zugriffsebenen
Wenn Sie eine Eigenschaft oder Methode in einer Klasse definieren, können Sie deklarieren, dass sie eine dieser drei Zugriffsebenen hat - public
, private
, und protected
.
Öffentlicher Zugang
Wenn Sie eine Eigenschaft oder Methode als öffentlich deklarieren, kann von überall außerhalb der Klasse darauf zugegriffen werden. Der Wert einer öffentlichen Eigenschaft kann von überall in Ihrem Code geändert werden.
Schauen wir uns ein Beispiel an, um die öffentliche Zugriffsebene zu verstehen.
1 |
<?php
|
2 |
class Person |
3 |
{
|
4 |
public $name; |
5 |
|
6 |
public function getName() |
7 |
{
|
8 |
return $this->name; |
9 |
}
|
10 |
}
|
11 |
|
12 |
$person = new Person(); |
13 |
$person->name = 'Bob Smith'; |
14 |
echo $person->getName(); // prints 'Bob Smith' |
15 |
?>
|
Wie Sie im obigen Beispiel sehen können, haben wir die Eigenschaft name
als öffentlich deklariert. Daher können Sie es von überall außerhalb der Klasse einstellen, wie wir es hier getan haben.
Privater Zugang
Wenn Sie eine Eigenschaft oder Methode als private
deklarieren, kann nur innerhalb der Klasse darauf zugegriffen werden. Das bedeutet, dass Sie Getter- und Setter-Methoden definieren müssen, um den Wert dieser Eigenschaft abzurufen und festzulegen.
Lassen Sie uns das vorherige Beispiel noch einmal überarbeiten, um die private Zugriffsebene zu verstehen.
1 |
<?php
|
2 |
class Person |
3 |
{
|
4 |
private $name; |
5 |
|
6 |
public function getName() |
7 |
{
|
8 |
return $this->name; |
9 |
}
|
10 |
|
11 |
public function setName($name) |
12 |
{
|
13 |
$this->name = $name; |
14 |
}
|
15 |
}
|
16 |
|
17 |
$person = new Person(); |
18 |
$person->name = 'Bob Smith'; // Throws an error |
19 |
$person->setName('Bob Smith'); |
20 |
echo $person->getName(); // prints 'Bob Smith' |
21 |
?>
|
Wenn Sie versuchen, von außerhalb der Klasse auf eine private Eigenschaft zuzugreifen, wird der schwerwiegende Fehler ausgegeben. Cannot access private property Person::$name
. Daher müssen Sie den Wert der Privateigenschaft mit der Setter-Methode festlegen, wie wir es mit der setName
-Methode getan haben.
Es gibt gute Gründe, warum Sie eine Immobilie privat machen möchten. Beispielsweise sollte möglicherweise eine Aktion ausgeführt werden (z. B. Aktualisieren einer Datenbank oder erneutes Rendern einer Vorlage), wenn sich diese Eigenschaft ändert. In diesem Fall können Sie eine Setter-Methode definieren und jede spezielle Logik verarbeiten, wenn die Eigenschaft geändert wird.
Gesicherter Zugang
Wenn Sie eine Eigenschaft oder Methode als protected
deklarieren, können dieselbe Klasse, die sie definiert hat, und Klassen, die die betreffende Klasse erben, auf sie zugreifen. Wir werden die Vererbung im nächsten Abschnitt besprechen, damit wir etwas später zur geschützten Zugriffsebene zurückkehren können.
Erbschaft
Vererbung ist ein wichtiger Aspekt des objektorientierten Programmierparadigmas, mit dem Sie Eigenschaften und Methoden anderer Klassen erben können, indem Sie sie erweitern. Die Klasse, die geerbt wird, wird als übergeordnete Klasse bezeichnet, und die Klasse, die die andere Klasse erbt, wird als untergeordnete Klasse bezeichnet. Wenn Sie ein Objekt der untergeordneten Klasse instanziieren, erbt es auch die Eigenschaften und Methoden der übergeordneten Klasse.
Schauen wir uns den folgenden Screenshot an, um das Konzept der Vererbung zu verstehen.



Im obigen Beispiel ist die Person
-Klasse die übergeordnete Klasse, und die Employee
-Klasse erweitert oder erbt die Person-Klasse und wird daher als untergeordnete Klasse bezeichnet.
Lassen Sie uns versuchen, ein Beispiel aus der Praxis durchzugehen, um zu verstehen, wie es funktioniert.
1 |
<?php
|
2 |
class Person |
3 |
{
|
4 |
protected $name; |
5 |
protected $age; |
6 |
|
7 |
public function getName() |
8 |
{
|
9 |
return $this->name; |
10 |
}
|
11 |
|
12 |
public function setName($name) |
13 |
{
|
14 |
$this->name = $name; |
15 |
}
|
16 |
|
17 |
private function callToPrivateNameAndAge() |
18 |
{
|
19 |
return "{$this->name} is {$this->age} years old."; |
20 |
}
|
21 |
|
22 |
protected function callToProtectedNameAndAge() |
23 |
{
|
24 |
return "{$this->name} is {$this->age} years old."; |
25 |
}
|
26 |
}
|
27 |
|
28 |
class Employee extends Person |
29 |
{
|
30 |
private $designation; |
31 |
private $salary; |
32 |
|
33 |
public function getAge() |
34 |
{
|
35 |
return $this->age; |
36 |
}
|
37 |
|
38 |
public function setAge($age) |
39 |
{
|
40 |
$this->age = $age; |
41 |
}
|
42 |
|
43 |
public function getDesignation() |
44 |
{
|
45 |
return $this->designation; |
46 |
}
|
47 |
|
48 |
public function setDesignation($designation) |
49 |
{
|
50 |
$this->designation = $designation; |
51 |
}
|
52 |
|
53 |
public function getSalary() |
54 |
{
|
55 |
return $this->salary; |
56 |
}
|
57 |
|
58 |
public function setSalary($salary) |
59 |
{
|
60 |
$this->salary = $salary; |
61 |
}
|
62 |
|
63 |
public function getNameAndAge() |
64 |
{
|
65 |
return $this->callToProtectedNameAndAge(); |
66 |
}
|
67 |
}
|
68 |
|
69 |
$employee = new Employee(); |
70 |
|
71 |
$employee->setName('Bob Smith'); |
72 |
$employee->setAge(30); |
73 |
$employee->setDesignation('Software Engineer'); |
74 |
$employee->setSalary('30K'); |
75 |
|
76 |
echo $employee->getName(); // prints 'Bob Smith' |
77 |
echo $employee->getAge(); // prints '30' |
78 |
echo $employee->getDesignation(); // prints 'Software Engineer' |
79 |
echo $employee->getSalary(); // prints '30K' |
80 |
echo $employee->getNameAndAge(); // prints 'Bob Smith is 30 years old.' |
81 |
echo $employee->callToPrivateNameAndAge(); // produces 'Fatal Error' |
82 |
?>
|
Hierbei ist zu beachten, dass die Employee
-Klasse das Schlüsselwort extends
verwendet hat, um die Person
-Klasse zu erben. Jetzt kann die Employee
-Klasse auf alle Eigenschaften und Methoden der Person
-Klasse zugreifen, die als öffentlich oder geschützt deklariert sind. (Es kann nicht auf Mitglieder zugreifen, die als privat deklariert sind.)
Im obigen Beispiel kann das $employee
-Objekt auf die Methoden getName
und setName
zugreifen, die in der Person
-Klasse definiert sind, da sie als öffentlich deklariert sind.
Als Nächstes haben wir mit der in der Employee
-Klasse definierten Methode getNameAndAge
auf die Methode callToProtectedNameAndAge
zugegriffen, da sie als geschützt deklariert ist. Schließlich kann das $employee
-Objekt nicht auf die callToPrivateNameAndAge
-Methode der Person
-Klasse zugreifen, da es als privat deklariert ist.
Auf der anderen Seite können Sie das $employee
-Objekt verwenden, um die age
-Eigenschaft der Person
-Klasse festzulegen, wie wir es in der setAge
-Methode getan haben, die in der Employee
-Klasse definiert ist, da die age
-Eigenschaft als geschützt deklariert ist.
Das war also eine kurze Einführung in die Vererbung. Es hilft Ihnen, die Duplizierung von Code zu reduzieren und fördert so die Wiederverwendbarkeit von Code.
Polymorphismus
Polymorphismus ist ein weiteres wichtiges Konzept in der Welt der objektorientierten Programmierung, das sich auf die Fähigkeit bezieht, Objekte basierend auf ihren Datentypen unterschiedlich zu verarbeiten.
Wenn die untergeordnete Klasse beispielsweise im Kontext der Vererbung das Verhalten der übergeordneten Klassenmethode ändern möchte, kann sie diese Methode überschreiben. Dies wird als Methodenüberschreibung bezeichnet. Lassen Sie uns schnell ein Beispiel aus der Praxis durchgehen, um das Konzept des Überschreibens von Methoden zu verstehen.
1 |
<?php
|
2 |
class Message |
3 |
{
|
4 |
public function formatMessage($message) |
5 |
{
|
6 |
return printf("<i>%s</i>", $message); |
7 |
}
|
8 |
}
|
9 |
|
10 |
class BoldMessage extends Message |
11 |
{
|
12 |
public function formatMessage($message) |
13 |
{
|
14 |
return printf("<b>%s</b>", $message); |
15 |
}
|
16 |
}
|
17 |
|
18 |
$message = new Message(); |
19 |
$message->formatMessage('Hello World'); // prints '<i>Hello World</i>' |
20 |
|
21 |
$message = new BoldMessage(); |
22 |
$message->formatMessage('Hello World'); // prints '<b>Hello World</b>' |
23 |
?>
|
Wie Sie sehen, haben wir das Verhalten der formatMessage
-Methode geändert, indem wir es in der BoldMessage
-Klasse überschrieben haben. Wichtig ist, dass eine Nachricht je nach Objekttyp unterschiedlich formatiert wird, unabhängig davon, ob es sich um eine Instanz der übergeordneten Klasse oder der untergeordneten Klasse handelt.
(Einige objektorientierte Sprachen haben auch eine Art Methodenüberladung, mit der Sie mehrere Klassenmethoden mit demselben Namen, aber einer unterschiedlichen Anzahl von Argumenten definieren können. Dies wird in PHP nicht direkt unterstützt, es gibt jedoch einige Problemumgehungen, um ähnliche Ergebnisse zu erzielen Funktionalität.)
Abschluss
Objektorientierte Programmierung ist ein großes Thema, und wir haben nur die Oberfläche seiner Komplexität zerkratzt. Ich hoffe, dass dieses Tutorial Ihnen geholfen hat, mit den Grundlagen von OOP zu beginnen, und dass es Sie motiviert, weiterführende OOP-Themen zu lernen.
- PHPPHP-GrundlagenJeremy McPeak
- PHPPHP Objektorientierte ProgrammiergrundlagenJoost Van Veen
- OOPOOP in PHP mit TestsPatkos Csaba
- PHPPHP-EntwurfsmusterJeremy McPeak
Objektorientierte Programmierung ist ein wichtiger Aspekt in der Anwendungsentwicklung, unabhängig von der Technologie, mit der Sie arbeiten. Heute haben wir im Zusammenhang mit PHP einige grundlegende Konzepte von OOP diskutiert und die Gelegenheit genutzt, einige Beispiele aus der Praxis vorzustellen.
Fühlen Sie sich frei, Ihre Fragen mit dem Feed unten zu posten!