gpt4 book ai didi

php - 父类中 Trait 的别名方法

转载 作者:可可西里 更新时间:2023-11-01 01:13:32 25 4
gpt4 key购买 nike

我想知道这在 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()到父类。父类也是外部库的一部分,所以我不能直接修改源代码。

我实际用例中的 Child 类也依赖于 Parent 类的 protected 属性,因此我相当确定我需要保留继承。

这实际上可能吗,还是我只需要处理它,并在有问题的 Child 类上使用不同的方法名称?

最佳答案

如果您只想覆盖它,您在问题中得到的内容应该可以正常工作。根据 the manual :

The precedence order is that members from the current class override Trait methods, which in turn override inherited methods.

如果需要在子类中提供别名,那么可以在子类中重新使用 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 的别名方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46428931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com