次のコードを検討してください。
class Vehicle {
/**
* Create a new instance of Vehicle
*
* @return Vehicle
*/
public static function create(){
return eval( "return new " . get_called_class() . '();' );
// return self(); would always return Vehicle reg ardless
}
public function drive(){
echo "I am a Vehicle!";
}
}
class Bus extends Vehicle {
public function drive(){
parent::drive();
echo "\nSpecifically, a bus!";
}
}
class Car extends Vehicle {
public function drive(){
parent::drive();
echo "\nSpecifically, a car!";
}
}
// Drive a car
Car::create()->drive();
// Drive a bus
Bus::create()->drive();
使用したいクラスのインスタンスを取得できるようにするファクトリー「作成」メソッドを Vehicle クラスに実装しました。
「return new self();」を使ってみた しかし、それは常に Vehicle のインスタンスを返すため、eval を使用することにしました。
質問: 次のように create() メソッドを実装する非評価方法はありますか?
- 使用しているクラスのインスタンスを返します
- 拡張クラスのそれぞれに create() を実装する必要はありません