我有:
我有两个类 Car :
我的问题是方法 drive()在这两种情况下有不同数量的参数。
这是代码:
abstract class Car{
abstract public function drive( //variable number of args );
}
class Manual_Car extends Car{
public function drive( $speed, $gearbox){
...
}
}
class Automatic_Car extends Car{
public function drive( $speed ){
...
}
}
如何使用未知数量的参数声明我的抽象类?
答案 0 :(得分:0)
PHP允许变长参数:
abstract class Car {
abstract public function drive(...$args);
}
http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list
编辑:
看起来PHP并没有让你这样做......耻辱。以上代码错误。 varargs
似乎将额外的args收集到一个数组中而不是仅接受更多的参数(或向运行时发出信号,表明此abstract
方法接受0或多个参数)
abstract
类来实现它
class Car {
public function drive(...$args) {
throw new Exception("not implemented");
}
}
class AutomaticCar extends Car {
public function drive($speed, $gearbox) {
echo $speed;
}
}
以上警告但不是错误。 任何意味着它并不完美 - 有责任留给实施者来实际发现drive
是必需的覆盖,但它有效。
$x = new AutomaticCar();
$x->drive(10, null); // null b/c I have no idea what you're doing
> 10
警告是
PHP Warning: Declaration of AutomaticCar::drive($speed, $gearbox) should be compatible with Car::drive(...$args)
但是......我并不是说这是个好主意......你可以保持警告。
答案 1 :(得分:0)
我找到了解决方案! 感谢@Alex Howansky。
尝试声明具有未知数量的参数的抽象类不是最佳实践,因为它会出现签名违规的情况。
最佳实践
$gearbox
等所有额外参数应为类参数。
我的示例中的解决方案代码:
abstract class Car{
protected $arg1, $arg2;
public function __construct( $arg1, $arg2 ){
$this->arg1 = $arg1;
$this->arg2 = $arg2;
}
abstract public function drive( $speed );
}
class Manual_Car extends Car{
protected $gearbox;
public function __construct( $arg1, $arg2, $gearbox ){
parent::__construct( $arg1, $arg2 );
$this->gearbox = $gearbox;
}
public function drive( $speed ){
...
//use $this->gearbox here
}
}
class Automatic_Car extends Car{
public function drive( $speed ){
...
}
}
答案 2 :(得分:-1)
你有没有尝试过:
抽象公共功能驱动器($ speed,$ gearBox = null);
如果您只有两个选项,为什么要使用未知数量的参数?