如果父函数的参数多于子函数,则扩展函数不再有效,即使额外参数具有默认值

时间:2018-02-08 15:36:53

标签: php symfony symfony-2.8 php-7.2

我注意到自PHP 7.2以来的一个问题,即如果父函数的参数多于子函数,则扩展函数不再有效,即使父类中的额外参数具有默认值。

抛出以下致命错误:

Compile Error: Declaration of
WebBox\PageBundle\Form\Type\PageType::buildForm(Symfony\Component\Form\FormBuilderInterface $builder, array $options)
must be compatible with
WebBox\FrontBundle\Form\Type\CoreType::buildForm(Symfony\Component\Form\FormBuilderInterface $builder, array $options, $noSubmit = false, $submitText = NULL)

这适用于Symfony项目,其中表单类(在本例中为PageType)从共享表单类CoreType扩展,因此我们的许多表单都可以获得某些常用功能。 - 这个问题并不仅限于PageType类,它只是我们注意到的第一个例子。

CoreType将公共函数buildForm定义为:

public function buildForm(FormBuilderInterface $builder, array $options, $noSubmit = false, $submitText = null) {...}

班级PageType(以及从CoreType延伸的任何其他人)将buildForm定义为:

public function buildForm(FormBuilderInterface $builder, array $options) {...}

函数PageType::buildForm()(和其他人)通常会调用CoreType::buildForm()来完成具有一些常见行为的表单构建,可选择选择不放入提交按钮($noSubmit),或者出于各种原因调整提交按钮文本($submitText)。例子:

parent::buildForm($builder, $options);
parent::buildForm($builder, $options, true);
parent::buildForm($builder, $options, false, $this->translate("Submit for approval"));

这从PHP 5.5到7.1一直有效,但我们突然发现PHP 7.2中不允许这样做。 (无法在7.1 to 7.2 migration docs中看到任何提及此类更改的内容。)

我们多年来一直在做错,或者这是PHP 7.2中的错误/弃用?

这对我们来说并不是一笔很重要的交易,因为我们可以轻松切换PHP版本,但我很欣赏某些设置(例如带有包管理器的Linux),这并不容易。

0 个答案:

没有答案