我注意到自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),这并不容易。