【问题标题】:Chaining same method in multiple stacked traits在多个堆叠特征中链接相同的方法
【发布时间】:2018-11-17 09:11:40
【问题描述】:

我正在尝试从两个单独的特征中运行两个函数,这些特征将应用于一个类中,但依次将一个添加到另一个上。一个简单的例子如下所示

trait UserLevel{
    public function get(){
        echo 'World';
    }
}

trait SpecialUser{
    use UserLevel {
        UserLevel::get as userGet;
    }

     public function get(){

         echo 'Hello ';
         $this->userGet();
     }
}

Class GetUser{
    use UserLevel, SpecialUser;
}

$user = new GetUser;
$user->get(); 

我在这个问题上的所有谷歌搜索都只是展示了如何使用insteadof来覆盖另一个。

编辑:

此问题与引用的问题不重复。在运行具有规定更改的代码时,我得到了

致命错误:尚未应用特征方法get,因为有 在第 20 行的 /in/hg9ok 中与 GetUser 上的其他 trait 方法发生冲突

进程以代码 255 退出。

谢谢

【问题讨论】:

标签: php multiple-inheritance traits


【解决方案1】:

从根本上说,您无法实现您所描述的。技术原因是,如果您尝试使用具有相同方法名称的多个特征(请参阅documentation 的“冲突解决”部分)并且您无法从内部有选择地访问方法,则会出现致命错误一个特质(即UserLevel::get),但实际上这要么是对特质的误解,要么是对特质的滥用。

特征用于功能的水平组合,而您的示例中表明情况并非如此的关键部分是“SpecialUser”特征。如果这确实是一个特殊用户,那么为什么它不是具有您描述的功能而不是特征的“用户”的子类?

这是一个关于您在这里尝试实现什么的问题 - 不是从代码的角度,而是更全面地 - 并将 OOP 应用于此,而不是这里似乎正在发生的事情,这是相反的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多