Zusätzlich zur Zugriffsbeschränkung bestimmt die Zugriffsmethode auch, welche Methode von der Unterklasse aufgerufen wird oder auf welche Eigenschaft die Unterklasse zugreift. Die Beziehung zwischen Funktionsaufrufen und der Funktion selbst sowie die Beziehung zwischen Mitgliedszugriff und variablen Speicheradressen. Wird in der Computersprache als Bindung bezeichnet.
Statische Bindung und dynamische Bindung erfolgen vor der Kompilierungszeit des Programms Es zielt auf Funktionsaufrufe und den Funktionskörper oder auf Variablen und Blöcke im Speicher ab, es kann jedoch keine statische Bindung verwenden, sondern
den während der Laufzeit generierten Zugriff
.Anforderungen nutzen nur zur Laufzeit verfügbare Informationen. Bei objektorientiertem Code erfolgt die Entscheidung darüber, welche Methode aufgerufen oder auf welche Eigenschaft zugegriffen wird, auf der Klasse selbst und nicht auf dem
Zugriffsbereich Ähnlich wie Funktionsaktionen in früheren PHP-Versionen, mit dynamischer Bindung. Dies bedeutet, dass, wenn eine Methode auf ein Klassenmitglied zugreift, das in einer Unterklasse überschrieben wird und eine Instanz der Unterklasse ist, auf das Unterklassenmitglied zugegriffen wird (anstatt auf Mitglieder zuzugreifen). in der übergeordneten Klasse).
Dieser Code gibt „Hey! Ich bin Sohn“ aus Das Überschreiben einer Methode erfolgt auf ähnliche Weise. In Son
wird der Zugriffsmodus von protected auf public abgeschwächt Prinzipiell ist es nicht möglich, die Zugriffsbeschränkungen für Klassenmitglieder zu erweitern. Daher ist es nicht möglich, die Zugriffsmethode von „öffentlich“ auf „geschützt“
zu
ändern
Klassenvater
{
protected $salutation = „Hallo!“ //Grüße
public function getSalutation()
;
{
print("$this->salutationn");
$this->identify();
}
geschützte Funktion Identify()
{
print("Ich bin Vater.n");
}
};
Klasse Son erweitert Vater
{
protected $salutation = "Hey!"; //protected $salutation in der übergeordneten Klasse wird überschrieben
protected function identifiziere() //geschützte identifiziere() in der übergeordneten Klasse wird überschrieben
{
print("Ich bin Sohn.n");
}
};
$obj = new Son();
$obj->getSalutation(); //Ausgabe Hey! Ich bin Sohn.
?>
//Hinweis: getSalutation() wird in der Unterklasse nicht überschrieben, aber es gibt tatsächlich immer noch ein getSalutation() in dieser Klasse
//sind dasselbe wie getSalutation() in der Instanz des Sohnes Unterklasse Die Methode ist dynamisch gebunden, sodass beim Aufrufen der getSalutation()-Methode der Son-Instanz
die Mitgliedsgrüße und Identify() in der Son-Klasse aufgerufen werden und nicht die Mitgliedsgrüße und Identify() in der übergeordneten Klasse.
Es gibt nur private Mitglieder In der Klasse, in der es sich befindet, simuliert PHP eine statische Bindung. Siehe das Beispiel in Abbildung 2. Es gibt „Hallo! Ich bin Vater.“ aus, obwohl die Unterklasse den Wert der Anrede überschreibt . Das Skript wird an die aktuelle Klasse „Vater“ gebunden. Ähnliche Prinzipien gelten für die private Methode „identify()
“
.
Klassenvater
{
private $salutation = „Hallo!“
public function getSalutation();
{
print("$this->salutationn");
$this->identify();
}
private Funktion identifiziere()
{
print("Ich bin Vater.n");
}
}
Klasse Son erweitert Vater
{
private $salutation = "Hey!";
private Funktion identifiziere()
{
print("Ich bin Sohn.n");
}
}
$obj = new Son();
$obj->getSalutation(); //Ausgabe Hallo, ich bin Vater.
?>
Der Vorteil der dynamischen Bindung besteht darin, dass geerbte Klassen das Verhalten der übergeordneten Klasse ändern und gleichzeitig die Schnittstelle und Funktionen der übergeordneten Klasse beibehalten können. Siehe Beispiel Abbildung 3. Aufgrund der Verwendung dynamischer Bindung wird die Version von isAuthorized aufgerufen in deleteUser kann Bestimmt durch den Typ des Objekts, gibt PHP beim Aufruf von User::isAuthorized FALSE zurück. Wenn es sich um eine Instanz von AuthorizedUser handelt, ermöglicht der Aufruf von PHP die reibungslose Ausführung von deleteUser
. haohappy Hinweis: Um es klar in einem Satz auszudrücken: Es handelt sich um die Bindung von Objekttypen und Methoden und Attributen. Beim Aufrufen einer Methode, die sowohl in der übergeordneten Klasse als auch in der Unterklasse vorhanden ist, oder beim Zugriff auf ein Attribut wird zunächst ermittelt, welcher Objekttyp vorliegt Die Instanz gehört dazu und ruft dann die Methode in der entsprechenden Klasse auf.
Vorteile der dynamischen Bindung
<?php
Klasse Benutzer //Benutzer
{
protected function isAuthorized() //Ob es sich um einen authentifizierten Benutzer handelt
{
return(FALSE);
}
öffentliche Funktion getName() //Den Namen abrufen
{
return($this->name);
}
öffentliche Funktion deleteUser($username) //Benutzer löschen
{
if(!$this->isAuthorized())
{
print("Sie sind nicht autorisiert.n");
return(FALSE);
}
//den Benutzer löschen
print("Benutzer gelöscht.n");
}
}
Klasse AuthorizedUser erweitert User //Authentifizierungsbenutzer
{
geschützte Funktion isAuthorized() //isAuthorized() überschreiben
{
return(TRUE);
}
}
$user = neuer Benutzer;
$admin = neuer AuthorizedUser;
//nicht autorisiert
$user->deleteUser("Zeev");
//authorized
$admin->deleteUser("Zeev");
?>
Warum simulieren private Klassenmitglieder eine statische Bindung? Wann ist es sinnvoll, sie anstelle von geschützten Mitgliedern zu verwenden
? Zu erbende Unterklassen Wird nur verwendet, wenn das Verhalten einer übergeordneten Klasse geändert oder spezialisiert wird. Im Allgemeinen sollte eine gute Objekthierarchie die Spezialisierung, Verbesserung oder Änderung der meisten Funktionen ermöglichen Grundlagen der objektorientierten Programmierung sind in bestimmten Situationen erforderlich, beispielsweise wenn Sie sicher sind, dass Sie einer Unterklasse nicht erlauben möchten, einen bestimmten Teil der übergeordneten Klasse zu ändern.