有没有一种方法可以在PHP中扩展trait?

103
我想利用现有的trait的功能,并在其基础上创建自己的trait,以便稍后将其应用于类。
我想扩展Laravel SoftDeletes trait,创建SaveWithHistory函数,它将记录的副本作为已删除的记录。 我还想使用record_made_by_user_id字段扩展它。

2
https://dev59.com/oGkw5IYBdhLWcg3wNX33#37687295 是一个很好的答案。 - Ryan
2个回答

182

有的,你只需要像这样定义新的特性:

trait MySoftDeletes 
{
    use SoftDeletes {
        SoftDeletes::saveWithHistory as parentSaveWithHistory;
    }

    public function saveWithHistory() {
        $this->parentSaveWithHistory();

        //your implementation
    }
}

仅供参考,对于搜索者,这里有更多的信息: https://www.php.net/manual/en/language.namespaces.importing.php - That Realty Programmer Guy
在这种情况下,您可能会发现以下资源有帮助:https://dev59.com/jFkS5IYBdhLWcg3wdmnC - J. D.
https://dev59.com/oGkw5IYBdhLWcg3wNX33#37687295 展示了扩展特质的另一个例子。 - Ryan

13

我有不同的方法。ParentSaveWithHistory 仍然是该特性中适用的方法,因此至少应该定义为私有。

trait MySoftDeletes
{
    use SoftDeletes {
        saveWithHistory as private parentSaveWithHistory; 
    }

    public function saveWithHistory()
    {
        $this->parentSaveWithHistory();
    }
}

还要考虑Trait中的“重写”方法:

use SoftDeletes, MySoftDeletes {
    MySoftDeletes::saveWithHistory insteadof SoftDeletes;
}

这段代码使用了MySoftDeletes中的saveWithHistory方法,即使该方法在SoftDeletes中也存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接