En poursuivant notre discussion sur la programmation orientée objet dans WordPress, nous devons commencer à parler de l'idée de la portée. En bref, cela fait référence à l’idée selon laquelle les classes peuvent contrôler la manière dont leurs attributs et leurs fonctions sont utilisés (ou même si elles peuvent ou non être utilisées)..
C’est encore une autre idée de base de la programmation orientée objet, après quoi nous devrions être en mesure de commencer à travailler sur un plugin WordPress réel..
Avant d'aller de l'avant, veuillez noter que chaque article de cette série s'appuie sur le précédent, alors si vous venez de nous rejoindre, veillez à consulter les articles précédents de la série:
Une fois que vous êtes tous pris au piège, poursuivons notre discussion sur le dernier élément du paradigme qu'il nous faut comprendre avant de passer à l'application pratique de la programmation orientée objet dans WordPress..
Selon Wikipedia, la première définition de la portée est la suivante:
En programmation informatique, la portée d'une liaison de nom - l'association d'un nom à une entité, telle qu'une variable - correspond à la partie d'un programme d'ordinateur où la liaison est valide: le nom peut être utilisé pour désigner l'entité. Dans d'autres parties du programme, le nom peut faire référence à une entité différente (il peut avoir une liaison différente) ou à rien du tout (il peut être non lié)..
Sauf si vous êtes un programmeur expérimenté, c'est un peu déroutant, n'est-ce pas? En fait, cela peut même se lire comme un peu de jargon.
Mais cela n’est pas grave, car le but de cet article est de fournir une définition pratique de la portée ainsi que des exemples pratiques de ce à quoi elle ressemble dans le contexte d’un programme..
Avant d’examiner les trois aspects de la portée de la programmation orientée objet, formulons une définition plus claire..
En bref, la portée fait référence à la manière dont les variables et les fonctions peuvent être accessibles à partir d'objets tiers ou d'objets enfants dans le programme..
Par exemple, disons que vous avez un BlogPost
objet et un Auteur
objet. Ensuite, disons que l'auteur a des attributs pour Prénom
et nom de famille
et le BlogPost
veut y accéder pour, par exemple, les afficher à l'écran.
Peut-être qu'une illustration de haut niveau pourrait aider:
Dans ce post, le BlogPost
demande des informations de nom au Auteur
classe. Notez que dans le diagramme ci-dessus, le nom de la classe est dans le premier blog, les attributs dans le deuxième bloc, puis les troisièmes blocs vides sont généralement réservés aux fonctions..
Mais c'est au-delà de la, ahem, portée de cet article.
Rappelez-vous: les classes représentent généralement les noms, les attributs représentent les adjectifs et les fonctions représentent les verbes ou les actions que l'objet peut exécuter. À cette fin, les classes encapsulent normalement leurs informations de manière stratégique, de sorte que Comment ils travaillent sont cachés et quoi ils peuvent faire est démontré par leurs fonctions disponibles au public.
Pour ce faire, vous devez attribuer aux variables et aux fonctions une certaine portée qui permet à d'autres objets d'accéder à leurs informations. Ces types d’objets incluent des objets tiers souhaitant exploiter les données représentées par une classe. Un autre type d’objet représente un objet qui: hérite informations de cette classe.
L'héritage est au-delà de ce que nous allons couvrir dans cet article particulier; Cependant, nous en parlerons un peu plus tard dans la série pour ceux qui débutent dans la programmation orientée objet..
Cela dit, nous sommes prêts à examiner un exemple pratique de portée, y compris la manière dont nous l'avons utilisé jusqu'à présent dans la série et son incidence sur les décisions de conception..
L’amorce ci-dessus aurait dû expliquer, du moins de manière générale, quelle est la portée et l’importance de celle-ci, mais sinon, peut-être que les sections suivantes.
Plus précisément, nous allons examiner chacun des types d’étendue que les variables et les fonctions peuvent avoir, nous allons expliquer ce que chacun signifie, puis nous expliquerons quand vous voudrez utiliser chacun d'eux.
Avant de continuer, notez que le Publique
, protégé
, et privé
les mots clés peuvent être utilisés pour définir les deux attributs et les fonctions. Ceci est important car les règles applicables aux attributs sont également applicables aux fonctions.
Cela dit, examinons chacun des mots clés..
Tout simplement, Publique
les attributs et les fonctions sont disponibles pour chaque type d'objet qui tente d'accéder à la variable ou à la fonction.
Par exemple:
prenom = $ nom; fonction publique set_last_name ($ name) $ this-> last_name = $ name; fonction publique get_first_name () return $ this-> first_name; fonction publique get_last_name () return $ this-> last_name; // Autres détails sur la classe…
Avec cette configuration, tout objet qui appelle une instance de cet objet peut non seulement accéder à la $ prenom
et $ last_name
attributs, mais peut aussi changement leur. De même, tout objet qui appelle une instance d'objet peut accéder aux fonctions pour récupérer le nom et le modifier..
Cela soulève donc la question suivante: à quoi sert-il d'avoir ces fonctions si l'attribut est rendu public? Je veux dire, c'est redondant, n'est-ce pas? Oui. Et nous y répondrons plus tard dans l'article une fois que nous parlerons de la privé
mot-clé.
Suivant, protégé
Les attributs et les fonctions sont disponibles dans le contexte de la classe dans laquelle ils sont définis, mais ne pas pour les objets tiers. Cela dit, ils peuvent être appelés à partir de leur propre classe, mais ne pas des classes externes.
prenom = $ nom; fonction protégée set_last_name ($ name) $ this-> last_name = $ name; fonction protégée get_first_name () return $ this-> prenom; fonction protégée get_last_name () return $ this-> last_name; // Autres détails sur la classe…
Mais il existe une exception: les sous-classes.
Par exemple, supposons que vous définissiez une classe nommée Donateur
qui est une sous-classe de Auteur
, cela signifie que le Donateur
a accès à tout du protégé
(et Publique
) attributs et fonctions de sa classe parente.
Étant donné le code ci-dessus, cela signifie que vous pouvez appeler des méthodes telles que
get_first_name ()
de l'intérieurAuteur
classe ou dans leDonateur
classe mais ne pas de toutes les classes externes.Certes, les sous-classes ont plus à voir avec l'héritage, ce dont nous parlerons plus loin dans la série; cependant, je soulève cette question pour apporter une clarification importante entre
Publique
attributs et fonctions etprivé
attributs et fonctions.Privé
en bref,
privé
Les attributs et les fonctions verrouillent les attributs et les fonctions dans la classe dans laquelle ils sont définis. Cela signifie qu'aucun objet externe ou sous-classe ne peut accéder tout de l'information.Clairement, il s’agit de la forme de portée la plus stricte, mais elle ne doit pas être interprétée comme une mauvaise chose (ou une bonne chose). Au lieu de cela, il est conçu pour permettre à certaines informations de rester masquées (ou abstraites) dans le contexte de la classe dans laquelle elles sont définies..
Revenons à notre premier exemple. Voyons comment nous pouvons refactoriser la classe de manière à ce qu’elle fournisse un maximum d’utilité pour les classes et les sous-classes externes..
prenom = $ nom; fonction privée set_last_name ($ name) $ this-> last_name = $ name; fonction privée get_first_name () return $ this-> first_name; fonction privée get_last_name () return $ this-> last_name; // Autres détails sur la classe…Tout d’abord, cet exemple montre une mauvaise utilisation de la
privé
mot-clé.Dans cet exemple, non seulement les attributs sont inaccessibles, mais les fonctions ne sont pas non plus accessibles. En d'autres termes, pour d'autres objets du "monde extérieur", cette classe semble n'avoir rien de disponible. Pire encore, même les sous-classes ne peuvent accéder à aucune de ces informations.
En bref, le code n'a pas vraiment de sens.
Nous allons donc reformuler cela un peu plus, de manière à ce que l'attribut reste masqué (et donc inaccessible aux objets tiers), et nous indiquerons un moyen permettant aux objets tiers de récupérer les noms, mais seulement permet à la classe actuelle et à ses sous-classes de les modifier:
Prénom; fonction publique get_last_name () return $ this-> last_name; // Autres détails sur la classe…Bien sûr, ce n’est qu’un exemple. Évidemment, nous omettons certains détails de la mise en œuvre tels que nous ne le faisons pas. savoir quels détails peuvent appeler, par exemple, les noms à mettre à jour.
Mais peu importe: cela montre un exemple complet de la façon dont
privé
,protégé
, etPublique
Les aspects étendus d'une classe peuvent fonctionner conjointement pour fournir un moyen sûr et stratégique d'accéder à l'information.Abstraction et dissimulation d'informations
En ce qui concerne la portée, vous pouvez faire valoir que tout se résume à l'abstraction et à la dissimulation d'informations..
C'est-à-dire que les classes (qui sont des plans pour objet, si vous vous en souvenez de nos articles précédents) devraient organiser leurs informations de manière stratégique, de telle sorte que:
privé
En fait, je vais un peu plus loin en disant que vous ne verrez probablement pas de nombreux attributs marqués comme Publique
. Au lieu de cela, vous êtes plus susceptible de voir les attributs marqués comme protégé
- aux fins du sous-classement - ou privé
, de sorte que leurs données puissent être gérées par des fonctions correctement définies.
Au début, cela semble relativement simple, non? Et le concept en soi n’est pas terriblement compliqué, mais s’agissant de la construction de systèmes reposant sur un ensemble d’objets différents travaillant ensemble pour fournir une abstraction solide, des interfaces propres permettant aux classes et sous-classes tierces d’interagir, et des moyens efficaces d’organiser l’information, cela peut devenir plus difficile - il y a beaucoup de parties mobiles à considérer.
Cela dit, c’est l’une des choses que l’écriture de code, l’interaction avec d’autres développeurs et la lecture de code peuvent engendrer.
Peu importe ce que cela vaut, je n'ai pas peur d'admettre que ce sont toujours des stratégies avec lesquelles je ne me débatte pas parce que je ne comprends pas les concepts, mais parce qu'essayer de fournir la mise en œuvre de classe la plus propre possible peut être difficile, en particulier dans un système c'est susceptible de changer.
Mais c'est le contenu d'un autre post.
Bien sûr, si vous avez des questions ou des commentaires à propos de quoi que ce soit concernant le sujet de la portée, n'hésitez pas à les laisser dans les commentaires..
À partir du prochain article, nous allons incorporer certaines de ces informations dans une application pratique de la création d'un plugin WordPress..
Donc, pour ceux d'entre vous qui attendaient de voir comment cette série fonctionne en conjonction avec WordPress, le prochain article devrait commencer à rassembler tous les concepts alors que nous poursuivons la série avec notre propre plugin WordPress utilisant le concept de programmation orientée objet.