Question

J'aimerais accomplir quelque chose comme ceci: appelez une méthode, dites & "tourner &", puis faites tourner & "tourner &"; appliqué différemment à différents types de données, par exemple, en appelant " turn " avec un " tournevis " objet / param utilise le & "; turnScrewdriver &"; méthode, appelez " tournez " avec un " volant " objet / param utilise le & "; turnSteeringWheel &"; method, etc. - différentes choses sont en cours, mais elles s'appellent toutes les deux & "; tourner. &";

.

J'aimerais implémenter ceci afin que le code d'appel ne soit pas préoccupé par le (s) type (s) impliqué (s). Dans cet exemple, & "Faites tourner &"; devrait suffire à " tourner " un & "; tournevis &"; & ". volant &"; ou ce qui pourrait nécessiter d'être & "; tourné. &";

En C ++, je le ferais avec une surcharge - et C ++ réglerait les problèmes en fonction du type de données / signature - mais cela ne fonctionne pas en PHP.

Avez-vous des suggestions pour savoir par où commencer? Une déclaration de commutateur est évidente, mais je pense qu'il doit y avoir une solution OO (plus élégante). Non?

TIA

Était-ce utile?

La solution

J'ai lu la solution de davethegr8 mais il semble que l'on pourrait faire la même chose avec une frappe plus forte:

<?php

interface Turnable
{
  public function turn();
}

class Screwdriver implements Turnable
{
  public function turn() {
    print "to turning sir!\n";
  }
}

class SteeringWheel implements Turnable
{
  public function turn() {
    print "to everything, turn, turn turn!\n";
  }
}

function turn(Turnable $object) {
  $object->turn();
}

$driver = new Screwdriver();
turn($driver);

$wheel = new SteeringWheel();
turn($wheel);

$obj = new Object(); // any object that does not implement Turnable
turn($object); // ERROR!

PHP vous permet d'utiliser un indicateur de type pour le paramètre, et l'indicateur de type peut être un nom d'interface au lieu d'un nom de classe. Vous pouvez donc être sûr que si $object implémente l'interface Turnable, il doit alors utiliser la méthode turn(). Chaque classe qui implémente <=> peut faire sa propre chose pour accomplir le retournement.

Autres conseils

Je pense que cela fonctionnera ...

function turn($object) {
    if(method_exists($object, 'turn'.ucwords(get_class($object))) {
        $fname = 'turn'.ucwords(get_class($object));
        return $object->$fname();
    }

    return false;
}

Vous devez consulter le manuel PHP pour obtenir les instructions ici

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top