[英]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
所以保持名稱相同只是按照正常情況覆蓋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.