使用 EasyExtends 时方法签名显然不匹配
Method signature apparently not matching while using EasyExtends
我正在开发一个使用 EasyExtends 扩展 Sonata 页面包的现有项目。该项目基于 Symfony 3.3.
在这个项目中已经存在一个 class 在命名空间 Application\Sonata\PageBundle\Admin
中称为 PageAdmin
扩展 BasePageAdmin.
它包含定义两个函数 -- getPageTypes
和 configureFormFields
.
当我尝试将函数 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;
...一切正常。
我正在开发一个使用 EasyExtends 扩展 Sonata 页面包的现有项目。该项目基于 Symfony 3.3.
在这个项目中已经存在一个 class 在命名空间 Application\Sonata\PageBundle\Admin
中称为 PageAdmin
扩展 BasePageAdmin.
它包含定义两个函数 -- getPageTypes
和 configureFormFields
.
当我尝试将函数 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;
...一切正常。