Quelque chose comme une surcharge en PHP?
-
20-08-2019 - |
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
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
.