En plus de restreindre l'accès, la méthode d'accès détermine également quelle méthode sera appelée par la sous-classe ou quelle propriété sera accédée par la sous-classe. La relation entre les appels de fonction et la fonction elle-même, et la relation entre l'accès des membres et les adresses mémoire variables, est appelé liaison.
En langage informatique, il existe deux méthodes principales de liaison : La liaison statique et la liaison dynamique se produisent entre les structures de données et les structures de données, avant que le programme ne soit exécuté au moment de la compilation, il ne peut donc utiliser aucun moteur d'exécution. Il cible les appels de fonction et le corps de la fonction, ou les variables et les blocs en mémoire. Étant donné que PHP est un langage dynamique, il n'utilise pas de liaison statique. Cependant, il peut simuler
l'accès dynamique aux cibles généré lors de l'exécution
.Les requêtes utilisent uniquement les informations disponibles au moment de l'exécution. Dans le code orienté objet, la liaison dynamique signifie que la décision concernant la méthode appelée ou la propriété à laquelle on accède sera basée sur la classe elle-même et non sur la portée d'accès
des membres publics et protégés
.similaire aux actions de fonction dans les versions précédentes de PHP, utilisant la liaison dynamique. Cela signifie que si une méthode accède à un membre de classe qui est remplacé dans une sous-classe et est une instance de la sous-classe, le membre de la sous-classe sera accédé (au lieu d'accéder aux membres). dans la classe parent).
Voir la figure 1. Ce code affiche "Hé ! Je suis Son." Parce que lorsque PHP appelle getSalutation, c'est une instance de Son, qui écrase la salutation dans Father Come. produira le même résultat. La substitution d'une méthode fonctionne de la même manière. Dans Son, l'appel à identifier est lié à cette méthode.
Même dans les sous-classes, le mode d'accès est affaibli de protected à public, une liaison dynamique se produira toujours.
principe d'utilisation des méthodes d'accès, il estimpossible
d'améliorer les restrictions d'accès sur les membres dela
classe. Par conséquent, changer la méthode d'accès de public à protected est impossible.
Père de classe
{
protected $salutation = "Bonjour !"; //Salutations
fonction publique getSalutation()
{
print("$this->salutationn");
$this->identifier();
}
fonction protégée identifier()
{
print("Je suis Père.n");
}
} ;
la classe Fils étend le Père
{
protected $salutation = "Hey!"; //protected $salutation dans la classe parent est écrasé
protected function identifier() //protected identifier() dans la classe parent est écrasé
{
print("Je suis Fils.n");
}
};
$obj = nouveau Fils();
$obj->getSalutation(); //Sortie Hé ! Je suis fils.
?>
//Remarque : getSalutation() n'est pas remplacé dans la sous-classe, mais il y a en fait toujours un getSalutation() et identifier() dans cette classe
//sont identiques à getSalutation() dans l'instance de Son
.sous-classe La méthode est liée dynamiquement, donc l'appel de la méthode getSalutation() de l'instance Son
appellera le membre salutation et identifier() dans la classe Son, plutôt que le membre salutation et identifier() dans la classe parente
. dans eux À l'intérieur de la classe où il se trouve. Contrairement aux membres publics et protégés, PHP simule la liaison statique. Voir l'exemple de la figure 2. Il affiche "Bonjour ! Je suis Père.", même si la sous-classe remplace la valeur de la salutation. . Le script this- >salutation est lié à la classe actuelle Father Des principes similaires s'appliquent à la méthode privée identifier()
et aux membres privés
<?php.
Père de classe
{
private $salutation = "Bonjour !";
public function getSalutation()
{
print("$this->salutationn");
$this->identifier();
}
fonction privée identifier()
{
print("Je suis Père.n");
}
}
Le fils de classe étend le père
{
private $salutation = "Hé !";
fonction privée identifier()
{
print("Je suis Fils.n");
}
}
$obj = nouveau Fils();
$obj->getSalutation(); //Sortie Bonjour, je suis Père.
?>
L'avantage de la liaison dynamique est qu'elle permet aux classes héritées de modifier le comportement de la classe parent tout en conservant l'interface et les fonctions de la classe parent. Voir l'exemple Figure 3. En raison de l'utilisation de la liaison dynamique, la version de isAuthorized est appelée.
dans deleteUser peut Déterminé par le type d'objet
. S'il s'agit d'un utilisateur ordinaire, PHP appelant User::isAuthorized retournera FALSE S'il s'agit d'une instance de AuthorizedUser, PHP appelant AuthorizedUser::isAuthorized permettra à deleteUser de s'exécuter en douceur.
haohappy Remarque : use Pour le dire clairement en une phrase, il s'agit de la liaison des types d'objet, des méthodes et des attributs. Lors de l'appel d'une méthode qui existe à la fois dans la classe parent et dans la sous-classe ou lors de l'accès à un attribut, il déterminera d'abord quel type d'objet. à laquelle appartient l'instance, puis appeler la méthode dans la classe correspondante.Et les attributs.Avantages
de la liaison dynamique
<?php.
classe Utilisateur //utilisateur
{
fonction protégée isAuthorized() //Qu'il s'agisse d'un utilisateur authentifié
{
retour(FAUX);
}
fonction publique getName() //Obtenir le nom
{
return($this->nom);
}
fonction publique deleteUser($username) //Supprimer l'utilisateur
{
si(!$this->isAuthorized())
{
print("Vous n'êtes pas autorisé.n");
retour(FAUX);
}
//supprime l'utilisateur
print("Utilisateur supprimé.n");
}
}
la classe AuthorizedUser étend l'utilisateur //Utilisateur d'authentification
{
fonction protégée isAuthorized() //écraser isAuthorized()
{
retourner(VRAI);
}
}
$user = nouvel utilisateur ;
$admin = nouvel utilisateur autorisé ;
//non autorisé
$user->deleteUser("Zeev");
//autorisé
$admin->deleteUser("Zeev");
?>
Pourquoi les membres de classe privée simulent-ils la liaison statique ? Pour répondre à cette question, vous devez rappeler pourquoi vous avez besoin d'avoir des membres privés. Quand est-il judicieux de les utiliser à la place de membres protégés
uniquement si vous ne le souhaitez pas
?sous-classes à hériter Utilisé uniquement lors de la modification ou de la spécialisation du comportement d'une classe parent. C'est plus rare que vous ne le pensez. En général, une bonne hiérarchie d'objets devrait permettre à la plupart des fonctionnalités d'être spécialisées, améliorées ou modifiées par les sous-classes. principes fondamentaux de la programmation orientée objet. Les méthodes ou variables privées sont nécessaires dans certaines situations, par exemple lorsque vous êtes sûr de ne pas autoriser une sous-classe à modifier une partie spécifique de la classe parent.