Comment les interfaces PHP changent réellement le comportement des classes
P粉289775043
2023-09-02 23:49:28
<p>Selon la documentation PHP, </p>
<blockquote>
<p>Les interfaces d'objet vous permettent de créer du code qui spécifie les méthodes qu'une classe doit implémenter sans définir comment ces méthodes sont implémentées. </p>
</blockquote>
<p>Ainsi, une interface est comme une classe avec des méthodes prédéfinies auxquelles il faut encore accéder en utilisant la notation <code>-></code>
<p>Cependant, l'interface ArrayAccess permet d'accéder aux objets sous forme de tableaux. Les objets sont accessibles en utilisant <code>$object->property</code> et <code>$object["property"]</code></p>
<p>Je ne comprends pas comment ArrayAccess permet de modifier la syntaxe de l'objet. J'ai écrit un morceau de code pour essayer de reproduire l'effet de la méthode <code>ArrayAccess</code>un seul</em>, mais cela renvoie l'erreur</p>
<pre class="brush:php;toolbar:false;">// Utilisation de l'interface PHP ArrayAccess
espace de noms A {
classe maclasse implémente ArrayAccess {
public function offsetExists($offset) { return true }
fonction publique offsetGet($offset) {
// changement de comportement
return $this->{$offset} ??
}
fonction publique offsetSet ($ offset, $ valeur) {}
fonction publique offsetUnset($offset) {}
}
$maclasse = new maclasse();
$maclasse->access = 'Interface';
echo $maclasse['accès']; // "Interface"
} ;
//Essayer d'implémenter ma propre interface ArrayAccess
espace de noms B {
interface MonArrayAccess {
fonction publique offsetGet($offset);
}
la classe maclasse implémente MyArrayAccess {
fonction publique offsetGet($offset) {
// change de comportement
return $this->{$offset} ??
}
}
$maclasse = new maclasse();
$maclasse->access = 'Interface';
echo $myclass['access']; // Erreur fatale : erreur non détectée : impossible d'utiliser un objet de type Bmyclass comme tableau
}
≪/pré>
<p>S'il vous plaît, aidez-moi à l'expliquer correctement. Merci</p>
Je ne dis pas que les interfaces "changent le comportement d'une classe", je dis que les interfaces facilitent étendre les fonctionnalités de classe.
Pour comprendre l'interface, en tant que concept de programmation orientée objet, nous devons d'abord comprendre quel problème elle veut résoudre.
Quel problème « Interface » vise-t-il à résoudre ?
Une interface est un contrat. Voici comment implémenter duck-typing en PHP. Vous devez penser du point de vue d'un rédacteur de bibliothèque qui souhaite exposer les fonctionnalités aux autres. Par exemple,
Pour garantir que les usagers de la bibliothèque connaissent la méthode
$person
需要有getName()
方法,您可以创建一个类Person
> 有一个getName()
. Utilisez ensuite les déclarations de type pour détecter les erreurs potentielles lorsque le code est résolu.Supposons qu'il existe une autre bibliothèque qui nourrit les objets avec de la nourriture :
Considérez ceci...
Maintenant, disons que l'utilisateur souhaite écrire une fonction qui peut à la fois manger et dire bonjour
Pet
类。用户不想仅仅为了Pet
Réécrivez ces fonctions.Comment écrire
Pet
以便同时使用Greeter
和Feeder
bibliothèque ?Peut-être que c'est le cas ?
Malheureusement, PHP ne prend pas en charge l'héritage multiple. Une classe ne peut avoir qu'une seule classe. Le code ci-dessus n'est pas valide. Ainsi, dans la situation actuelle, les utilisateurs ne peuvent utiliser qu’une seule des bibliothèques.
De plus, « nom » peut être un concept très différent pour différentes choses (par exemple, on peut utiliser la méthode扩展
.
Ainsi, en tant que rédacteur de bibliothèque, vous souhaitez que sa bibliothèque soit aussi flexible que possible pour les utilisateurs. Que pouvez-vous faire?getName() 返回
$first_name
和$last_name
代码>)。您的库类中可能没有合理的默认实现getName()
bibliothèque
Greeter
bibliothèque
Pas besoin d'une classe spécifique (ou d'un héritage de classe parent), une classe peut implémenter plusieurs interfaces. LaFeeder
classe suivante est donc tout à fait valide en PHP :
Maintenant, les objets de cettePet
classe peuvent être utilisés avec la bibliothèque
.Pet
类的对象可以与Greeter
库和Feeder
et la bibliothèqueArrayAccess
L'interface ArrayAccess
n'est pas déclarée par un rédacteur de bibliothèque d'interface tiers, mais est écrite par un rédacteur PHP principal. Le rédacteur principal de PHP fournit un support plus approfondi pour cela. 🎜Un peu comme les interfaces que nous avons mentionnées précédemment, PHP fournit des fonctionnalités aux classes qui l'implémentent. Mais au lieu de fournir l'
Greeter
或Feeder
exemple ci-dessus, le noyau PHP fournit sucre syntaxique pour une classe qui implémente ArrayAccess. Cela signifie que vous pouvez utiliser un code plus simple lorsque vous traitez avec des classes qui implémentent l'interface AccessAccess.Dans l'exemple officiel,
Si vous les avez implémentés, remplacez-les par :
Vous pouvez utiliser
$obj
avec une syntaxe de type tableau pour rendre votre code plus court :