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
据我所知,classRegularAdmin
覆盖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,这是因为在本例中,引擎基于继承或接口强制签名;如果将相同的方法名放在单个类定义中,则会看到不同的错误。