考虑以下代码:
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 类中实现了一个工厂“create”方法,它允许我获取我想要使用的类的实例。
我尝试使用“return new self();” 但这总是返回一个 Vehicle 的实例,所以我求助于使用 eval。
问题:是否有一种非评估方式来实现 create() 方法,以便:
- 它返回您正在使用的类的实例
- 它不需要在每个扩展类上实现 create()