PHP实现一个trait,覆盖并调用其父trait

4

我正在使用Laravel 5.3版本。Model.php文件中有以下函数:

public function forceDelete()
{
    return $this->delete();
}

但是,我将使用 softDeletes 特性来实现它,该特性具有以下功能:

public function forceDelete()
{
    $this->forceDeleting = true;

    $deleted = $this->delete();

    $this->forceDeleting = false;

    return $deleted;
}

但是,我正在使用以下代码覆盖该函数:

public function forceDelete()
{
    echo "deleting";
    return parent::forceDelete();
}

在最后一个覆盖方法中,当我调用parent::forceDelete()的那一行时,它会调用model.php中的版本而不是softDeletes.php中的版本。我该如何使它调用softDeletes中的版本?这是否可能?

父类在哪里? - Rax Weber
嗯,最顶层的父类在model.php中,trait从softDeletes.php实现,我在一个继承model.php但实现softDeletes.php的类中进行了覆盖。当我调用parent::forceDelete()时,它会从model.php中调用,但我想从softDeletes.php中调用。 - sigmaxf
简单的解决方案就是给它起一个不同的名字。就我个人而言,我不是特别喜欢traits。在我看来,这通常是设计不良的标志。我曾尝试使用它们,但我从来没有找到一个真正需要它们的有效理由。我想,如果 Laravel 强制你使用它们,那么...... 从原子层面上讲,在一个trait内部调用另一个方法时,如果你无法保证 $this 实际存在,那么这是不好的。 - ArtisticPhoenix
这是一个Laravel设计,我可以重命名它,但我不想破坏设计... 这将为更新设置错误。 - sigmaxf
1个回答

5
最佳选择是在类的 use 语句中给特征方法命名,格式如下:
class SomeClass extends Model
{
    use SomeTrait {
       forceDelete as traitForceDelete;
    }

    public function forceDelete()
    {
        return $this->traitForceDelete();
    }
}

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