web-dev-qa-db-fra.com

Est-il possible d'avoir une interface qui a des méthodes privées / protégées?

Est-il possible en PHP 5 d'avoir une interface qui a des méthodes privées/protégées?

En ce moment, j'ai:

interface iService
{
    private method1();
}

Cela jette une erreur:

Erreur d'analyse: erreur de syntaxe, T_STRING inattendu, attente de T_VARIABLE

Je veux juste avoir la confirmation qu'il est vrai qu'une interface ne peut contenir que des méthodes publiques.

67
teepusink

La page de manuel PHP sur les interfaces indique explicitement:

Toutes les méthodes déclarées dans une interface doivent être publiques; c'est la nature d'une interface.

Je suppose que cela explique l'erreur que vous obtenez ;-)

118
Pascal MARTIN

Les interfaces sont utilisées pour décrire les méthodes publiques d'une classe implémentant cette interface. Vous ne pouvez jamais avoir une méthode privée dans une interface. Toutes les méthodes d'une interface sont supposées être utilisées et ne doivent pas être modifiées.

Interfaces est le lien PHP, mais c'est standard dans la programmation OO.

20
ryanday

En général, une interface ne peut avoir que des membres publics, car la seule fonction d'une interface doit être héritée.

Depuis le didacticiel PHPfreaks.com:

PHP5 propose des interfaces. À ne pas confondre avec les interfaces au sens plus général, le mot-clé interface crée une entité qui peut être utilisée pour appliquer une interface commune aux classes sans avoir à les étendre comme avec les classes abstraites. Au lieu de cela, une interface est implémentée.

Les interfaces sont différentes des classes abstraites. D'une part, ils ne sont pas vraiment des classes. Ils ne définissent pas de propriétés et ne définissent aucun comportement. Les méthodes déclarées dans une interface doivent être déclarées dans les classes qui l'implémentent.

Parce qu'une interface au sens plus général est une définition de la façon dont un objet interagit avec un autre code, toutes les méthodes doivent être déclarées publiques (voir la section sur la visibilité dans ce chapitre). En utilisant des classes abstraites, une méthode abstraite peut avoir n'importe quelle visibilité, mais les classes d'extension doivent avoir leurs implémentations utiliser la même visibilité (ou plus faible). L'implémentation d'une interface ajoute les méthodes en tant que méthodes abstraites à la classe sujet, l'échec de l'implémentation entraînera une erreur comme celle-ci:

Erreur fatale: la classe SomeConcreteClass contient n méthode (s) abstraite (s) et doit donc être déclarée abstraite ou implémenter les méthodes restantes Oui, les classes abstraites peuvent implémenter des interfaces.

9
Webleeuw

les interfaces sont des déclarations de type. un type est un ensemble de valeurs, plus un ensemble d'opérations qui peuvent être exécutées de l'extérieur. une méthode privée ne rentre pas dans cette image.

interface T {
  public /*int*/ function f(array $a);
}
interface U {
  public /*T*/ function g(T $t);
}

class C implements U {
    public function g(T $t) {
        ...
        $x = $t->f();
        ...
    }
}

les interfaces sont utiles car elles indiquent, bien, les interfaces des objets. comment les objets communiquent avec leur environnement.

disons maintenant T::f pourrait être déclaré privé. comment cela serait-il utile à d'autres objets? il ne serait pas appelable de l'extérieur, il ne ferait pas partie de son interface.

6
just somebody

Dans de nombreux cas, une définition d'interface aide d'autres modules à garantir le comportement et l'API d'une classe. Dans ces cas, les méthodes privées ne sont pas quelque chose que les autres modules peuvent accéder ou comprendre. C'est pourquoi vous ne pouvez jamais mettre de méthodes privées sur une interface.

3