是否有可能在抽象构造函数中允许不同的数据类型?

Is there a possibility to allow different data types in an abstract constructor?

长话短说:是否可以在抽象构造函数中允许不同的数据类型?

详细问题: 我想定义一个允许多种数据类型的抽象构造函数:

abstract class ValidationRule
{
  protected $ruleValue;
  protected $errorMessage;

  abstract public function __construct($ruleValue); // see here

  protected function setErrorMessage($text)
  {
    $this->errorMessage = $text;
  }
}

扩展 类 现在实现抽象构造函数。 我希望构造函数允许不同的数据类型(int、bool、string、...)。


class MinCharacters extends ValidationRule
{
  public function __construct(int $ruleValue) // see here
  {
    $this->ruleValue = $ruleValue;
    $this->setErrorMessage("At least " . $this->ruleValue . " characters necessary.");
  }
}

class Required extends ValidationRule
{
  public function __construct(bool $ruleValue) // and here
  {
    $this->ruleValue = $ruleValue;
    $this->setErrorMessage("Field required.");
  }
}

当我实例化一个对象时,出现以下错误。我知道这个问题,但想知道是否有任何解决方案如何在构造函数中允许多种数据类型。


$rule = new MinCharacters(5);
/*
Fatal error: Declaration of MinCharacters::__construct(int $ruleValue) 
must be compatible with ValidationRule::__construct($ruleValue) in 
/opt/lampp/htdocs/index.php on line 51
*/

只需在摘要中省略构造函数 class。

定义抽象构造函数没有特别意义。

扩展 class 时,class 的构造函数已不受通常方法签名兼容性规则的约束。

因此您可以:

  • 将构造函数定义为常规(非抽象)方法
  • 或完全省略其定义

并且在这两种情况下,扩展的 classes 可以定义它们 want/need 的任何构造函数。

但是通过将方法定义为 abstract,您是在说“扩展 时需要实现兼容签名的方法” ,从而使“构造函数异常”无效。