Frage

Ich möchte so etwas wie dies zu tun: eine Methode aufrufen, sagen Sie „drehen“ und haben „turn“ dann unterschiedlich auf verschiedene Datentypen angewendet, zB Aufruf „turn“ mit einem „Schraubendreher“ Objekt / param Anwendungen die „turnScrewdriver“ Methode „turn“ mit einem „LENKRAD“ Objekt / param Aufruf verwendet die „turnSteeringWheel“ Methode usw. - „turn“ verschiedene Dinge getan werden, aber sie sind beide genannt

Ich möchte, dies implementieren, so dass der anrufende Code nicht über die Art (en) beteiligt zu kümmern. In diesem Beispiel „turn“ sollte einen „Schraubendreher“ auf „turn“ genügen, „LENKRAD“, oder was auch immer vielleicht werden müssen „gedreht.“

In C ++ würde ich dies mit Überlastung - und C ++ würde die Dinge in Ordnung bringen, basierend auf dem Datentyp / Unterschrift -. Dies funktioniert jedoch nicht in PHP

Irgendwelche Vorschläge, wo soll ich anfangen? Eine switch-Anweisung ist offensichtlich, aber ich denke, es muss eine (elegantere) OO Lösung sein. Nein?

TIA

War es hilfreich?

Lösung

Ich lese davethegr8 Lösung, aber es scheint man die gleiche Sache mit stärkerer Typisierung tun könnte:

<?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 macht Sie erlauben eine Art Hinweis für den Parameter zu verwenden, und der Typ Hinweis kann eine Schnittstelle Name anstelle eines Klassennamens sein. So können Sie sicher sein, dass, wenn die $object die Turnable-Schnittstelle implementiert, dann ist es muss die turn() Methode haben. Jede Klasse, die implementiert Turnable kann seine eigene Sache tun erreichen drehen.

Andere Tipps

Ich denke, das wird funktionieren ...

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

    return false;
}

Sie müssen die PHP Manual für Anweisungen überprüfen hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top