wir haben ein Problem [cit.]PHP: ‚Dynamic‘ Rückruf von innen/außen eine Klasse
Ich brauche einen Rückruf dynamisch innerhalb einer Klasse zugeordnet wird, in der Basis eines variablen param: Mein Ziel ist es zu haben nur eine Klasse (und nicht eine Hauptklasse und viele Extender Unterklassen), und innerhalb dieser Klasse, wenn ein Wert X ist, dann muss die Funktion funcitonX verwendet werden, wenn Y die Funktion Y ist.
ich weiß, dass ich gut erklären kann nicht, ich hoffe, mein Beispiel tun:
class plzComplicateMyLife{
public $vehicle;
public $kindVehicle;
public $dynamicFunction;
public function __construct($vehicle, $kindVehicle){
$this->kindVehicle = $kindVehicle;
$this->vehicle = $vehicle;
switch($kindVehicle){
case 'cycle':
$this->dynamicFunction = "isACycle";
break;
case 'car':
$this->dynamicFunction = "isACar";
break;
}
//here come the problem, i need to call the callback store in dynamicFunction.
//i tried:
//call_user_func($this->$this->dinamicFunction, $this->vehicle);
//error: Catchable fatal error: Object of class plzComplicateMyLife could not be converted to string in [...]
//call_user_func("plzComplicateMyLife::".$this->dynamicFunction);
//Warning: call_user_func(plzComplicateMyLife::isACar) [function.call-user-func]: First argument is expected to be a valid callback in [...]
//$this->dynamicFunction();
//Fatal error: Call to undefined method plzComplicateMyLife::dynamicFunction() in [...]
//so, how can i do that?
}
public function isACycle($vehicle){
echo 'im a cycle, model: '.$vehicle.'<br />';
}
public function isACar($vehicle){
echo 'im a car, model: '.$vehicle.'<br />';
}
//i know this has no sense, in this example at least.
public function printKind(){
//call_user_func($this->$this->dinamicFunction, $this->vehicle);
//call_user_func("plzComplicateMyLife::".$this->dynamicFunction);
//then?
}
}
$maserati = new plzComplicateMyLife('maserati4', 'car');
//then, maybe, outside the class i'll need to recover the callback:
$maserati->printKind();
EDIT:
Als Rob sagte, würde Polymorphismus wirklich eine gute Lösung sein.
Aber das Problem ist, dass in diesem Fall ich wirklich muss die gleiche Erklärung für jede Instanz der Klasse haben, werden nur die Parameter zu ändern ... zB:
$maserati = new plzComplicateMyLife('maserati4', 'car');
$ducati = new plzComplicateMyLife('maserati4', 'cycle');
//is good
//becose i cant have:
$maserati = new plzComplicateMyLifeWithACar('maserati4');
$ducati = new plzComplicateMyLifeWithACycle('maserati4');
Yes'n sein Exacle, was ich tun werde! Danke, Kumpel! – Strae
Ich habe es nicht versucht, aber ich falsch liegen mit der Aussage, wenn jede dieser Klassen in separaten Quelldateien definiert wäre, dann müsste die Basisklasse die erweiterten Klassendefinitionsdateien enthalten, während gleichzeitig die erweiterten Klassen müsste die Basisklasse enthalten? (Der einzige Grund, warum ich mich nicht sicher bin, ist die Verwendung von 'new $ type ($ model)'.) – grantwparks
Die erweiterten Klassen müssten nur die Basisklasse enthalten, wenn sie nicht bereits enthalten wäre erweiterte Klassendateien, bevor sie instanziiert werden, das wäre alles was Sie tun müssen. Alternativ können Sie spl_autoload_register() betrachten –