Funktion, die eine Kennziffer auswertet und eine entsprechende Funktion startet

d3mueller

Mitglied
Hi,

ich habe folgendes Problem:

Es gibt verschiedene Missionsarten, die eine Einheit (in nem Browsergame) ausführen kann. Die Missionsart ist in einer Datenbank gespeichert (entweder mit einer Zahl, die für eine Mission steht, oder einem String).

Jetzt soll ein Skript dieses Feld mit der Missionsart auswerten und sagen, welche Funktion ausgeführt werden soll (z.B. Angreifen, Verteidigen, erforschen etc)

Man kann natürlich schreiben:

PHP:
if($missionsart == 1) // tue dies;
if($missionsart == 2) // tue das;

// Oder halt mit switch()

Aber das Problem ist, dass ich an mehreren Stellen diese Missionsart überprüfen muss. Also müsste ich dann mehrmals diese if-else-Zweige einfügen. Das ist wartungstechnisch (und bei Ergänzung von weiteren Missionsarten) recht aufwendig.

Jetzt wollte ich das Ganze in eine Zentralfunktion packen, die dann eben zurückgibt, welche Mission gestartet werden soll. Aber ich hab keine Ahnung, wie ich das umsetzen kann. Ich könnte die Funktion als String zurückgeben und per eval() ausführen lassen. Aber es könnte ja sein, dass ich manchmal andere Parameter brauche etc.

Ich weiß jetzt leider nicht mehr weiter.

Ich hoffe, mein Problem ist verständlich^^

Vielen Dank schon mal für eure Ideen

Viele Grüße,
Dennis
 
das weiß ich :D

Mein Problem ist folgendes:

Angenommen, die "Zentralfunktion" macht das hier:
PHP:
function zentralfunktion($nummer) {
if ($nummer == 2) return "funktionsname($parameter)";
}

jetzt kann man ja das, was returned wurde, mit eval() ausführen lassen.

Aber was, wenn ich andere Parameter brauche? Wenn ich z.B. "funktionsname($parameter1, $irgendwas) brauche, statt "funktionsname($parameter)"

Das ist mein Problem
 
Zuletzt bearbeitet:
Du könntest die Funktion ein Objekt zurückgeben lassen oder eine Closure.

PHP:
<?php

class TestMission
{
    public function doSomething($a, $b) {}
}

class OtherMission
{
    public function foo($x) {}
}

function createMission($id)
{
    switch (true) {
        case (1 === $id):
            return new TestMission();
            break;
        case (2 === $id):
            return new OtherMission();
            break;
        default:
            /* no operation (nop) */
            break;
    }

    throw new Exception('Unknown mission');
}

Weiß aber nicht, ob das insgesamt ein sinnvoller Ansatz ist.
 
Wie wäre es mit dem hier: http://php.net/manual/de/function.call-user-func.php
Das sollte dein Problem lösen

Danke für den Vorschlag, aber irgendwie verstehe ich nicht, warum man so eine Funktion braucht? Die macht doch auch nichts anderes, als wenn man die Funktion "normal" aufruft, oder?

EDIT: Korrigiere, das löst mein Problem doch :D Vielen Dank! :)

Du könntest die Funktion ein Objekt zurückgeben lassen oder eine Closure.

PHP:
<?php

class TestMission
{
    public function doSomething($a, $b) {}
}

class OtherMission
{
    public function foo($x) {}
}

function createMission($id)
{
    switch (true) {
        case (1 === $id):
            return new TestMission();
            break;
        case (2 === $id):
            return new OtherMission();
            break;
        default:
            /* no operation (nop) */
            break;
    }

    throw new Exception('Unknown mission');
}

Weiß aber nicht, ob das insgesamt ein sinnvoller Ansatz ist.
Wäre eine Idee, aber das ist glaube ich dann ziemlich kompliziert^^
 
Zuletzt bearbeitet:
Wenn du Lust hast, könntest du noch mal konkreter zeigen, was du da wie aufrufst. Ich bin nicht sicher, dass ich einerseits verstehe, worum es dir geht, und dass das andererseits auf diese Weise „geschickt“ ist. Ich weiß es nicht. :)
 
PHP:
public function getMission($mission) {
		
		switch ($mission) {
			case "Angriff":
				return "AngriffsMission";
				break;
			default:
				return false;
				break;
		}
		
		
	}

So bekomme ich die Methode, um sie dann auszuführen:

PHP:
$mission = $this->getMission("Angriff");

$this->{$mission}($beliebigeParameterDieIchIndividuellHinzufügenKann);
// Jetzt wird die Methode AngriffsMission ausgeführt

So kann man halt noch selber die Parameter einfügen, jenachdem wie man sie braucht :)
 

Neue Beiträge

Zurück