Quelle est la différence entre public, privé et protégé?

989

Quand et pourquoi devrais - je utiliser public, privateet les protectedfonctions 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() {
  // ...
}
Adam
la source
59
Je pense que cette question bénéficierait également de réponses avec des exemples pratiques de l'utilisation de chacun, au lieu de fournir la définition littérale de ce que fait chaque mot-clé.
Matthew
70
Je pense vraiment que cette question devrait être publique et non protégée.
dotancohen

Réponses:

1261

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)

Sarfraz
la source
79
protectedportée lorsque vous souhaitez rendre votre variable / fonction visible dans toutes les classes qui étendent la classe actuelle ET ses classes parentes .
Shahid
4
@Shahid - Je ne comprends pas votre point. Toute classe qui étend la classe A étend également la classe parente de A, non?
JDelage
4
@JDelage - Veuillez voir le lienhttp://www.php.net/manual/en/language.oop5.visibility.php#109324
Shahid
4
@Growler Pourquoi alors s'embêter à utiliser des objets?
J.Steve
27
@Growler, une réponse plus utile serait qu'il est bon de cacher autant que possible le fonctionnement interne d'un objet. De cette façon, il est moins susceptible de se casser. Si vous rendez tout public, alors un autre programmeur pourrait modifier une variable que vous ne voulez pas changer par autre chose que le fonctionnement interne de votre objet.
Détente à Chypre
1176

dd

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:

  • La même classe qui l'a déclaré.
  • Les classes qui héritent de la classe déclarée ci-dessus.
  • Tous les éléments étrangers en dehors de cette classe peuvent également accéder à ces éléments.

Exemple:

<?php

class GrandPa
{
    public $name='Mark Henry';  // A public variable
}

class Daddy extends GrandPa // Inherited class
{
    function displayGrandPaName()
    {
        return $this->name; // The public variable will be available to the inherited class
    }

}

// Inherited class Daddy wants to know Grandpas Name
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

// Public variables can also be accessed outside of the class!
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Prints 'Mark Henry'

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 par

  • La même classe qui l'a déclaré.
  • Les classes qui héritent de la classe déclarée ci-dessus.

Les 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:

<?php

class GrandPa
{
    protected $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

L'erreur exacte sera la suivante:

Erreur fatale PHP: impossible d'accéder à la propriété protégée GrandPa :: $ name


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:

  • La même classe qui l'a déclaré.

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:

<?php

class GrandPa
{
    private $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Results in a Notice 

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

Les messages d'erreur exacts seront:

Remarque: propriété
non définie : Daddy :: $ name Erreur fatale: impossible d'accéder à la propriété privée GrandPa :: $ name


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, protectedet les privatemembres (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 protectedet en privatedehors de la classe!

Eh bien, qu'est-ce que la réflexion?

La réflexion ajoute la possibilité de rétroconcevoir les classes, interfaces, fonctions, méthodes et extensions. En outre, ils offrent des moyens de récupérer des commentaires de doc pour les fonctions, les classes et les méthodes.

Préambule

Nous avons une classe nommée Grandpaset 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:

  • Marc Henry
  • John Clash
  • Will Jones

Faisons-les (assigner des modificateurs) public, protectedet privaterespectivement. Vous le savez très bien protectedet les privatemembres ne sont pas accessibles en dehors de la classe. Maintenant, contredisons la déclaration en utilisant la réflexion.

Le code

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected  modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}


# Scenario 1: without reflection
$granpaWithoutReflection = new GrandPas;

# Normal looping to print all the members of this class
echo "#Scenario 1: Without reflection<br>";
echo "Printing members the usual way.. (without reflection)<br>";
foreach($granpaWithoutReflection as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

echo "<br>";

#Scenario 2: Using reflection

$granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class
$granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private)


echo "#Scenario 2: With reflection<br>";
echo "Printing members the 'reflect' way..<br>";

foreach($granpaNames as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

Production:

#Scenario 1: Without reflection
Printing members the usual way.. (Without reflection)
The name of grandpa is Mark Henry and he resides in the variable name1

#Scenario 2: With reflection
Printing members the 'reflect' way..
The name of grandpa is Mark Henry and he resides in the variable name1
The name of grandpa is John Clash and he resides in the variable name2
The name of grandpa is Will Jones and he resides in the variable name3

Erreur commune:

Veuillez ne pas confondre avec l'exemple ci-dessous. Comme vous pouvez toujours le voir, les membres privateet protectedne sont pas accessibles en dehors de la classe sans utiliser la réflexion

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}

$granpaWithoutReflections = new GrandPas;
print_r($granpaWithoutReflections);

Production:

GrandPas Object
(
    [name1] => Mark Henry
    [name2:protected] => John Clash
    [name3:GrandPas:private] => Will Jones
)

Fonctions de débogage

print_r, var_exportEt var_dumpsont 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és protectedet les privateobjets avec PHP 5. Les membres de la classe statique ne seront pas affichés.


Davantage de ressources:


Shankar Damodaran
la source
excuses pour le retard ajouté à ce convo. Pouvez-vous me dire pourquoi quelqu'un les utiliserait? Vous avez parfaitement expliqué comment ils fonctionnent, etc. J'aimerais simplement connaître les avantages de l'utilisation pour chacun d'eux. Merci
JamesG
@JamesG est un peu expliqué dans l'autre commentaire ci-dessus. stackoverflow.com/questions/4361553/…
cjmling
Je ne sais pas pourquoi c'est peut-être un peu hors de question, mais personne n'a mentionné qu'en PHP il y a deux autres modificateurs d'accès: abstrait et final ce mot-clé peut être utilisé uniquement pour les classes PHP mais il accède toujours aux modificateurs
bxN5
1
Je vous suggère de lire l'explication sur l'abstraction fournie par Dhairya Lakhera ici: stackoverflow.com/questions/2558559/… . C'est un complément parfait aux explications de Shankar Damodaran.
Julio Marchi
83

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.

The Awnry Bear
la source
3
Le livre recommandé dans l'édition de cet article est vraiment très excellent. Le morceau que j'ai jusqu'à présent s'est révélé assez instructif. Les premiers chapitres ont répondu à la plupart de mes questions liées à la classe.
Josiah
Les livres qui m'ont permis de vraiment comprendre les objets, sans évincer ma pensée avec des détails inutiles, comme des exemples dans Smalltalk, étaient de David A Taylor, étant Object Oriented Technology: A Manager's Guide et l'ingénierie commerciale avec la technologie des objets . Les deux ne font que 100 pages et sont assez faciles à lire en un après-midi. Bien sûr, il y a les modèles de conception de Gamma et al , bien que l'approche de base puisse simplement être décrite par «sous-classe ce que vous voulez varier».
Patanjali
Une très belle analogie. Avez-vous un pour protégé vs privé?
Jānis Elmeris
79

private - accessible uniquement depuis la classe

protected - peut être consulté à partir de la classe et des classes héritées

public - est également accessible à partir du code HORS de la classe

Cela s'applique aussi bien aux fonctions qu'aux variables.

Olaf
la source
Je ne sais pas si la définition protégée est correcte ici, à partir de la réponse sélectionnée, il semble, Protégé - Accessible uniquement à partir de la classe héritée et non à partir de la classe d'origine / parent. Dire "DANS LA CLASSE" peut être un peu déroutant.
pal4life
7
Je ne pense pas, en fait il semble que la réponse choisie soit celle qui prête à confusion ici. Voir le commentaire de Shahids. À mon humble avis, une méthode protégée est très bien accessible à partir de la classe d'origine.
Olaf
une classe peut-elle accéder au public d'une autre classe?
Serjas
1
@Serjas: Non, seulement un autre objet, sauf s'il s'agit de méthodes / champs statiques.
DanMan
Je ne sais pas si cela s'applique à tous les langages de programmation, mais en PHP, les propriétés / méthodes "protégées" sont accessibles dans la classe dans laquelle elles ont été déclarées ou dans les classes héritant de la classe définissant la propriété / méthode.
John Slegers
25

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.

Matthew Watts
la source
17

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.

  • Résumé par exemple. Considérez la portée de la visibilité publique comme un «pique-nique public» auquel tout le monde peut s'adresser.

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).

  • Pensez comme une portée de visibilité protégée comme un «pique-nique d'entreprise» où les membres de l'entreprise et les membres de leur famille sont autorisés, pas le public. C'est la restriction de portée la plus courante.

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.

  • avec l'analogie avec un pique-nique, pensez comme un "pique-nique d'entreprise où seuls les membres de l'entreprise sont autorisés" dans le pique-nique. ni la famille ni le grand public ne sont autorisés.
Suman KC
la source
15
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined

Extrait de :

http://php.net/manual/en/language.oop5.visibility.php

Techie
la source
12

⚡️ Voici un moyen facile de se rappeler la portée de public, protectedet private.

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.
  • Non! Les objets ne peuvent pas accéder à cette étendue

PRIVATE:

  • private portée: une variable / fonction privée n'est visible que dans la classe actuelle où elle est définie.
  • Non! La classe qui étend la classe actuelle ne peut pas accéder à cette étendue.
  • Non! Les objets ne peuvent pas accéder à cette étendue.

Lisez la visibilité d'une méthode ou d'une variable sur PHP Manual.

Ahmad Awais
la source
9

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 protectednos 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 privatemé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 de protectedtrouver où une méthode est généralement utilisée, donc je suis par défaut de protectednos jours. Peut-être pas une expérience 100% objective "dans les tranchées", je l'avoue.

DanMan
la source
3
Avec votre mise à jour: pouvez-vous expliquer plus clairement comment «assez bien» et «bonne raison» vont de pair ici? Par exemple, l'utilisation privateserait 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.
hakre
@hakre: La raison pour laquelle nous devons nous efforcer d'encapsuler est d'éviter la fuite de l'état dans la portée externe. protectedle 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 faire private.
DanMan
Eh bien, c'est probablement le point sur lequel nous ne sommes pas d'accord: en protectedfait, 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.
hakre
Je ne contesterai pas votre point général, car il est assez juste, mais protectedne 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'un protectedchamp qu'un publicseul.
DanMan
6

Le manuel PHP a une bonne lecture de la question ici .

La visibilité d'une propriété ou d'une méthode peut être définie en préfixant la déclaration avec les mots clés public, protected ou private. Les membres du groupe déclarés publics sont accessibles partout. Les membres déclarés protégés ne sont accessibles que dans la classe elle-même et par les classes héritées et parent. Les membres déclarés privés ne sont accessibles qu'à la classe qui définit le membre.

code_burgar
la source
6

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:

$myObject = new MyObject()
$myObject->publicVar = 'newvalue';
$pubVar = $myObject->publicVar;

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 privategé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:

$myObject = new MyObject()
$myObject->setProtectedVar('newvalue');
$protectedVar = $myObject->getProtectedVar();

Privé : les privatepropriétés sont très similaires aux protectedpropriétés. Mais la particularité / différence est que le rendre privateé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):

$this->setPrivateVar('newvalue');
$privateVar = $this->getPrivateVar();
Andrew
la source
4

Ils sont là pour permettre différents niveaux d' encapsulation

Mchl
la source
10
Vous pourriez probablement étoffer cela un peu.
Aaron Hall
4

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 parent

protected $familyWealth;

star18bit
la source
3

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 publicou protecteddoivent être considérés comme des changements MAJEURS.

  • Tout ce qui est nouveau publicou protecteddevrait être (au moins) MINEUR

  • Seuls les nouveaux / changements à quelque chose privatepeuvent être PATCH

Donc, en termes de maintien du code, il est bon de faire attention à ce que vous faites publicou protectedparce que ce sont les choses que vous promettez à vos utilisateurs.

mcfedr
la source
1

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.

  1. PUBLIQUE
  2. PRIVÉ
  3. PROTÉGÉ

Maintenant, regardons l'image suivante pour comprendre le niveau d'accès du modificateur d'accès entrez la description de l'image ici

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

Mahedi Hasan Durjoy
la source
1

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.

Nomadme
la source
0

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.

Farzana Khan
la source