Die Zugriffsmethode von PHP5 ermöglicht die Beschränkung des Zugriffs auf Klassenmitglieder. Dies ist eine neue Funktion in PHP5, die jedoch in vielen objektorientierten Sprachen schon seit langem existiert. Mit Zugriffsmethoden können Sie eine zuverlässige objektorientierte Anwendung entwickeln und eine wiederverwendbare objektorientierte Klassenbibliothek erstellen.
Wie C++ und Java verfügt PHP über drei Zugriffsmethoden: öffentlich, privat und geschützt. Die Zugriffsmethode für ein Klassenmitglied kann auch öffentlich sein Statische Mitglieder geben eine Zugriffsmethode vor dem Schlüsselwort „public static“ an. Auf
öffentliche Eigenschaften kann ohne Einschränkungen zugegriffen werden Rufen Sie irgendwo eine öffentliche Methode auf. In früheren PHP-Versionen waren alle Methoden und Eigenschaften öffentlich, wodurch Objekte wie gut strukturierte Arrays aussahen.
Private Mitglieder sind nur innerhalb der Klasse sichtbar. Sie können den Wert einer privaten Eigenschaft außerhalb der Klassenmethode, in der sie sich befindet, nicht ändern oder lesen. Ebenso können nur Methoden in derselben Klasse eine private Methode aufrufen, und geerbte Unterklassen können nicht auf private Mitglieder in der übergeordneten Klasse zugreifen.
Beachten Sie, dass auf private Mitglieder von jedem Mitglied der Klasse und von Instanzen der Klasse zugegriffen werden kann. In Beispiel 6.8 vergleicht die Methode „equals“ zwei Objekte derselben Klasse, aber in diesem Beispiel hat jede Objektinstanz eine eindeutige ID. Die Methode „equals“ vergleicht nur Namen und Preis. Beachten Sie, wie die Methode equal auf die private Eigenschaft einer anderen Widget-Instanz zugreift. Sowohl Java als auch C ermöglichen dies.
Listing 6.8
Widget für die private Member-Klasse
{
privater $name;
privater $preis;
private $id;
öffentliche Funktion __construct($name, $price)
{
$this->name = $name;
$this->price = floatval($price);
$this->id = uniqid();
}
//prüft, ob zwei Widgets gleich sind öffentliche Funktion equal($widget)
{
return(($this->name == $widget->name)AND ($this->price == $widget->price));
}
}
$w1 = neues Widget('Cog', 5.00);
$w2 = neues Widget('Cog', 5.00);
$w3 = neues Widget('Gear', 7.00);
//TRUE
if($w1->equals($w2))
{
print("w1 und w2 sind das gleiche n");
}
//FALSCH
if($w1->equals($w3))
{
print("w1 und w3 sind das gleiche n");
}
//FALSE, == schließt die ID in den Vergleich ein
if($w1 == $w2) //nicht gleich, da die IDs unterschiedlich sind
{
print("w1 und w2 sind das gleiche n");
}
?>
Wenn Sie neu in der objektorientierten Programmierung sind, fragen Sie sich vielleicht, was der Zweck der Verwendung privater Member ist. Sie erinnern sich vielleicht an die Ideen der Kapselung und Kopplung, die wir zu Beginn dieses Kapitels besprochen haben. Private Mitglieder helfen dabei, Daten innerhalb einer Klasse zu kapseln und so den Zugriff durch Code außerhalb der Klasse zu verhindern. Wenn Code außerhalb der Datenstruktur nicht direkt auf die internen Eigenschaften zugreifen kann, besteht keine implizite Korrelation.
Natürlich können die meisten privaten Eigenschaften weiterhin von externem Code gemeinsam genutzt werden. Die Lösung besteht darin, ein Paar öffentlicher Methoden zu verwenden: eine ist get (Wert der Eigenschaft abrufen) und die andere ist set (Wert der Eigenschaft festlegen). Konstruktoren akzeptieren auch Anfangswerte für Eigenschaften. Dies ermöglicht die Kommunikation zwischen Mitgliedern über eine schmale, gut qualifizierte Schnittstelle. Dies bietet auch die Möglichkeit, die an die Methode übergebenen Werte zu ändern Machen Sie den Preis zu einer Float-Zahl (floadval()).
Auf geschützte (geschützte) Mitglieder können alle Methoden derselben Klasse und alle Methoden in geerbten Klassen zugreifen. Öffentliche Eigenschaften widersprechen dem Geist der Kapselung, da sie es Unterklassen ermöglichen, sich beim Schreiben auf eine bestimmte Eigenschaft zu verlassen. Bei geschützten Methoden muss eine Unterklasse die Struktur ihrer übergeordneten Klasse genau kennen .
Beispiel 6.9 wurde gegenüber Beispiel 6.8 verbessert und enthält eine Thing-Unterklasse von Widget. Beachten Sie, dass Widget jetzt über eine geschützte Methode namens getName verfügt. Wenn eine Instanz von Widget versucht, die geschützte Methode aufzurufen, tritt ein Fehler auf: $w1->getName() generiert einen Fehler, aber die getName-Methode in der Unterklasse Thing kann diese geschützte Methode aufrufen Natürlich ist dieses Beispiel zu einfach, um zu beweisen, dass die Methode Widget::getName geschützt ist. In tatsächlichen Situationen hängt die Verwendung der geschützten Methode vom Verständnis der internen Struktur des Objekts ab.
Listing 6.9
Widget für geschützte Member-Klasse
{
privater $name;
privater $preis;
private $id;
öffentliche Funktion __construct($name, $price)
{
$this->name = $name;
$this->price = floatval($price);
$this->id = uniqid();
}
//prüft, ob zwei Widgets gleich sind
öffentliche Funktion equal($widget)
{
return(($this->name == $widget->name)AND($this->price == $widget->price));
}
geschützte Funktion getName()
{
return($this->name);
}
}
Klasse Thing erweitert Widget
{
private $color;
öffentliche Funktion setColor($color)
{
$this->color = $color;
}
öffentliche Funktion getColor()
{
return($this->color);
}
öffentliche Funktion getName()
{
return(parent::getName());
}
}
$w1 = neues Widget('Cog', 5.00);
$w2 = new Thing('Cog', 5.00);
$w2->setColor('Yellow');
//TRUE (immer noch!) Das Ergebnis ist immer noch wahr
if($w1->equals($w2))
{
print("w1 und w2 sind das gleiche n");
}
// Cog-Ausgabe Cog drucken
print($w2->getName());
?>
Eine Unterklasse kann die Methodenzugriffsmethode ändern, indem sie die Methode der übergeordneten Klasse überschreibt. Es gibt jedoch immer noch einige Einschränkungen. Wenn Sie ein öffentliches Klassenmitglied überschreiben, muss es in seinen Unterklassen öffentlich bleiben. Wenn Sie ein geschütztes Mitglied überschreiben, kann es geschützt bleiben oder zu öffentlichen Mitgliedern werden, die nur in der aktuellen Klasse sichtbar sind. Durch die Deklaration eines Mitglieds mit demselben Namen wie ein privates Mitglied der übergeordneten Klasse wird lediglich ein anderes Mitglied in der aktuellen Klasse erstellt. Daher können Sie ein privates Mitglied technisch gesehen nicht überschreiben.
Das Schlüsselwort Final ist eine weitere Möglichkeit, den Zugriff auf Mitgliedsmethoden einzuschränken. Unterklassen können keine Methoden überschreiben, die in der übergeordneten Klasse als final markiert sind, und das Schlüsselwort Final kann nicht für Attribute verwendet werden.