PHP 特征公开方法和接口(interface)

标签 php interface traits

我有一个带有 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 eclass b造成的。当您使用接口(interface)时,您就是在与接口(interface)定义契约。 接口(interface)中声明的所有方法都必须是公共(public)的;这就是接口(interface)的本质。 - 正如 PHP 文档所说,在 class b 中使用 protected function method() 你就违反了契约。

关于PHP 特征公开方法和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31877844/

相关文章:

php - 如何添加选择下拉列表并自动填充它

php - 无法在 CentOS 上安装 php 5.x, `remi-php56.repo` 中的错误

JAVA类实现和扩展问题

Java继承问题

c# - 如何使用反射来查找实现特定接口(interface)的属性?

generics - 如何避免将具体结构更改为通用结构所产生的链式 react ?

php - 在 PHP 制作的 HTML 表中按字母顺序对 SQL 数据进行排序

scala - 在 Traits 中初始化值

vector - 如何为向量的迭代器元素添加 Into 的类型注释?

php - X Time Ago 在 PHP 中