使用 EasyExtends 时方法签名显然不匹配

Method signature apparently not matching while using EasyExtends

我正在开发一个使用 EasyExtends 扩展 Sonata 页面包的现有项目。该项目基于 Symfony 3.3.

在这个项目中已经存在一个 class 在命名空间 Application\Sonata\PageBundle\Admin 中称为 PageAdmin 扩展 BasePageAdmin. 它包含定义两个函数 -- getPageTypesconfigureFormFields.

当我尝试将函数 configureTabMenu 从这个 class 的供应商副本克隆到应用程序副本时,我从应用程序那里收到以下投诉:

Warning: Declaration of Application\Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Application\Sonata\PageBundle\Admin\MenuItemInterface $menu, $action, ?Application\Sonata\PageBundle\Admin\AdminInterface $childAdmin = NULL) should be compatible with Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Knp\Menu\ItemInterface $menu, $action, ?Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL) in . (which is being imported from "/usr/src/app/app/config/routing.yml"). Make sure there is a loader supporting the "sonata_admin" type.

坦率地说,这比我容易理解的要多一些。 是否有一种简单的方法可以从我的供应商文件夹中覆盖现有的 configureFormFields() 方法?

====

编辑 #1:删除类型提示(作为一项长期策略是不明智的,但对调试很有用)将一个警告替换为另一个警告。然后我收到此警告文本:

Warning: Declaration of Application\Sonata\PageBundle\Admin\PageAdmin::configureTabMenu($menu, $action, $childAdmin = NULL) should be compatible with Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Knp\Menu\ItemInterface $menu, $action, ?Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL) in . (which is being imported from "/usr/src/app/app/config/routing.yml"). Make sure there is a loader supporting the "sonata_admin" type.

====

编辑 #2:将方法签名更改为 Knp\Menu\ItemInterface $menu, $action, Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL 给我这个:

Warning: Declaration of Application\Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Application\Sonata\PageBundle\Admin\Knp\Menu\ItemInterface $menu, $action, ?Application\Sonata\PageBundle\Admin\Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL) should be compatible with Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Knp\Menu\ItemInterface $menu, $action, ?Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL) in . (which is being imported from "/usr/src/app/app/config/routing.yml"). Make sure there is a loader supporting the "sonata_admin" type.

让我们让它更具可读性

Warning: Declaration of

Application\Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Application\Sonata\PageBundle\Admin\MenuItemInterface $menu, $action, ?Application\Sonata\PageBundle\Admin\AdminInterface $childAdmin = NULL)

should be compatible with

Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Knp\Menu\ItemInterface $menu, $action, ?Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL).

您只需更改它,使它们成为相同类型的提示。

public function configureTabMenu(Knp\Menu\ItemInterface $menu, $action, Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL){


}

假设这是您编写的代码,正如我所说我不是 Symphony 用户,但 PHP 是 PHP。

原来我漏掉了两个use语句。我从 class 复制了这些,我从以下克隆:

use Sonata\AdminBundle\Admin\AdminInterface;
use Knp\Menu\ItemInterface as MenuItemInterface;

...一切正常。