簡體   English   中英

父類中Trait的別名方法

[英]Alias method from Trait in Parent Class

我想知道這在PHP中是否可行:

trait SomeTrait
{
    public function someMethod() { /* ... */ }
}

class Parent
{
    use SomeTrait;
}

class Child extends Parent
{
    /* Do something to rename someMethod() to someOtherMethod() */
    use someMethod as someOtherMethod; // Example

    public function someMethod()
    {
        // Do something different than SomeTrait::someMethod()
    }
}

在我的實際用例中, Parent類是幾個子節點的父節點(並且它們都沒有實際使用來自應用於父類的特征的someMethod() .Parent類也是外部庫的一部分,所以我無法直接修改源代碼。

我的實際用例中的Child類也依賴於Parent類的受保護屬性,因此我非常確定我需要保留繼承。

這實際上是可行的,還是我只需要處理它,並在Child類中使用不同的方法名稱?

如果你只是想覆蓋它,你在問題中得到的應該可以正常工作。 根據手冊

優先順序是當前類的成員覆蓋Trait方法,后者又覆蓋繼承的方法。

如果需要在子類中提供別名,則可以在子類中use trait,使用as運算符在當前類中定義別名:

class Child extends Foo
{
  // This will re-import the trait into your child class, aliasing
  // any specified methods.
  use SomeTrait {
    someMethod as someOtherMethod;
  }

  public function someMethod() {
    $this->someOtherMethod();
  }
}

您還可以控制新別名的可見性,例如

use SomeTrait {
  someMethod as private someOtherMethod;
}

所有這一切,當你可以打電話時,我真的沒有看到這個的好處

parent::someMethod();

過度之后。 但是如果你有一個特別復雜的繼承樹可能會有用。

這里有完整的例子: https//eval.in/868453

我昨天用以下代碼測試了這個:-)

<?php

trait CanWhatever
{
    public function doStuff()
    {
        return 'result!';
    }
}

class X
{
    use CanWhatever;

    public function doStuff()
    {
        return 'overridden!';
    }
}

$x = new X();
echo $x->doStuff();
echo "\n\$x has ";
echo (class_uses($x, 'CanWhatever')) ? 'the trait' : 'no trait';

輸出是:

overridden! 
$x has the trait

所以保持名稱相同只是按照正常情況覆蓋。

在這里查看https://3v4l.org/Vin2H

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM