PHP抽象方法,参数数量未知

时间:2018-03-06 19:26:43

标签: php abstract-class

我有:

  • 抽象类Car ,其抽象方法名为 drive()

我有两个类 Car

  1. Manual_Car
  2. Automatic_car
  3. 我的问题是方法 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 ){
          ...
       }
    }
    

    如何使用未知数量的参数声明我的抽象类?

3 个答案:

答案 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);

如果您只有两个选项,为什么要使用未知数量的参数?