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.
Il existe deux principaux types de liaison dans les langages informatiques : la liaison statique et la liaison dynamique. La liaison statique se produit entre les structures de données et les structures de données avant l'exécution du programme. La liaison statique se produit au moment de la compilation et ne peut donc utiliser aucune information d'exécution. Il cible les appels de fonction et le corps d'une fonction, ou les variables et blocs de mémoire. PHP étant un langage dynamique, il n’utilise pas de liaison statique. Mais la liaison statique peut être simulée.
La liaison dynamique utilise uniquement les informations disponibles au moment de l'exécution pour les demandes d'accès générées pendant 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.
Les actions des membres publics et protégés sont similaires aux actions des fonctions des 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 au membre de la classe parent).
Regardez l'exemple 6.10. 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. Si la salutation est publique, PHP générera le même résultat. le fonctionnement de la méthode remplacée est très similaire. Dans Son, les appels à l'identification sont liés à cette méthode.
Même si la méthode d'accès est affaiblie de protégé à public dans une sous-classe, une liaison dynamique se produira toujours. Selon le principe de l'utilisation des méthodes d'accès, il est impossible d'améliorer les restrictions d'accès sur les membres de la classe, ce qui modifie la méthode d'accès de publique à. protégé ne peut pas continuer.
Listing 6.10 Liaison dynamique
Classe de liaison dynamique Père
{
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 existe toujours un getSalutation() et un identifier() dans cette classe.
//Lié dynamiquement à la méthode getSalutation() dans l'instance de la sous-classe Son, donc la méthode getSalutation() de l'instance Son est appelée,
//Les membres salutation et identifier() dans la classe Son seront appelés à la place des membres salutation et identifier() dans la classe parent.
Les membres privés n'existent qu'à l'intérieur de la classe dans laquelle ils se trouvent. Contrairement aux membres publics et protégés, PHP. simule la liaison statique. Voir l'exemple 6.11. Il affiche "Bonjour ! Je suis Père." Bien que la sous-classe écrase la valeur de la salutation, le script lie this->salutation à la classe actuelle Père. Un principe similaire s'applique à la méthode privée identifier().
Listing 6.11
Classe de membres contraignants et privés Père
{
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 6.12. En raison de l'utilisation de la liaison dynamique, la version de isAuthorized est appelée. deleteUser peut être déterminé par le type d'objet. S'il s'agit d'un utilisateur ordinaire, PHP appelant User::isAuthorized renverra FALSE. S'il s'agit d'une instance de AuthorizedUser, PHP appelant AuthorizedUser::isAuthorized permettra à deleteUser de s'exécuter en douceur.
//haohappy Remarque : Pour le dire clairement en une phrase, il s'agit d'un type d'objet et d'une méthode, d'une liaison d'attribut. 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 est le type. instance à laquelle appartient, puis appelle les méthodes et propriétés dans la classe correspondante.
Listing 6.12 Avantages de la classe de liaison dynamique
User //User.
{
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. Ceci est moins courant que vous ne le pensez. De manière générale, 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 des sous-classes. des fondements de la programmation orientée objet. Des 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.