Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 父类中Trait的别名方法_Php_Inheritance_Traits - Fatal编程技术网

Php 父类中Trait的别名方法

Php 父类中Trait的别名方法,php,inheritance,traits,Php,Inheritance,Traits,我想知道这在PHP中是否可行: trait SomeTrait { public function someMethod() { /* ... */ } } class Parent { use SomeTrait; } class Child extends Parent { /* Do something to rename someMethod() to someOtherMethod() */ use someMethod as someOtherMe

我想知道这在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类是几个子类的父类(并且没有一个真正使用来自应用于父类的trait的
someMethod()
)。父类也是外部库的一部分,因此我无法直接修改源代码

实际用例中的子类也依赖于父类的受保护属性,因此我非常确定我需要保留继承


这实际上是可能的,还是我只需要处理它,并在所讨论的子类上使用不同的方法名?

我昨天用以下代码测试了这一点:-)

因此,保持名称不变只是按照正常情况覆盖


在这里查看它

如果您只想覆盖它,那么问题中的内容应该可以正常工作。根据:

优先顺序是当前类的成员重写Trait方法,Trait方法反过来重写继承的方法

如果需要在子类中提供别名,则可以重新使用子类中的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();
在骑过它之后。但是如果您有一个特别复杂的继承树,那么它可能会很有用


这里的完整示例:

您尝试过吗?它应该可以很好地工作,只需重写trait方法,我非常确定您需要在父类而不是子类中使用别名。除非您只想重写子类中的someMethod实现。对于Trait,手册中明确说明了优先顺序是当前类的成员重写Trait方法,而Trait方法反过来又重写继承的方法。谢谢!是的,我有一个复杂的继承树。这是一种情况,同一个单词意味着两件不同的事情,我甚至不使用父版本的方法(所以我基本上只是完全更改它)。您正在从类本身的特征重写方法。我有一个父/子关系,其中特征应用于父对象,我需要在子对象中重写它。是的,这很公平,仍然是可能的,但是
class\u uses()
将返回false。
use SomeTrait {
  someMethod as private someOtherMethod;
}
parent::someMethod();