【问题标题】:Alias method from Trait in Parent Class父类中特征的别名方法
【发布时间】:2017-09-26 22:36:25
【问题描述】:

我想知道这在 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 类的受保护属性,因此我相当确定我需要保留继承。

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

【问题讨论】:

  • 你试过了吗?它应该可以正常工作,只需覆盖 trait 方法。
  • 我很确定你需要在父类而不是子类中做别名。除非您只想覆盖子类中的 someMethod 实现。
  • 对于Trait,手册上写得很清楚,优先顺序是当前类中的成员重写Trait方法,然后再重写继承的方法。

标签: php inheritance traits


【解决方案1】:

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

优先顺序是当前类中的成员覆盖 Trait 方法,而 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

【讨论】:

  • 谢谢!是的,我确实有一个复杂的继承树。这是同一个词的情况意味着两种不同的东西,我什至不使用父版本的方法(所以我基​​本上只是完全改变它)。
【解决方案2】:

我昨天用下面的代码测试了这个:-)

<?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

【讨论】:

  • 您正在从类本身的特征中重写方法。我有一个父/子关系,该特征应用于父级,我需要在子级中覆盖它。
  • 是的,很公平,仍然有可能,但class_uses() 会返回 false。 3v4l.org/Lde3B
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多