Les méthodes d'accès de PHP5 vous permettent de restreindre l'accès aux membres de la classe. Il s'agit d'une nouvelle fonctionnalité de PHP5, mais elle existe déjà dans de nombreux langages orientés objet. Avec les méthodes d'accès, vous pouvez développer une application orientée objet fiable et créer des objets réutilisables. bibliothèque de classes orientée.
Comme C++ et Java, PHP dispose de trois méthodes d'accès : publique, privée et protégée. Pour la méthode d'accès d'un membre de classe, il peut s'agir de l'une d'entre elles. Si vous ne spécifiez pas la méthode d'accès, l'accès est par défaut. La méthode est publique. Vous pouvez également spécifier une méthode d'accès pour les membres statiques en plaçant la méthode d'accès avant le mot clé static (par exemple,
les membres publics sont accessibles sans restrictions. Tout code en dehors de la classe peut lire et écrire des propriétés publiques
).. Vous pouvez appeler une méthode publique depuis n'importe où dans votre script. Dans les versions précédentes de PHP, toutes les méthodes et propriétés étaient publiques, ce qui donnait l'impression que les objets étaient des tableaux bien structurés.
Membres privés visibles uniquement dans la classe. d'une propriété privée en dehors de la méthode de classe dans laquelle elle réside. De même, seules les méthodes de la même classe peuvent appeler une méthode privée et aucune des sous-classes héritées ne peut accéder aux membres privés de la classe parent
. la classe peut accéder aux membres privés. Voir l'exemple 6.8, la méthode equals compare deux widgets. L'opérateur == compare deux widgets de la même classe Object, mais dans cet exemple, chaque instance d'objet a un ID unique.
et le prix. Notez comment la méthode equals accèdeà
la propriété privée d'une autre instance de Widget. Java et C autorisent cette opération.
classeWidget
{
privé $nom ;
prix privé en $ ;
$id privé ;
fonction publique __construct ($ nom, $ prix)
{
$this->nom = $nom;
$this->price = floatval($price);
$this->id = uniqid();
}
// vérifie si deux widgets sont identiques Vérifie si deux widgets sont identiques
la fonction publique est égale ($ widget)
{
return(($this->name == $widget->name)ET
($this->price == $widget->price));
}
}
$w1 = nouveau widget('Cog', 5.00);
$w2 = nouveau widget('Cog', 5.00);
//TRUE
);
si($w1->est égal($w2))
{
print("w1 et w2 sont identiquesn");
}
//FAUX
si($w1->est égal($w3))
{
print("w1 et w3 sont identiquesn");
}
//FALSE, == inclut l'identifiant en comparaison
if($w1 == $w2) //pas égal car les identifiants sont différents
{
print("w1 et w2 sont identiquesn");
}
?>
Si vous débutez dans la programmation orientée objet, vous vous demandez peut-être à quoi sert l'utilisation de membres privés. Vous vous souvenez peut-être des idées d'encapsulation et de couplage, dont nous avons parlé au début de ce chapitre. . Ils peuvent être cachés à l'intérieur d'une classe sans être accessibles par du code en dehors de la classe. Ils aident également à obtenir un couplage lâche si le code en dehors de la structure de données ne peut pas accéder directement aux propriétés internes, alors il n'y aura pas de relation implicite
. les propriétés privées peuvent toujours être partagées par du code externe. La solution consiste à utiliser une paire de méthodes publiques, l'une est get (obtient la valeur de la propriété), l'autre est set (définit la valeur de la propriété). valeur initiale. Cela permet à la communication entre les membres de s'effectuer via une interface étroite et bien qualifiée. Cela offre également la possibilité de modifier la valeur transmise à la méthode. Notez dans l'exemple 6.8 comment le constructeur force le prix à être un nombre flottant (floadval(). )).
Les membres protégés sont accessibles par toutes les méthodes de la même classe et dans les classes héritées. Les propriétés publiques violent l'esprit de l'encapsulation car elles permettent aux sous-classes de dépendre. L'écriture d'un attribut spécifique dans la méthode protégée ne pose pas ce problème. L'utilisation de la méthode protégée doit être claire sur la structure de sa classe parente.
Notez que Widget a désormais une méthode protégée appelée getName. Si une instance de Widget tente d'appeler la méthode protégée, une erreur se produira : $w1->getName(. ) génère une erreur. Mais la méthode getName de la sous-classe Thing peut appeler cette méthode protégée. Bien sûr, pour prouver que la méthode Widget::getName est protégée, cet exemple semble trop simple. Dans les situations réelles, l'utilisation de méthodes protégées dépend de. comprendre la structure interne de l’objet.
<?php
classeWidget
{
privé $nom ;
prix privé en $ ;
$id privé ;
fonction publique __construct ($ nom, $ prix)
{
$this->nom = $nom;
$this->price = floatval($price);
$this->id = uniqid();
}
// vérifie si deux widgets sont identiques
la fonction publique est égale ($ widget)
{
return(($this->name == $widget->name)ET
($this->price == $widget->price));
}
fonction protégée getName()
{
return($this->nom);
}
}
classe Thing étend le widget
{
privé $color ;
fonction publique setColor($color)
{
$this->color = $color;
}
fonction publique getColor()
{
return($this->color);
}
fonction publique getName()
{
return(parent::getName());
}
}
$w1 = nouveau widget('Cog', 5.00);
$w2 = nouvelle chose('Cog', 5,00);
$w2->setColor('Yellow');
//TRUE (encore !) Le résultat est toujours vrai
si($w1->est égal($w2))
{
print("w1 et w2 sont identiquesn");
}
//imprimer la sortie Cog Cog
print($w2->getName());
?>
Une sous-classe peut modifier la façon dont la méthode est accessible en remplaçant la méthode de la classe parent. Cependant, il existe toujours certaines restrictions si vous remplacez un membre de la classe publique, il doit rester public dans la sous-classe. membre, il peut rester protégé ou devenir public. Les membres privés sont toujours visibles uniquement dans la classe actuelle. Déclarer un membre portant le même nom qu'un membre privé de la classe parent créera simplement un membre différent dans la classe actuelle. vous ne pouvez pas remplacer un membre privé.
Le mot clé Final est un autre moyen de restreindre l'accès aux méthodes membres. Une sous-classe ne peut pas remplacer une méthode marquée comme final dans une classe parent.