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


Quand et pourquoi devrais-je utiliser public, private, et protected fonctions et variables à l'intérieur d'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() {
  // ...
}

832
2017-12-05 22:13


origine


Réponses:


Tu utilises:

  • public portée pour rendre cette variable / fonction disponible de n'importe où, d'autres classes et instances de l'objet.

  • private portée lorsque vous voulez que votre variable / fonction soit visible dans sa propre classe seulement.

  • protected portée lorsque vous voulez rendre votre variable / fonction visible dans toutes les classes qui étendent la classe actuelle, y compris la classe parent.

Plus: (Pour des informations complètes)


1080
2017-12-05 22:17



dd

Publique:

Lorsque vous déclarez une méthode (fonction) ou une propriété (variable) public, ces méthodes et propriétés peuvent être consultées par:

  • La même classe qui l'a déclaré.
  • Les classes qui héritent de la classe déclarée ci-dessus.
  • Tout élément étranger en dehors de cette classe peut é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) protected, ces méthodes et propriétés peuvent être 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 Outsider ne peuvent pas accéder à ces variables. "Outsiders" dans le sens où ils ne sont pas instances d'objet 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) private, ces méthodes et propriétés peuvent être consultées par:

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

Les membres Outsider ne peuvent pas accéder à ces variables. Outsiders dans le sens où ils ne sont pas instances d'objet de la classe déclarée elle-même et même les classes qui hérite 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-papa en utilisant Réflexion

Ce sujet n'est pas vraiment hors sujet, et je l'ajoute ici pour prouver que la réflexion est vraiment puissante. Comme je l'ai indiqué dans les trois exemples ci-dessus, protected et private Les membres (propriétés et méthodes) ne sont pas accessibles en dehors de la classe.

Cependant, avec la réflexion, vous pouvez faire le extraordinaire en accédant même protected et private membres en dehors de la classe!

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

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

Préambule

Nous avons une classe nommée Grandpas et disons que nous avons trois propriétés. Pour faciliter la compréhension, considérons qu'il y a trois grands-pères avec des noms:

  • Marc Henry
  • John Clash
  • Will Jones

Faisons-les (assigner des modificateurs) public, protected et private respectivement. Tu sais très bien que protected et private les membres 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>";
}

Sortie:

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

S'il vous plaît ne pas confondre avec l'exemple ci-dessous. Comme vous pouvez toujours le voir, le private et protectedles membres ne sont pas accessibles à l'extérieur 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);

Sortie:

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

Fonctions de débogage

print_r, var_export et var_dump sont fonctions de débogage. Ils présentent des informations sur une variable sous une forme lisible par l'homme. Ces trois fonctions révéleront protected et private propriétés des objets avec PHP 5. Les membres de la classe statique ne pas être montré.


Davantage de ressources:



1015
2018-02-20 08:35



Il est généralement considéré comme une bonne pratique de passer par défaut à la plus faible visibilité requise car cela favorise l'encapsulation des données et une bonne conception de l'interface. Lorsque vous examinez la variable membre et la visibilité de la méthode, pensez au rôle joué par le membre dans l'interaction avec d'autres objets.

Si vous "codez sur une interface plutôt que sur l'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éguler l'accès aux internes d'une classe.

Pour utiliser une voiture comme une analogie, des choses comme la vitesse, l'engrenage 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 peut 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 savoir comment ces actions sont mises en œuvre par les internes de la voiture, et exposer cette fonctionnalité pourrait être dangereux 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 aucun changement, mais profiterait toujours de l'amélioration de votre efficacité.

Modifier: Comme il semble que vous êtes encore en train d'apprendre des concepts orientés objet (qui sont beaucoup plus difficiles à maîtriser que la syntaxe de n'importe quel langage), je très recommande de prendre une copie de Objets PHP, Patterns et Pratique par Matt Zandstra. C'est le livre qui m'a d'abord appris Comment utiliser efficacement la POO, plutôt que de simplement m'apprendre la syntaxe. J'avais appris la syntaxe des années auparavant, mais c'était inutile sans comprendre le "pourquoi" de la POO.


81
2017-09-03 20:17



privé - peut être consulté à partir de l'intérieur de la classe seulement

protégé - peut être consulté à partir de l'intérieur de la classe et des classes HÉRITAGE

public - peut être consulté à partir du code EN DEHORS de la classe

Ceci s'applique aux fonctions ainsi qu'aux variables.


69
2017-12-05 22:17



La différence est la suivante:

Public :: Une variable ou une méthode publique peut être accédée directement par n'importe quel utilisateur de la classe.

Protected :: Les utilisateurs de la classe ne peuvent pas accéder à une variable protégée ou à une méthode, mais on peut y accéder à l'intérieur d'une sous-classe qui hérite de la classe.

Private :: Une variable privée ou une méthode ne peut être accessible en interne à partir de la classe dans laquelle elle est définie.Cela signifie qu'une variable privée ou une méthode ne peut pas être appelée à partir d'un enfant qui étend la classe.


23
2017-09-03 19:51



Scopes de visibilité avec Exemples abstraits :: Facilite la compréhension

Cette visibilité d'une propriété ou d'une méthode est définie par la pré-déclaration de l'un des trois mots clés (Public, protégé et privé)

Publique : 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é eg. Pensez à la portée de la visibilité publique "pique-nique public" que n'importe qui peut venir.

Protégé: lorsqu'une visibilité de propriété ou de méthode est définie sur des membres protégés, elle ne peut être accessible que dans la classe elle-même et par les classes héritées et héritées. (Inherited: - une classe peut avoir toutes les propriétés et méthodes d'une autre classe).

  • Pensez en tant que portée de visibilité protégée "Pique-nique d'entreprise" où les membres de l'entreprise et les membres de leur famille sont autorisés à ne pas le public. C'est la restriction de portée la plus courante.

Privé: Lorsqu'une propriété ou une visibilité de méthode est définie sur private, seule la classe qui a les membres privés peut accéder à ces méthodes et propriétés (en interne dans la classe), en dépit de la relation de classe éventuelle.

  • avec l'analogie de pique-nique pense comme "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.

15
2018-02-07 03:07



/**
 * 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/fr/language.oop5.visibility.php


14
2017-10-03 11:01



️ Voici un moyen facile de se souvenir de la portée de public, protected et private.

PUBLIC:

  • public scope: Une variable / fonction publique est disponible pour les objets et les autres classes.

PROTECTED:

  • protected scope: Une variable / fonction protégée est disponible pour toutes les classes qui étendent la classe en cours.
  • Non! Les objets ne peuvent pas accéder à cette étendue

PRIVATE:

  • private scope: Une variable / fonction privée n'est visible que dans la classe en cours 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.

Lis le Visibilité d'une méthode ou d'une variable sur PHP Manual.


8
2018-06-30 07:27