PHP特性暴露方法和接口

时间:2015-08-07 12:35:04

标签: php interface traits

我有一个带有受保护方法的基类,一个使该方法公开的特性以及一个需要该方法为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。

1 个答案:

答案 0 :(得分:2)

Traits具有高优先级并且Trait方法覆盖继承方法。但是在你的例子中忘掉Trait。此错误全部归因于interface eclass b。当您使用界面时,您正在定义与界面的合同。 All methods declared in an interface must be public; this is the nature of an interface. - 正如PHP文档所述,class b中的受保护函数方法()正在破坏合同。