Je vois ces interfaces dans Symfony et parfois dans d'autres projets. Habituellement, ils ne contiennent qu'un setter et un getter et ils classent qui implémentent qui doivent implémenter la méthode à partir de l'interface.

Je ne vois cependant pas la valeur ajoutée ici. Pourquoi ne pas simplement ajouter la méthode au lieu d'avoir 4-5 implémentations parce que vous voulez ajouter des interfaces conscientes et capables à une classe existante.

Oui, vous pouvez facilement voir ce qu'une classe est capable de faire, mais vous pouvez également le voir en fonction des méthodes et cela vous donne beaucoup plus d'interfaces qui (à mes yeux) n'ajoutent pas vraiment quelque chose.

Quelqu'un pourrait-il m'expliquer pourquoi les gens les utilisent en PHP? Je sais qu'ils pourraient avoir une place en Java (je pense que cela vient de Spring?). Mais je ne vois pas la valeur ici.

-2
Stephan-v 17 janv. 2017 à 16:06

2 réponses

Meilleure réponse

Dans le cas du framework Symfony, ContainerAwareInterface est utilisé pour «marquer» une classe comme ayant besoin du conteneur. En particulier, les contrôleurs peuvent éventuellement implémenter l'interface.

Ce qui se passe, c'est que lorsqu'un contrôleur est instancié par le gestionnaire de requêtes, le conteneur est injecté si le contrôleur implémente l'interface. Un peu de hack peut-être mais en pratique, utiliser des interfaces pour traiter spécialement certains groupes de classes fonctionne bien. Assurez-vous simplement de documenter.

Je dois également souligner que les versions ultérieures du framework fournissent un ContainerAwareTrait qui supprime le besoin d'implémenter réellement la méthode setContainer.

3
Cerad 17 janv. 2017 à 13:34

Essayez de penser une interface comme un plan, qui décrit votre classe.

La principale raison pour laquelle nous utilisons une interface est qu'elle donne la possibilité de permuter les implémentations.

Lorsqu'une classe implémente une interface, elle signe un contrat stipulant qu'elle doit fournir les méthodes définies dans votre interface. Disons que deux classes implémentent cette interface particulière. Maintenant, ils ont signé un contrat pour fournir ces méthodes. Jusqu'ici tout va bien. Maintenant, un terme que vous pourriez entendre souvent est programme vers une interface. Si 2 classes mettent en œuvre un contrat, nous pouvons les échanger à volonté. Prenons l'exemple ci-dessous.

interface CarInterface
{
    public function hasName();
    public function hasEngine();
    public function accelerate();
}

class toyota{
    public function hasName(){
    //implementation
    }

    public function hasEngine(){
    //implementation
    }

    public function accelerate(){
    //implementation
    }
}

class opel{
    public function hasName(){
    //implementation
    }

    public function hasEngine(){
    //implementation
    }

    public function accelerate(){
    //implementation
    }
}

Maintenant nous pouvons avoir une classe qui a besoin d'une voiture.

class circuit{

protected $car;

public function __construct(CarInterface $car)
    {
        $this->car=$car;
    }

public function startRace(){
    $this->car->accelerate();
}


}

Ok, nous sommes prêts à partir, imaginez que nous devons installer le circuit de classe. Nous devons passer un objet à cette nouvelle instance, mais quel objet? TOUT objet qui implémente l'interface. Parce que nous l'avons typé, nous avons programmé une interface et non une implémentation concrète.

$circuit = new circuit(new toyota);
$circuit->startRace();

Plus tard, nous devons le changer, car nous avons besoin d'un circuit pour faire fonctionner notre voiture Opel. Aucun problème.

$circuit = new circuit(new opel);
$circuit->startRace();

Nous sommes capables d'échanger des implémentations à volonté car nous avons programmé sur une interface. C'est le principal avantage. Veuillez lire les sujets dont je parle ici, il est difficile de comprendre ces concepts, mais une fois que vous les utilisez, vous les utilisez tout le temps. J'espère que c'est un peu plus clair maintenant.

-2
N. Thanasis 17 janv. 2017 à 13:35