1

我注意到自 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 到 7.2 迁移文档中看不到任何提及此类更改的内容。)

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

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

4

0 回答 0