Public :
Lorsque vous déclarez une méthode (fonction) ou une propriété (variable) en tant que public
ces méthodes et ces 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.
- Tout élément étranger à 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) 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 extérieurs 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 :
PHP Erreur fatale : 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 ces propriétés sont accessibles par :
- La même classe qui l'a déclaré.
Les membres outsiders 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 et même les 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 :
Avis : Propriété indéfinie : Papa::$name
Erreur fatale : Impossible d'accéder à la propriété privée GrandPa::$name
Disséquer la classe des grands-pères en utilisant 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'ai dit dans les trois exemples ci-dessus, protected
y 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 extra-ordinaire en accédant même protected
y private
membres en dehors de la classe !
Eh bien, qu'est-ce que la réflexion ?
Reflection ajoute la possibilité de faire de l'ingénierie inverse sur les classes, les interfaces, fonctions, méthodes et extensions. En outre, il offre des moyens de récupérer les commentaires de la documentation 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 :
- Mark Henry
- John Clash
- Will Jones
Faisons-les (attribuez des modificateurs) public
, protected
y private
respectivement. Vous savez très bien que protected
y private
ne sont pas accessibles en dehors de la classe. Maintenant, contredisons cette affirmation 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
Les idées fausses les plus courantes :
Ne confondez pas avec l'exemple ci-dessous. Comme vous pouvez toujours le voir, le private
y protected
les membres ne sont pas accessibles à l'extérieur de 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
y var_dump
sont fonctions du débogueur . Elles présentent des informations sur une variable sous une forme lisible par l'homme. Ces trois fonctions révèlent le protected
y private
des objets avec PHP 5. Les membres statiques de la classe seront no être montré.
Plus de ressources :
68 votes
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é.
76 votes
Je pense vraiment que cette question devrait être publique, et non protégée.