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. heißt Bindung.
In Computersprachen gibt es zwei Haupttypen der Bindung: statische Bindung und dynamische Bindung. Die statische Bindung erfolgt zwischen Datenstrukturen und Datenstrukturen, bevor das Programm ausgeführt wird. Die statische Bindung erfolgt zur Kompilierungszeit und kann daher keine Laufzeitinformationen nutzen. Es zielt auf Funktionsaufrufe und den Hauptteil einer Funktion oder auf Variablen und Speicherblöcke ab. Da PHP eine dynamische Sprache ist, verwendet es keine statische Bindung. Aber statische Bindung kann simuliert werden.
Die dynamische Bindung verwendet nur zur Laufzeit verfügbare Informationen für während der Laufzeit generierte Zugriffsanforderungen. Bei objektorientiertem Code bedeutet dynamische Bindung, dass die Entscheidung darüber, welche Methode aufgerufen oder auf welche Eigenschaft zugegriffen wird, auf der Klasse selbst und nicht auf dem Zugriffsbereich basiert.
Die Aktionen öffentlicher und geschützter Mitglieder ähneln den Aktionen von Funktionen in früheren Versionen von PHP und verwenden dynamische 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 das Mitglied in der übergeordneten Klasse zuzugreifen).
Schauen Sie sich Beispiel 6.10 an. Dieser Code gibt „Hey! Ich bin Sohn“ aus. Denn wenn PHP getSalutation aufruft, wird die Anrede in „Vater“ überschrieben Die Funktionsweise der überschriebenen Methode ist sehr ähnlich. In Son sind Aufrufe zur Identifizierung an diese Methode gebunden.
Selbst wenn die Zugriffsmethode in einer Unterklasse von „geschützt“ auf „öffentlich“ abgeschwächt wird, erfolgt weiterhin eine dynamische Bindung. Gemäß dem Prinzip der Verwendung von Zugriffsmethoden ist es nicht möglich, die Zugriffsbeschränkungen für Klassenmitglieder zu erhöhen, sodass die Zugriffsmethode von „öffentlich“ auf „öffentlich“ geändert wird Geschützt geht nicht weiter.
Listing 6.10 Dynamische Bindung, dynamische Bindungsklasse
Vater
{
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 getSalutation() in dieser Klasse
// Dynamisch an die getSalutation()-Methode in der Instanz der Son-Unterklasse gebunden, sodass die getSalutation()-Methode der Son-Instanz aufgerufen wird.
//Die Mitgliedsgrüße und Identify() in der Son-Klasse werden anstelle der Mitgliedsgrüße und Identify() in der übergeordneten Klasse aufgerufen.
Im Gegensatz zu öffentlichen und geschützten Mitgliedern existieren PHP nur innerhalb der Klasse simuliert statische Bindung. Siehe Beispiel 6.11. Es gibt „Hallo! Ich bin Vater“ aus. Obwohl die Unterklasse den Wert der Anrede überschreibt, bindet das Skript this->salutation an die aktuelle Klasse „Vater“. Ein ähnliches Prinzip gilt für die private Methode „identify()“.
Listing 6.11 Bindung und private Member
-Klasse Father
{
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. Aufgrund der Verwendung der dynamischen Bindung wird die Version von isAuthorized aufgerufen deleteUser kann durch den Objekttyp bestimmt werden. Wenn es sich um einen normalen Benutzer handelt, gibt PHP beim Aufruf von User::isAuthorized FALSE zurück. Wenn es sich um eine Instanz von AuthorizedUser handelt, ermöglicht der PHP-Aufruf von AuthorizedUser::isAuthorized die reibungslose Ausführung von deleteUser.
//haohappy Hinweis: Um es klar in einem Satz auszudrücken: Es handelt sich um Objekttyp und Methode, Attributbindung. Wenn eine Methode aufgerufen wird, die sowohl in der übergeordneten Klasse als auch in der Unterklasse vorhanden ist, oder auf ein Attribut zugegriffen wird, wird zunächst ermittelt, um welchen Objekttyp es sich handelt Instanz gehört, und rufen Sie dann Methoden und Eigenschaften in der entsprechenden Klasse auf.
Listing 6.12 Vorteile der dynamischen Bindungsklasse
User //User
{
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. Dies kommt weniger häufig vor, als Sie vielleicht denken. Im Allgemeinen sollte eine gute Objekthierarchie die Spezialisierung, Verbesserung oder Änderung der meisten Funktionen durch Unterklassen ermöglichen der Grundlagen der objektorientierten Programmierung. Private Methoden oder Variablen werden in bestimmten Situationen benötigt, beispielsweise wenn Sie sicher sind, dass Sie nicht zulassen möchten, dass eine Unterklasse einen bestimmten Teil der übergeordneten Klasse ändert.