Php 方法签名相同时接口不兼容

Php 方法签名相同时接口不兼容,php,Php,问题是: interface iSuperAdmin { public function getCount(); } class SuperAdmin implements iSuperAdmin { public function getCount() { return 1; } } interface iRegularAdmin { public function getCount($count); } class Regu

问题是:

interface iSuperAdmin
{
    public function getCount();
}


class SuperAdmin implements iSuperAdmin
{
    public function getCount()
    {
        return 1;
    }
}


interface iRegularAdmin
{
    public function getCount($count);
}


class RegularAdmin extends SuperAdmin implements iRegularAdmin
{
    public function getCount($count)
    {
        //more code here
        return $count;
    }
}


$regular = new RegularAdmin();

print $regular->getCount(3);
以下是错误:

RegularAdmin::getCount()的致命错误声明必须与行号上的iSuperAdmin::getCount()的声明兼容。

为什么php会抛出这样的错误


regularadin
不实现
iSuperAdmin
,它只是继承自
SuperAdmin

据我所知,class
RegularAdmin
覆盖
getCount
来自
SuperAdmin
类,从而正确实现
iRegularAdmin
接口

接口是否可以通过类继承进行继承? 任何解释都将不胜感激

已更新

如果我在
regularadin
上注释掉了
getCount

  .
  .
  .

class RegularAdmin extends SuperAdmin implements iRegularAdmin
{
    /*
    public function getCount($count)
    {   //more code
        return $count;
    }*/
}


$regular = new RegularAdmin();

print $regular->getCount(3);
php将抛出以下错误:

SuperAdmin::getCount()的致命错误声明必须与行号上的iRegularAdmin::getCount()的致命错误声明兼容。

类RegularAdmin扩展SuperAdmin是否实现了iRegularAdmin声明,是否执行了
SuperAdmin::getCount()
实现了
iRegularAdmin
接口并忽略
iSuperAdmin
接口


这真的很奇怪

regularadin
隐式实现了
iSuperAdmin
,而它是从实现
iSuperAdmin
的类继承的

注:

实现接口的类必须使用完全相同的方法 接口中定义的签名。不这样做将导致 在一个致命的错误中


iSuperAdmin的接口适用于扩展实现它的类的任何东西。由于PHP不支持函数重载,因此使用这两个函数签名会产生冲突:

getCount()       // from: SuperAdmin <- iSuperAdmin
getCount($count) // from: iRegularAdmin

对签出
var\u dump($iSuperAdmin的常规实例)(删除之前冲突的方法)。可能在文档中没有提到它,因为这是一件显而易见的事情。实际上它根本不明显,如果它是隐式继承的,那么显式实现
实现iRegularAdmin
?类可以实现任意数量的接口。所以
regularadin
实现了
iSuperAdmin
iRegularAdmin
。嗯,doc never-Night接口可以通过父类继承。有趣的是,您有两个变量来解决您的问题:
getCount($count=null)iSuperAdmin
getRegularCount($count)
中的
iRegularAdmin
。PHP根本不支持函数重载,正如您所看到的,无法更改子类中的函数签名(覆盖),它是在接口中定义的。该类实现了相同的方法签名,您是否阅读了代码?child类实现了错误的接口Same?真正地getCount()和getCount($count)?为什么要检查iSuperAdmin接口而不是iRegularAdmin接口?你能解释一下原因吗?嗯,它检查了两个接口——iSuperAdmin和iRegularAdmin,我想你可以看到。同样,see docs page-class无法实现两个指定了同名方法的接口,因为这会导致歧义。get count方法让我想起
函数RandomNumber(){return 4;}
是否尝试实现某种类型的重写?正如您希望$regular->getCount(3)如何访问相同名称的嵌入式函数一样?@DarylGill是的,我尝试实现某种类型的重写。这个示例非常愚蠢,但它说明了我面临的问题,因为延迟,重写函数在PHP中目前是不可能的,另一方面,实现用户定义的覆盖是可能的,只需要一个半复杂的结构。让我看看我是否能找到一个我之前发布的例子。它会让你对如何实现重写有一个非常粗略的了解超越是一件事,请参阅更新部分..当我实现RegularAdmin::getCount时,它的行为非常奇怪,它会与iSuperAdmin冲突,因为php不支持方法重载正确..让我困惑的是,php抛出的
错误
。以下是错误
致命错误:RegularAdmin::getCount()的声明必须与iSuperAdmin::getCount()兼容。
。抛出类似于
duhh,你有重复的方法名
@slier,这是因为在本例中,引擎基于继承或接口强制签名;如果将相同的方法名放在单个类定义中,则会看到不同的错误。