Quand et pourquoi devrais - je utiliser public
, private
et les protected
fonctions et les variables dans une classe? Quelle est la différence entre eux?
Exemples:
// Public
public $variable;
public function doSomething() {
// ...
}
// Private
private $variable;
private function doSomething() {
// ...
}
// Protected
protected $variable;
protected function doSomething() {
// ...
}
Réponses:
Tu utilises:
public
portée pour rendre cette propriété / méthode disponible à partir de n'importe où, d'autres classes et instances de l'objet.private
portée lorsque vous souhaitez que votre propriété / méthode soit visible dans sa propre classe uniquement.protected
portée lorsque vous souhaitez rendre votre propriété / méthode visible dans toutes les classes qui étendent la classe actuelle, y compris la classe parente.Plus: (Pour des informations complètes)
la source
protected
portée lorsque vous souhaitez rendre votre variable / fonction visible dans toutes les classes qui étendent la classe actuelle ET ses classes parentes .http://www.php.net/manual/en/language.oop5.visibility.php#109324
Publique:
Lorsque vous déclarez une méthode (fonction) ou une propriété (variable) en tant que
public
, ces méthodes et propriétés sont accessibles par:Exemple:
Protégé:
Lorsque vous déclarez une méthode (fonction) ou une propriété (variable) en tant que
protected
, ces méthodes et propriétés sont accessibles parLes membres externes ne peuvent pas accéder à ces variables. "Outsiders" dans le sens où ils ne sont pas des instances d'objets de la classe déclarée elle-même.
Exemple:
L'erreur exacte sera la suivante:
Privé:
Lorsque vous déclarez une méthode (fonction) ou une propriété (variable) en tant que
private
, ces méthodes et propriétés sont accessibles par:Les membres externes ne peuvent pas accéder à ces variables. Externes dans le sens où ils ne sont pas des instances d'objet de la classe déclarée elle -même et même des classes qui héritent de la classe déclarée.
Exemple:
Les messages d'erreur exacts seront:
Disséquer la classe de grand-père en utilisant la réflexion
Ce sujet n'est pas vraiment hors de portée, et je l'ajoute ici juste pour prouver que la réflexion est vraiment puissante. Comme je l'avais indiqué dans les trois exemples ci-dessus,
protected
et lesprivate
membres (propriétés et méthodes) ne sont pas accessibles en dehors de la classe.Cependant, avec la réflexion, vous pouvez faire l' extraordinaire en accédant même aux membres
protected
et enprivate
dehors de la classe!Eh bien, qu'est-ce que la réflexion?
Préambule
Nous avons une classe nommée
Grandpas
et disons que nous avons trois propriétés. Pour une compréhension facile, considérez qu'il y a trois grands-pères avec des noms:Faisons-les (assigner des modificateurs)
public
,protected
etprivate
respectivement. Vous le savez très bienprotected
et lesprivate
membres ne sont pas accessibles en dehors de la classe. Maintenant, contredisons la déclaration en utilisant la réflexion.Le code
Production:
Erreur commune:
Veuillez ne pas confondre avec l'exemple ci-dessous. Comme vous pouvez toujours le voir, les membres
private
etprotected
ne sont pas accessibles en dehors de la classe sans utiliser la réflexionProduction:
Fonctions de débogage
print_r
,var_export
Etvar_dump
sont des fonctions de débogage . Ils présentent des informations sur une variable sous une forme lisible par l'homme. Ces trois fonctions révèlent les propriétésprotected
et lesprivate
objets avec PHP 5. Les membres de la classe statique ne seront pas affichés.Davantage de ressources:
la source
Il est généralement considéré comme une bonne pratique de définir par défaut la visibilité la plus faible requise, car cela favorise l'encapsulation des données et une bonne conception de l'interface. Lorsque vous examinez la visibilité des variables et des méthodes des membres, pensez au rôle que joue le membre dans l'interaction avec d'autres objets.
Si vous "codez sur une interface plutôt que sur une implémentation", il est généralement assez simple de prendre des décisions de visibilité. En général, les variables doivent être privées ou protégées, sauf si vous avez une bonne raison de les exposer. Utilisez plutôt des accesseurs publics (getters / setters) pour limiter et réglementer l'accès aux internes d'une classe.
Pour utiliser une voiture comme analogie, des choses comme la vitesse, la vitesse et la direction seraient des variables d'instance privées. Vous ne voulez pas que le conducteur manipule directement des choses comme le rapport air / carburant. Au lieu de cela, vous exposez un nombre limité d'actions en tant que méthodes publiques. L'interface à une voiture pourrait inclure des méthodes telles que
accelerate()
,deccelerate()
/brake()
,setGear()
,turnLeft()
,turnRight()
, etc.Le conducteur ne sait pas et ne devrait pas se soucier de la façon dont ces actions sont mises en œuvre par les internes de la voiture, et exposer cette fonctionnalité pourrait être dangereuse pour le conducteur et les autres sur la route. D'où la bonne pratique de concevoir une interface publique et d'encapsuler les données derrière cette interface.
Cette approche vous permet également de modifier et d'améliorer l'implémentation des méthodes publiques dans votre classe sans rompre le contrat de l'interface avec le code client. Par exemple, vous pourriez améliorer la
accelerate()
méthode pour être plus économe en carburant, mais l'utilisation de cette méthode resterait la même; le code client ne nécessiterait aucune modification mais bénéficierait toujours des avantages de votre amélioration de l'efficacité.Edit: Comme il semble que vous soyez encore en train d'apprendre des concepts orientés objet (qui sont beaucoup plus difficiles à maîtriser que la syntaxe de tout langage), je recommande fortement de prendre une copie des objets, modèles et pratiques PHP par Matt Zandstra. Ce livre est le premier qui m'a appris comment utiliser efficacement POO, plutôt que de me enseigner la syntaxe. J'avais appris la syntaxe des années auparavant, mais c'était inutile sans comprendre le "pourquoi" de la POO.
la source
private
- accessible uniquement depuis la classeprotected
- peut être consulté à partir de la classe et des classes héritéespublic
- est également accessible à partir du code HORS de la classeCela s'applique aussi bien aux fonctions qu'aux variables.
la source
La différence est la suivante:
Public
:: Une variable ou une méthode publique est accessible directement par n'importe quel utilisateur de la classe.Protected
:: Une variable ou une méthode protégée n'est pas accessible aux utilisateurs de la classe mais peut être accédée à l'intérieur d'une sous-classe qui hérite de la classe.Private
:: Une variable ou une méthode privée n'est accessible qu'en interne à partir de la classe dans laquelle elle est définie. Cela signifie qu'une variable ou une méthode privée ne peut pas être appelée à partir d'un enfant qui étend la classe.la source
Portées de visibilité avec des exemples abstraits :: facilite la compréhension
Cette visibilité d'une propriété ou d'une méthode est définie par la déclaration de préfixe d'un des trois mots clés (Public, protégé et privé)
Public : si une propriété ou une méthode est définie comme publique, cela signifie qu'elle peut être à la fois accessible et manipulée par tout ce qui peut faire référence à un objet.
Protégé: lorsqu'une propriété ou une méthode est définie sur Visibilité, les membres protégés ne peuvent être accessibles que dans la classe elle-même et par les classes héritées et héritées. (Hérité: - une classe peut avoir toutes les propriétés et méthodes d'une autre classe).
Privé: lorsqu'une propriété ou visibilité de méthode est définie sur privé, seule la classe qui a les membres privés peut accéder à ces méthodes et propriétés (en interne dans la classe), malgré la relation de classe qui existe.
la source
Extrait de :
http://php.net/manual/en/language.oop5.visibility.php
la source
PUBLIC
:public
portée: une variable / fonction publique est disponible pour les objets et les autres classes.PROTECTED
:protected
portée: une variable / fonction protégée est disponible pour toutes les classes qui étendent la classe actuelle.PRIVATE
:private
portée: une variable / fonction privée n'est visible que dans la classe actuelle où elle est définie.Lisez la visibilité d'une méthode ou d'une variable sur PHP Manual.
la source
Considérant « quand »:
j'ai tendance à tout déclarer comme privé au début, si je ne suis pas exactement sûr. La raison en est qu'il est généralement beaucoup plus facile de rendre publique une méthode privée que l'inverse. C'est parce que vous pouvez au moins être sûr que la méthode privée n'a été utilisée nulle part ailleurs que dans la classe elle-même. Une méthode publique peut déjà être utilisée partout, nécessitant éventuellement une réécriture approfondie.
Mise à jour : j'opte pour une valeur par défaut de
protected
nos jours, car j'ai trouvé que c'est assez bon pour l'encapsulation et ne gêne pas quand j'étends des classes (ce que j'essaie d'éviter de toute façon). Seulement si j'ai une bonne raison d'utiliser les deux autres, je le ferai.Une bonne raison pour une
private
méthode serait celle qui implémente quelque chose d'inhérent à cet objet que même une classe d'extension ne devrait pas changer (raison factuelle, en plus de l'encapsulation, comme la gestion d'état interne). Finalement, il est toujours assez facile deprotected
trouver où une méthode est généralement utilisée, donc je suis par défaut deprotected
nos jours. Peut-être pas une expérience 100% objective "dans les tranchées", je l'avoue.la source
private
serait toujours "assez bonne" à utiliser, mais vous ne suggérez plus que, bien que les raisons précédentes que vous donniez sonnent comme une "bonne raison": l'encapsulation.protected
le fait déjà, mais vous le gardez flexible pour l'extension / l'héritage. Encore une fois, sauf si vous avez une bonne raison de le faireprivate
.protected
fait, il fuit dans la portée externe et est souvent sur votre chemin car il prend en charge les mauvaises décisions de conception, comme favoriser implicitement l'héritage alors qu'il vaut mieux favoriser la composition. C'est pourquoi s'en tenir à privé, sauf si vous avez des exigences réelles, est souvent un meilleur moyen de commencer à écrire du code. Cela empêchera également de prendre des décisions de conception trop tôt alors qu'elles ne sont pas encore nécessaires.protected
ne coule pas dans la portée externe (code qui appelle / accède à la méthode / champ) mais seulement dans la portée interne (extension des classes). Il y a une différence, aussi minime soit-elle pour vous. Il est beaucoup plus facile de suivre l'utilisation d'unprotected
champ qu'unpublic
seul.Le manuel PHP a une bonne lecture de la question ici .
la source
Pour moi, c'est le plus utile façon de comprendre les trois types de propriétés:
Publique : utilisez ceci lorsque vous êtes OK avec cette variable étant directement accessible et modifiée de n'importe où dans votre code.
Exemple d'utilisation en dehors de la classe:
Protégé : utilisez-le lorsque vous souhaitez forcer d'autres programmeurs (et vous-même) à utiliser des getters / setters en dehors de la classe lors de l'accès et de la définition de variables (mais vous devez être cohérent et utiliser également les getters et setters à l'intérieur de la classe). Il s'agit
private
généralement de la manière par défaut de configurer toutes les propriétés de classe.Pourquoi? Parce que si vous décidez à un moment donné (peut-être même en 5 minutes environ) que vous souhaitez manipuler la valeur renvoyée pour cette propriété ou faire quelque chose avec elle avant d'obtenir / définir, vous pouvez le faire sans refactoriser partout où vous avez utilisé dans votre projet.
Exemple d'utilisation en dehors de la classe:
Privé : les
private
propriétés sont très similaires auxprotected
propriétés. Mais la particularité / différence est que le rendreprivate
également inaccessible aux classes enfants sans utiliser le getter ou le setter de la classe parent.Donc, fondamentalement, si vous utilisez des getters et des setters pour une propriété (ou si elle est utilisée uniquement en interne par la classe parent et qu'elle n'est pas censée être accessible ailleurs), vous pourriez aussi bien la faire
private
, juste pour empêcher quiconque d'essayer pour l'utiliser directement et introduire des bugs .Exemple d'utilisation à l'intérieur d'une classe enfant (qui étend MyObject):
la source
Ils sont là pour permettre différents niveaux d' encapsulation
la source
Les variables en PHP sont converties en trois types différents:
Public: les valeurs de ces types de variables sont disponibles dans toutes les étendues et appellent l'exécution de votre code. déclarer comme:
public $examTimeTable;
Privé: les valeurs de ce type de variable ne sont disponibles que pour la classe à laquelle elles appartiennent.
private $classRoomComputers;
Protégé: valeurs de cette classe uniquement et uniquement disponibles lorsque l'accès a été accordé sous forme d'héritage ou de leur classe enfant. généralement utilisé
::
pour accorder l'accès par classe parentprotected $familyWealth;
la source
Relancer une vieille question, mais je pense qu'une très bonne façon d'y penser est en termes d'API que vous définissez.
public
- Tout ce qui est marqué public fait partie de l'API que toute personne utilisant votre classe / interface / autre utilisera et utilisera.protected
- Ne vous laissez pas berner, cela fait également partie de l'API! Les gens peuvent sous-classer, étendre votre code et utiliser tout ce qui est marqué comme protégé.private
- Les propriétés et méthodes privées peuvent être modifiées autant que vous le souhaitez. Personne d'autre ne peut les utiliser. Ce sont les seules choses que vous pouvez changer sans apporter de changements de rupture.Ou en termes Semver :
Des changements à quoi que ce soit
public
ouprotected
doivent être considérés comme des changements MAJEURS.Tout ce qui est nouveau
public
ouprotected
devrait être (au moins) MINEURSeuls les nouveaux / changements à quelque chose
private
peuvent être PATCHDonc, en termes de maintien du code, il est bon de faire attention à ce que vous faites
public
ouprotected
parce que ce sont les choses que vous promettez à vos utilisateurs.la source
Lorsque nous suivons le php orienté objet dans notre projet, nous devons suivre certaines règles pour utiliser les modificateurs d'accès en php. Aujourd'hui, nous allons apprendre clairement ce qu'est un modificateur d'accès et comment l'utiliser.Les modificateurs d'accès PHP sont utilisés pour définir les droits d'accès avec les classes PHP et leurs membres qui sont les fonctions et les variables définies dans l'étendue de la classe. Dans php, il y a trois portées pour les membres de la classe.
Maintenant, regardons l'image suivante pour comprendre le niveau d'accès du modificateur d'accès
Maintenant, jetons un œil à la liste suivante pour connaître les mots-clés PHP possibles utilisés comme modificateurs d'accès.
public: - la classe ou ses membres définis avec ce modificateur d'accès seront accessibles publiquement de n'importe où, même en dehors de la portée de la classe.
private: - les membres de la classe avec ce mot-clé seront accessibles dans la classe elle-même. nous ne pouvons pas accéder aux données privées de la sous-classe. Il protège les membres de l'accès à l'extérieur de la classe.
protected: - identique à private, sauf en autorisant les sous-classes à accéder aux membres protégés de la superclasse.
Maintenant, voyez le tableau pour comprendre le modificateur d'accès Lire l'article complet php access modifire
la source
Public
: est un état par défaut lorsque vous déclarez une variable ou une méthode, accessible par n'importe quoi directement à l'objet.Protected
: Accessible uniquement dans l'objet et les sous-classes.Private
: Peut être référencé uniquement dans l'objet, pas dans les sous-classes.la source
Les mots-clés mentionnés sont des modificateurs d'accès et nous aident à implémenter l'encapsulation (ou le masquage d'informations). Ils indiquent au compilateur quelles autres classes doivent avoir accès au champ ou à la méthode en cours de définition.
private - Seule la classe actuelle aura accès au champ ou à la méthode.
protected - Seules la classe actuelle et les sous-classes (et parfois aussi les classes du même package) de cette classe auront accès au champ ou à la méthode.
public - Toute classe peut faire référence au champ ou appeler la méthode.
la source