我有一个带有受保护方法的基类,一个使该方法公开的特性以及一个需要该方法为public的接口。简化的例子就是:
<?php
class b
{
protected function method() {echo 'base';}
}
trait t
{
public function method()
{
parent::method();
}
}
interface e
{
public function method();
}
class c extends b implements e
{
use t;
}
$c = new c();
$c->method();
这给了我一个致命的错误:
Fatal error: Access level to b::method() must be public (as in class e)
(它说的是类而不是界面e,但无论如何)。
我试图明确use t {method as public;}
,但没有区别。
如果我从c类注释掉implements e
位,我确实会在控制台上看到“base”。
我的PHP版本是5.5.9-1ubuntu4.11。
答案 0 :(得分:2)
Traits具有高优先级并且Trait方法覆盖继承方法。但是在你的例子中忘掉Trait。此错误全部归因于interface e
和class b
。当您使用界面时,您正在定义与界面的合同。 All methods declared in an interface must be public; this is the nature of an interface.
- 正如PHP文档所述,class b
中的受保护函数方法()正在破坏合同。