我有一个带有 protected 方法的基类,一个使该方法成为公共(public)方法的特征,以及一个要求该方法为公共(public)方法的接口(interface)。归结起来的例子是这样的:
<?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 :
Fatal error: Access level to b::method() must be public (as in class e)
(它说的是类而不是接口(interface) e,但无论如何)。
我试图明确地使用 use t {method as public;}
但这没有什么区别。
如果我注释掉类 c 中的 implements e
位,我确实会在控制台上看到“base”。
我的PHP版本是5.5.9-1ubuntu4.11。
最佳答案
确实,Traits 具有高优先级,并且 Trait 方法会覆盖继承的方法。但忘记你的例子中的 Trait 。这个错误都是由于interface e
和class b
造成的。当您使用接口(interface)时,您就是在与接口(interface)定义契约。 接口(interface)中声明的所有方法都必须是公共(public)的;这就是接口(interface)的本质。
- 正如 PHP 文档所说,在 class b
中使用 protected function method() 你就违反了契约。
关于PHP 特征公开方法和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31877844/