我々は問題を抱えているPHP:内部から「動的」コールバック/クラスの外
私は変数のparamのベースに、クラス内で動的にコールバックを割り当てる必要があります[CITを。]:私の目標は持っていることですクラスが1つ(メインクラスではなく、多くのエクステンダサブクラス)であり、値がXの場合はこの関数内でfuncitonXを使用しなければなりません。私はうまく説明カント知っ
は、私は私の例が行うことを願っています:
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:ロブが言ったように
は、多型が本当に良い解決策になります。
しかし、問題は、例えば...この場合には、私は本当に必見はパラメータのみを変更し、すべてのクラスのインスタンスで同じ宣言を持っている、ということである:
$maserati = new plzComplicateMyLife('maserati4', 'car');
$ducati = new plzComplicateMyLife('maserati4', 'cycle');
//is good
//becose i cant have:
$maserati = new plzComplicateMyLifeWithACar('maserati4');
$ducati = new plzComplicateMyLifeWithACycle('maserati4');
はい、それは私のやることです。ありがとう、仲間! – Strae
私は試していませんでしたが、これらのクラスが別々のソースファイルで定義されている場合、基本クラスには拡張クラス定義ファイルを含める必要がありますが、同時に拡張クラス基本クラスを含める必要がありますか? (私が確信している唯一の理由は 'new $ type($ model) 'の使用のためです。 – grantwparks
拡張クラスは、まだ含まれていなければ基本クラスを含む必要があります。拡張クラスのファイルをインスタンス化する前にそれを行う必要があります。また、spl_autoload_register() –